1. 程式人生 > >Ansible playbook編寫之坑-----with_items

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自動化運維技術與最佳實踐》

,擷取程式碼片段如下(取自4.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