ansible--playbooks

playbooks翻譯成中文叫劇本,和saltstack裏面的state差很少,都是在管理端定義好的一條條的策略。git

playbooks和前面玩的命令行執行的有啥區別呢? 其實playbooks裏面真正幹活的,仍是一個個的模塊,不過命令行的那個比如單兵做戰,而playbooks是有組織有紀律的集團軍做戰。github

mark個ansible一個官方例子地址web

https://github.com/ansible/ansible-examplesshell

https://github.com/ansible/ansible-examples/blob/master/language_features/ansible_pull.ymlide


下面看一個簡單的例子:this

  1 ---spa

  2 - hosts: 192.168.137.130命令行

  3   remote_user: '`uservar`'翻譯

  4   vars:debug

  5     software:

  6       - httpd

  7       - ntpdate

  8   tasks:

  9     - name: run this command and ignore the result

 10       shell: hostname

 11       ignore_errors: True

 12       register: result

 13     - debug: msg='`result`.`stdout`'

 14 

 15     - name: install ntpdate and  httpd

 16       yum: name=`item` state=installed

 18       with_items:

 19        - '`software`'

 20       tags: init

 21 

 22     - name: guarantee and httpd are running

 23       service: name=httpd state=started

 25 

 26     - name: transfer httpd configure file to remote

 27       template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf

 28       notify:

 29         - restart httpd

 30       when: result.stdout == 'lvs02'

 31 

 32   handlers:

 33     - name: restart httpd

 34       service: name=httpd state=restarted


簡單描述一下,每一行是作什麼的?

第1行,起始標誌,寫不寫無所謂,官網寫了

第2行,定義這個play要做用的主機,多個主機或者多個組的話,用":"分開,也能夠用我們前面的那種正則的形式匹配主機。


第3行,定義了此play在remote端執行時,使用哪一個用戶執行。樓主這裏用一個變量表示,待會能夠在命令行輸入此變量


第4到7行,能夠在play裏面定義變量,顯然這個變量是局部的,只能在此play裏使用。


第8行,task起始標誌,能夠在裏面定義1個或多個task


第9行,爲task定義一個name,這樣咱們執行的時候,會很直觀的在終端上打印,不定義name也ok,執行的時候,ansible會默認打印一個action的提示,這樣的話,不利於咱們觀察task執行過程。


第10行,就是真正幹活的模塊了,shell和command模塊,後面的參數,直接寫就OK,而其餘模塊的參數,都要遵循key=value的形式,如第16行和23行。還有就是,ansible裏的模塊,好像命令行和playbooks裏面都是通用的,不像salt-stack裏面,命令行的模塊和state裏面模塊是徹底分離,不能混用的。


第11行,表示上面的這個模塊執行的結果,若是不爲0,不加ignore_errors話,出現錯誤,playbook就不執行了。 加上ignore_errors的話,出現錯誤,會忽略並繼續執行。  固然也能夠在shell,command模塊中, 使用   shell:  /bin/123 || /bin/true的形式。


第12行,register,把上一個模塊執行的結果,保留在result(名字能夠任意)這個變量裏面,result變量經常使用的有result.stdout,result.err,result.rc等屬性。這一特性,說明ansible可以保留前面task執行的結果,在後面的task裏面能夠利用這一結果。


第13行,debug,打印的意思。。。把result的stdout給打印出來。  debug後面要遵循,msg=''這種結構


17行,使用sudo,這個sudo只針對當前task有效,想要對全局有效的話,要放到hosts,remote_user等一列。


第18,19,20行,使用ansible內置的循環結構,循環變量用`item`表示,循環列表在with_items裏面。樓主,這裏用第5-7行定義的變量,來表示循環列表。


第20行,設置標籤,當playbooks執行的時候,將只執行tags所對應的task


27行,使用模板,傳送httpd.conf文件,也能夠用copy模塊傳送普通文件


28,29行和32-34行是配套使用的,handler至關於觸發器的,當咱們在28行notify以後,待整個tasks所有執行完畢,notify裏面的東西也就是"restart httpd",就會去32行handlers裏面,去匹配同一名字的handler,並執行匹配到的task。 handler主要用在服務的重啓,或者關機


看一下,這個playbooks的執行結果。

在命令行使用變量。使用-e參數,就OK了,'uservar=lixc'就是在web.yml裏面定義的romote_user

ansible]# ansible-playbook web.yml -e 'uservar=root'

wKiom1lcmY-AB330AACS2xWi1AM300.png-wh_50


執行20行init這個標籤對應的task

ansible]# ansible-playbook web.yml -e 'uservar=root' --tags init

wKioL1lcmouwzvwYAAA1T6EmW5g594.png-wh_50

本站公眾號
   歡迎關注本站公眾號,獲取更多信息