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檢測到遠端主機已經滿足了最終執行完的條件就不再執行命令。