1. 程式人生 > >ansible playbook實踐(三)-yaml文件寫法

ansible playbook實踐(三)-yaml文件寫法

root local wheel 單個 pin sent roo cap 關系

playbook基於YAML語法來編寫,基本語法規則如下:

1.大小寫敏感

2.使用縮進表示層級關系

3.縮進時不允許使用Tab鍵,只允許使用空格

4.縮進的空格數目不重要,只要相同層級的元素左側對齊即可

5. # 表示註釋,從這個字符一直到行尾,都會被解析器忽略。

6. 用---表示開頭

YAML 支持三種數據結構:

對象:鍵值對的集合,用冒號:作為鍵值分隔

數組:一組按次序排列的值,用減號-作為標識

純量:單個的、不可再分的值,如字符串,數值,日期等

例子:

---

- hosts: web

remote_user: root

tasks:

- name: ping test

ping: null

這個playbook表示去標識為web機的遠程主機上,用root用戶去執行名為ping test的任務,它使用ping模塊。其中ping test為自己定義的任務名,會在稍後的執行輸出中展示出來。

其對應的json結構為:

[

{

"hosts": "web",

"remote_user": "root",

"tasks": [

{

"name": "ping test",

"ping": null

}

]

}

]

運行:

root@localhost playbook]# ansible-playbook ping.yml

PLAY [web] ********************************************************************************

TASK [Gathering Facts] ********************************************************************

ok: [192.168.40.72]

ok: [192.168.40.73]

TASK [ping test] **************************************************************************

ok: [192.168.40.73]

ok: [192.168.40.72]

PLAY RECAP ********************************************************************************

192.168.40.72 : ok=2 changed=0 unreachable=0 failed=0

192.168.40.73 : ok=2 changed=0 unreachable=0 failed=0

來寫一個更實用的playbook:

[root@localhost playbook]# cat add_user.yml

---

- hosts: web

remote_user: root

gather_facts: true

tasks:

- name: Add users

user: name={{ item }} state=present groups=wheel

with_items:

- testuser1

- testuser2

它表示標識為web的遠程主機執行名為:Add users的任務,它使用user模塊,這裏面還用到了變量的用法,{{ item }},它最後會被值testuser1 和 testuser2 替換,總共添加兩個用戶。這個對應json結構如下:

[

{

"hosts": "web",

"remote_user": "root",

"gather_facts": true,

"tasks": [

{

"name": "Add users",

"user": "name={{ item }} state=present groups=wheel",

"with_items": [

"testuser1",

"testuser2"

]

}

]

}

]

[root@localhost playbook]# ansible-playbook add_user.yml

PLAY [web] ********************************************************************************

TASK [Gathering Facts] ********************************************************************

ok: [192.168.40.73]

ok: [192.168.40.72]

TASK [Add users] **************************************************************************

changed: [192.168.40.73] => (item=testuser1)

changed: [192.168.40.72] => (item=testuser1)

changed: [192.168.40.72] => (item=testuser2)

changed: [192.168.40.73] => (item=testuser2)

PLAY RECAP ********************************************************************************

192.168.40.72 : ok=2 changed=1 unreachable=0 failed=0

192.168.40.73 : ok=2 changed=1 unreachable=0 failed=0

再執行一遍,觀察其輸出與第一遍的差別:

[root@localhost playbook]# ansible-playbook add_user.yml

PLAY [web] ********************************************************************************

TASK [Gathering Facts] ********************************************************************

ok: [192.168.40.73]

ok: [192.168.40.72]

TASK [Add users] **************************************************************************

ok: [192.168.40.73] => (item=testuser1)

ok: [192.168.40.72] => (item=testuser1)

ok: [192.168.40.73] => (item=testuser2)

ok: [192.168.40.72] => (item=testuser2)

PLAY RECAP ********************************************************************************

192.168.40.72 : ok=2 changed=0 unreachable=0 failed=0

192.168.40.73 : ok=2 changed=0 unreachable=0 failed=0

其中第二次的changed=0。

ansible是很多模塊的執行是具有冪等性的,即ansible檢測到遠程主機已經滿足了最終執行完的條件就不再執行命令。

ansible playbook實踐(三)-yaml文件寫法