ansible playbook實踐(三)-yaml檔案寫法

weixin_34162629發表於2018-02-08

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

 

相關文章