ansible-playbook接收物件陣列引數並實現對多個task整體迴圈

涅米涅米發表於2020-12-16

緣起

業務需要在ansible中進行迴圈操作,但是由於原playbook中tasks之間有順序關係,所以希望可以將多個task整體迴圈,但是網上找到的大部分playbook迴圈案例都是針對單個task迴圈。
一開始的思路是迴圈role,但是無法生效,機緣巧合看到了include_tasks,測試之後發現可以滿足需求,特此記錄一下。

原理

通過include_taskswith_itemstasks.yml檔案內的所有task進行整體迴圈,而不是在每個task上寫with_items

注:雖然我認為用roles更優雅,但經測試roles無法支援with_items,也無法將{{ item.* }}透傳到role內部。如果有大佬知道相關寫法歡迎交流~

相關檔案

目錄結構

在這裡插入圖片描述

hosts

192.168.111.11 ansible_ssh_port=[port] ansible_ssh_user=[username] ansible_ssh_pass=[password]

main.yml

---

- hosts: all
  gather_facts: no
  vars:
    diskParamList:
      - disk: /dev/sdb
        diskfullpath: /dev/sdb1
        fstype: ext4
        mountDir: /data

  tasks:
    - include_tasks: tasks.yml
      with_items: "{{ diskParamList }}"

tasks.yml

---

- name: tasks

  block:
    - name: haha
      debug:
        msg: "{{ item.fstype }} {{ item.diskfullpath }} {{ item.mountDir }}"

    - name: heihei
      debug:
        msg: "{{ item.disk }} - 11"

param.json

{
    "diskParamList":[
        {
            "disk":"1",
            "diskfullpath":"1",
            "fstype":"1",
            "mountDir":"1"
        },
        {
            "disk":"2",
            "diskfullpath":"2",
            "fstype":"2",
            "mountDir":"2"
        },
        {
            "disk":"3",
            "diskfullpath":"3",
            "fstype":"3",
            "mountDir":"3"
        }
    ]
}

執行

命令

ansible-playbook -i hosts main.yml -e "@param.json"

輸出

在這裡插入圖片描述
可以看到輸出中迴圈是以tasks檔案中的一組task(而不是單個task)為單位迴圈的。

相關文章