Playbook

Playbook

1.Ansible Playbook与临时命令

​ 临时命令可以作为一次性命令对一组目标主机运行一项简单的任务。不过,若要真正发挥Ansible的力量,需要了解如何使用playbook以便轻松重复的方式对一组目标主机执行多项复杂的任务。

​ play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。

​ Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。

2.Ansible Playbook的格式化

​ 前面我们学习了临时命令模块,下面以一条命令做为案例来讲解下其在playbook中是如何编写的。

[root@centos8-1 ~]#  ansible all -m user -a "name=shenlongfei uid=2500 state=present"
192.168.100.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 2500,
    "home": "/home/shenlongfei",
    "name": "shenlongfei",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 2500
}

​ 上面我们是用user模块来实现对对面的用户创建,那么我们现在用ansible中的paylbook(剧本)来实现在受管主机上创建用户。

[root@centos8-1 node]# cat ahh.yml   //这是用playbook写的一个剧本, 意思是创建用户
---
- name: test1
  hosts: 192.168.100.147        //受管主机执行的IP地址
  tasks:     //任务
    - name: create test1 for user     //任务名,创建用户
      user:     //利用user模块
        name: test1   //用户名
        uid: 2400    //指定id,当然也可以不指定,让其默认
        state: present       //状态
[root@centos8-1 node]# 
[root@centos8-1 ansible]# ansible-playbook node/ahh.yml      //运行看是否报错,没有报错表示上面写的是正常的

PLAY [test1]    //测试*******************************************************************

TASK [Gathering Facts]      //获取对面的信息    *********************************************************
ok: [192.168.100.147]

TASK [create test1 for user]   //改变了这个任务 ***************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************
192.168.100.147            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@centos8-1 ansible]# 

[root@localhost ~]# id test1     //查看发现受管主机已经创建用户test1
uid=2400(test1) gid=2400(test1) 组=2400(test1)
[root@localhost ~]# 

​ Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

  • 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
  • 如果项目属于其他项目的子项,其缩进量必须大于父项

只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。

Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。

在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。例如,YAML列表可能显示如下:

[root@centos8-1 node]# cat ahh.yml 
---
- name: test1     //也就是我们开头一行必须加-
  hosts: 192.168.100.147
  tasks:
    - name: create test1 for user  //这里也是需要加-
      user:
        name: test1
        uid: 2400
        state: present

​ Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。以下示例显示了具有三个键的YAML代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值,我们在这里为受管主机安装一个vsftpd服务,并且设置开机启动。

[root@centos8-1 node]# cat vsftpd.yml       //也就是说他可以一个剧本里面包含三个任务
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
     
[root@centos8-1 node]# 
[root@centos8-1 ansible]# ansible-playbook node/vsftpd.yml     //执行结果没有报错,并且对方已经下载vsftpd,并重启

PLAY [192.168.100.147] *********************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]

TASK [vsftpd] ******************************************************************************************************
changed: [192.168.100.147]

TASK [service vsftpd] **********************************************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************************************************
192.168.100.147            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@localhost ~]# rpm -qa |grep vsftpd     //查看发现受管主机安装了vsftpd,并且已经设置开机自启动
vsftpd-3.0.3-34.el8.x86_64
[root@localhost ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftp>
   Active: active (running) since Mon 2021-07-19>
  Process: 825724 ExecStart=/usr/sbin/vsftpd /et>

它里面可以包含三个任务,那么我就写三个任务

[root@centos8-1 shunzichishi]# head -20 vsftpd.conf 
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES     //我们将受管主机的vsftpd.conf复制过来,然后将这行的NO改成yes。
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
[root@centos8-1 shunzichishi]# 
[root@centos8-1 node]# cat vsftpd.yml 
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
      - name: config vsftpd
        copy:         //这里用copy模块,
          src: shunzichishi/vsftpd.conf     //原路径
          dest: /etc/vsftpd/vsftpd.conf     //目标路径
[root@centos8-1 node]#  
[root@centos8-1 ansible]# ansible-playbook node/vsftpd.yml     //执行剧本,没有报错, 此时受管主机中vsftpd.conf文件应该也从NO变成YES

PLAY [192.168.100.147] *********************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]

TASK [vsftpd] ******************************************************************************************************
ok: [192.168.100.147]

TASK [service vsftpd] **********************************************************************************************
ok: [192.168.100.147]

TASK [config vsftpd] ***********************************************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************************************************
192.168.100.147            : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[root@localhost vsftpd]# head -20 vsftpd.conf       //我们在受管主机查看
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES      //此时这里已经变成YES
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,

​ 作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。

还以上面创建用户的play为例,play中唯一任务有两个键:

  • name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。

  • user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。

    下面再来看一个含有多项任务的tasks属性案例:

