Ansible playbook编写之坑-----with_items

注:本文基于CentOS 7.2系统编写,Ansible版本为ansible-2.4.2.0-2.el7.noarch

这篇文章应该是一篇格式纠正的文章,因为今天因为playbook的格式搞了大半天。

今天在使用copy模块时,需要拷贝多个文件,于是就理所当然的用with_items了。不用不知道,用了之后差点被搞崩,playbook采用的是YAML语法格式,缩进在层次控制上非常重要,一不小心就是各种报错。

偏偏我就是这么时运不齐,参看了两本书都是错误的,不得不吐槽现在的书的质量怎么这么差。

第一本是《Ansible权威指南》,截取片段代码如下(取自4.2章节):
Ansible playbook编写之坑-----with_items_第1张图片

第二本是看《Ansible自动化运维技术与最佳实践》,截取代码片段如下(取自4.3章节):
Ansible playbook编写之坑-----with_items_第2张图片

无一例外,按照这上面的两种方式编写结果都是错误的,不只是书的排版问题还是软件版本问题,反正我是被坑得略惨。

最终还是得求救官方文档,终得解脱。

2.4版本的官方文档为:https://docs.ansible.com/ansible/2.4/playbooks_loops.html
with_items正确的缩进格式如下:
Ansible playbook编写之坑-----with_items_第3张图片

根据官方文档给的格式,在将使用模块换为copy,就是下面的样子,


---
  - hosts: CentOS-7-4
    gather_facts: false
    tasks:
      - name: copy files
        copy:
          src: "{{ item.src }}"
          dest: "{{ item.dest }}"
        with_items:
          - { src: "/home/ansible/copy.yml", dest: "/home/copy.yml" }

也就是with_items要和模块名左对齐,在同一个层级。

如果单个文件的拷贝,copy也可以用下面的方式,

---
  - hosts: CentOS-7-4
    gather_facts: false
    tasks:
      - name: copy files
        copy: src=/home/ansible/copy.yml dest=/home/copy.yml 

此外,如果with_items使用的数据不是k/v型,只是多个变量,则可以使用下面的方式,


---
  - hosts: CentOS-7-4
    gather_facts: false
    tasks:
      - name: install or uninstall rpms
        yum: name="{{ item }}" state=absent
        with_items:
          - dos2unix
          - squid

在编辑完playbook后,可以先检查一下格式是否正确,再进行真正的执行。ansible提供了一下命令用于检测playbook语法,

ansible-playbook test.yml --syntax-check

参考资料:
1、https://docs.ansible.com/ansible/2.4/playbooks_loops.html

你可能感兴趣的:(Ansible)