ansible playbook实践-yaml文件写法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible playbook实践-yaml文件写法相关的知识,希望对你有一定的参考价值。

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[email protected] 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:

[[email protected] 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"

                ]

            }

        ]

    }

]

 

 

[[email protected] 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  

 

再执行一遍,观察其输出与第一遍的差别:

[[email protected] 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文件写法的主要内容,如果未能解决你的问题,请参考以下文章

学习ansible playbook之前先了解下YAML语法

学习ansible playbook之前先了解下YAML语法

Ansible--playbook基础

Ansible-playbook 学习

YAML基础语法-ansible使用ansible-playbook

YAML语法Ansible Playbook剧本 Ansible变量