[root@centos8-1 node]# cat vsftpd.yml      //我们可以发现三个任务是对齐的
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
      - name: config vsftpd
        copy:
          src: shunzichishi/vsftpd.conf
          dest: /etc/vsftpd/vsftpd.conf  
[root@centos8-1 node]# 

​ playbook中play和任务列出的顺序很重要,因为Ansible会按照相同的顺序运行它们

3.运行playbook

​ absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数传递。

[root@centos8-1 node]# ansible-playbook node/vsftpd.yml 
//我们在执行的时候, 文件在哪里,我们就要去指定它的路径,然后进行执行

​ 在运行playbook时,将生成输出来显示所执行的play和任务。输出中也会报告执行的每一项任务的结果。

以下示例中显示了一个简单的playbook的内容,后面是运行它的结果。

[root@centos8-1 node]# cat vsftpd.yml 
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
      - name: config vsftpd
        copy:         //这里用copy模块,
          src: shunzichishi/vsftpd.conf     //原路径
          dest: /etc/vsftpd/vsftpd.conf     //目标路径
[root@centos8-1 node]#  
[root@centos8-1 ansible]# ansible-playbook node/vsftpd.yml     //执行剧本,没有报错, 此时受管主机中vsftpd.conf文件应该也从NO变成YES

PLAY [192.168.100.147] *********************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]

TASK [vsftpd] ******************************************************************************************************
ok: [192.168.100.147]

TASK [service vsftpd] **********************************************************************************************
ok: [192.168.100.147]

TASK [config vsftpd] ***********************************************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************************************************
192.168.100.147            : ok=4  //执行成功的  changed=1 //表示已经修改成功   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

​ 请注意,在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。

​ 通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。

4.提升输出的详细程度

ansible-playbook命令提供的默认输出不提供详细的任务执行信息。

ansible-playbook -v命令提供了额外的信息,总共有四个级别。

通俗一点就是-v越多,显示的信息也就月详细,日常中我们一般只使用-v

配置Playbook执行的输出详细程序

选项描述
-v显示任务结果
-vv任务结果和任务配置都会显示
-vvv包含关于与受管主机连接的信息
-vvvv增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本
[root@centos8-1 ansible]# ansible-playbook -v node/vsftpd.yml    //可以和杠对比,我们执行的结果是比刚刚详细一些的。
Using /etc/ansible/ansible.cfg as config file

PLAY [192.168.100.147] *********************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]

TASK [vsftpd] ******************************************************************************************************
ok: [192.168.100.147] => {"changed": false, "msg": "Nothing to do", "rc": 0, "results": []}

TASK [service vsftpd] **********************************************************************************************
ok: [192.168.100.147] => {"changed": false, "enabled": true, "name": "vsftpd", "state": "started", "status": {"Activ
此处内容省略。。。。。。

5.语法验证

​ 在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。

下例演示了一个playbook成功通过语法验证:

[root@centos8-1 node]# ansible-playbook --syntax-check vsftpd.yml    //这个是验证成功,表示写的剧本没有问题

playbook: vsftpd.yml
[root@centos8-1 node]# 

​ 语法验证失败时,将报告语法错误。输出中包含语法问题在playbook中的大致位置。

下例演示了一个playbook语法验证失败的情况:

[root@centos8-1 node]# ansible-playbook --syntax-check vsftpd.yml    //这样就表示验证错误
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)

Syntax Error while loading YAML.
  mapping values are not allowed in this context

The error appears to be in '/etc/ansible/node/vsftpd.yml': line 17, column 15, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

          src shunzichishi/vsftpd.conf
          dest: /etc/vsftpd/vsftpd.conf    //并且错误的大概位置已经给你指出来了,注意的是它不是指定的精确位置, 是一个大概位置,
              ^ here
[root@centos8-1 node]# 

6.执行空运下

​ 可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。

​ 下例演示了一个playbook的空运行,它包含单项任务,可确保在受管主机上安装了最新版本的httpd软件包。注意该空运行报告此任务会对受管主机产生的更改。

[root@centos8-1 ansible]# ansible-playbook -C node/vsftpd.yml

PLAY [192.168.100.147] *********************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.100.147]

TASK [vsftpd] ******************************************************************************************************
ok: [192.168.100.147]

TASK [service vsftpd] **********************************************************************************************
ok: [192.168.100.147]

TASK [config vsftpd] ***********************************************************************************************
ok: [192.168.100.147]

PLAY RECAP *********************************************************************************************************
192.168.100.147            : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@centos8-1 ansible]# 

7.缩写多个play

​ Playbook是一个YAML文件,含有由一个或多个play组成的列表。记住一个play按顺序列出了要对清单中的选定主机执行的任务。因此,如果一个playbook中有多个play,每个play可以将其任务应用到单独的一组主机。

