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'
執行20行init這個標籤對應的task
ansible]# ansible-playbook web.yml -e 'uservar=root' --tags init