​ 在编排可能涉及对不同主机执行不同任务的复杂部署时,这会大有帮助。我们可以这样进行编写:对一组主机运行一个play,完成后再对另一组主机运行另一个play。

​ 缩写包含多个play的playbook非常简单。Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项。

​ 以下示例显示了含有两个play的简单playbook。第一个play针对172.16.100.148运行,第二个play则针对172.16.100.147运行。

- name: first play
  hosts: 172.16.100.147        //一台主机一个任务
  tasks:
    - name: first task
      yum:
        name: httpd
        status: present

    - name: second task
      service:
        name: httpd
        enabled: true

- name: second play
  hosts: 172.16.100.148       //第二台主机上的任务
  tasks:
    - name: first task
      service:
        name: mariadb
        enabled: true

8.play中的远程用户和特权升级

​ Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。

9.用户属性

​ playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。

​ 如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。

# (/usr/bin/ansible will use current user as default)
remote_user = root      //可以修改这里

# logging is off by default unless this path is defined

10.特权升级属性

​ Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。

​ 如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。

​ 此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。

[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

以下示例演示了如何在play中使用这些关键字:

[root@localhost ~]# cat /etc/hosts     //我们要给受管主机hosts下面加上控制主机的ip和名字,
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.147  centos8-1       //刚刚试验过。加的名字和ip已经过来
[root@localhost ~]# 
[root@centos8-1 node]# cat test.yml      //我们play文件这样写。
---
- hosts: 192.168.100.147
  remote_user: a
  tasks:
    - name: test
      lineinfile:
        path: /etc/hosts
        line: "192.168.100.147  centos8-1"
        state: present
[root@centos8-1 node]# 
[root@centos8-1 ansible]# ansible-playbook node/test.yml     //执行就能得到上面的结果,在/etc/hosts下面加上控制主机的ip地址和名字

PLAY [192.168.100.147] *********************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.100.147]

TASK [test] ********************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************
192.168.100.147            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

11.模块文档

​ 对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明。文档还提供了实用的示例,演示各个模块的用法,以及任务中关键字的设置方法。

​ 前面我们用到过ansible-doc -l命令。这将显示模块名称列表以及其功能的概要。

root@centos8-1 ansible]# ansible-doc -l     
a10_server                                      >
a10_server_axapi3                               >
a10_service_group                               >
a10_virtual_server                              >
aci_aaa_user                                    >
aci_aaa_user_certificate                        >
aci_access_port_block_to_access_port            >
aci_access_port_to_interface_policy_leaf_profile>
aci_access_sub_port_block_to_access_port        >
aci_aep                                         >
aci_aep_to_domain                               >
aci_ap                                          >
aci_bd                                          >
aci_bd_subnet                                   >
内容省略。。。。。。

​ 使用ansible-doc [module name]命令来显示模块的详细文档。与Ansible官网一样,该命令提供模块功能的概要、其不同选项的详细信息,以及示例。

[root@centos8-1 ansible]# ansible-doc yum
> YUM    (/usr/lib/python3.6/site-packages/ansib>

        Installs, upgrade, downgrades, removes, >
        groups with the `yum' package manager. T>
        on Python 2. If you require Python 3 sup>
        module.

  * This module is maintained by The Ansible Cor>
  * note: This module has a corresponding action>

OPTIONS (= is mandatory):
内容省略。。。。。。

​ ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook在使用特定模块的示范。此输出可以作为起步模板,包含在实施该模块以执行任务的playbook中。输出中包含的注释,提醒管理员各个选项的用法。下例演示了yum模块的这种输出:

[root@centos8-1 ansible]# ansible-doc -s yum
- name: Manages packages with the `yum' package >
  yum:
      allow_downgrade:       # Specify if the na>
                               allowed to
                               downgrade a maybe
                               already installed
                               higher version of
                               that package.
                               Note that setting
                               allow_downgrade=T
                               rue can make this
                               module behave in
                               a non-idempotent
                               way. The task
                               could end up with
                               a set of packages
                               that does not
                               match the
此处省略。。。。。。

​ 使用ansible-doc命令可以查找和了解如何使用模块。尽管command、shell和raw模块的用法可能看似简单,但在可能时,应尽量避免在playbook中使用它们因为它们可以取胜任意命令,因此使用这些模块时很容易写出非幂等的playbook。

​ 例如,以下使用shell模块的任务为非幂等。每次运行play时,它都会重写/etc/resolv.conf,即使它已经包含了行nameserver 192.168.100.147

- name: Non-idepotent approach with shell module
  shell: echo "nameserver 192.168.100.147" > /etc/resolv.conf

​ 可以通过多种方式编写以幂等方式使用shell模块的任务,而且有时候进行这些更改并使用shell是最佳的做法。但更快的方案或许是使用ansible-doc发现copy模块,再使用它获得所需的效果。

在以下示例中,如果/etc/resolv.conf文件已包含正确的内容,则不会重写该文件:

- name: Idempotent approach with copy module
  copy:
    dest: /etc/resolv.conf
    content: "nameserver 192.168.100.147\n"

​ copy模块可以测试来了解是否达到了需要的状态,如果已达到,则不进行任何更改。shell模块容许非常大的灵活性,但需要格外小心,从而确保它以幂等方式运行。

​ 幂等的playbook可以重复运行,确保系统处于特定的状态,而不会破坏状态已经正确的系统。

12.playbook语法变化

YAML注释

​ 注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。

localhost  192.168.100.147   #spfhsfhsfj[sjpojsp    //不要在注释行前面写入内容, 只能在注释行后面写内容

YAML字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。

this is a string

'this is another string'

"this is yet another a string"

​ 编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。

管道符操作

[root@centos8-1 node]# vim test.yml 
[root@centos8-1 node]# cat test.yml     //首先我们得写好剧本,然后执行看结果
---
- hosts: 192.168.100.147
  remote_user: a
  become: yes
  tasks:
    - name: test
      lineinfile:
        path: /etc/hosts
        line: |
          "192.168.100.147  centos8-1"
          "192.168.100.148  centos8-2"
          "192.168.100.149  centos8-3"
        state: present
[root@centos8-1 node]# 
[root@centos8-1 ansible]# ansible-playbook node/test.yml     //执行没有报错,此时对面得/etc/hosts/是有我们加得几条ip地址和名字得

PLAY [192.168.100.147] *********************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.100.147]

TASK [test] ********************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************
192.168.100.147            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@centos8-1 ansible]# 

​ 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

[root@centos8-1 node]# cat test.yml 
---
- hosts: 192.168.100.147
  remote_user: a
  become: yes
  tasks:
    - name: test
      lineinfile:
        path: /etc/hosts
        line: >    //改成大于符号
          "nameserver 192.168.100.148"
          "nameserver 192.168.100.149"
          "nameserver 192.168.100.150"
        state: present
[root@centos8-1 node]# 
[root@centos8-1 ansible]# ansible-playbook node/test.yml     //执行,效果就应该是所有ip地址和名字都在同一行上。

PLAY [192.168.100.147] *********************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.100.147]

TASK [test] ********************************************************************
changed: [192.168.100.147]

PLAY RECAP *********************************************************************
192.168.100.147            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

YAML字典

下面是一个简单的字典形式:

name: svcrole
svcservice: httpd
svcport: 80

字典也可以使用以大括号括起的内联块格式编写,如下所示:

{name: svcrole, svcservice: httpd, svcport: 80}

​ 大多数情况下应避免内联块格式,因为其可读性较低。不过,至少有一种情形中会较常使用它。当playbook中包含角色列表时,较常使用这种语法,从而更加容易区分play中包含的角色和传递给角色的变量。

YAML列表

最简单的列表如下:

hosts:
  - servera
  - serverb
  - serverc

列表也有以中括号括起的内联格式,如下所示:

hosts: [servera, serverb, serverc]

注:我们应该避免使用此语法,因为它通常更难阅读。

13.过时得“键=值”palybook简写

​ 某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。例如,你可能会看到这种语法:

[root@centos8-1 node]# cat vsftpd.yml     //通常我们是用这种方法去写。
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
      - name: config vsftpd
        copy:
          src: shunzichishi/vsftpd.conf
          dest: /etc/vsftpd/vsftpd.conf  
[root@centos8-1 node]# 

但是还有一种过时得:

tasks:
  - name: shorthand form
    service: name=httpd enabled=true state=started       //等于某一个值,虽没有错, 但不方便,很少人用

注:我们应该避免使用此语法,因为它通常更难阅读。

13.过时得“键=值”palybook简写

​ 某些playbook可能使用较旧的简写方法,通过将模块的键值对放在与模块名称相同的行上来定义任务。例如,你可能会看到这种语法:

但是还有一种过时得:

tasks:
  - name: shorthand form
    service: name=httpd enabled=true state=started       //等于某一个值,虽没有错, 但不方便,很少人用
[root@centos8-1 node]# cat vsftpd.yml     //通常我们是用这种方法去写。
---
  - hosts: 192.168.100.147
    tasks:
      - name: vsftpd
        yum:
          name: vsftpd
          state: latest

      - name: service vsftpd
        service:
          name: vsftpd
          state: started
          enabled: yes  
      - name: config vsftpd
        copy:
          src: shunzichishi/vsftpd.conf
          dest: /etc/vsftpd/vsftpd.conf  
[root@centos8-1 node]# 

​ 普通形式的行数较多,但更容易操作。任务的关键字垂直堆叠,更容易区分。阅读play时,眼睛直接向一扫视,左右运动较少。而且,普通语法是原生的YAML。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lfei5120

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值