首页 > 解决方案 > 通过嵌套循环迭代

问题描述

packages.yml文件定义为:

---
- packages:
    - name: Some description 1,
      packageList:
        - package1,
        - package2,
        - package3

    - name: Some description 2,
      package: package4

第一项包含一个字段packageList,第二项没有它,只有package字段。

剧本:

---
- hosts: all
  become: yes
  vars_files:
    - packages.yml

仅当为项目定义时,如何遍历列表的所有packageList项目。packagespackageList

以下是我如何遍历包含package字段的项目:

- name: iteration
  debug:
    msg: "name: {{ item.package }}"
  when: item.package is defined
  with_items: "{{ packages }}"

标签: ansible

解决方案


正如@ceving 提到的,您可以使用default

---
- hosts: localhost
  connection: local

  vars_files:
  - packages.yml

  tasks:
  - name: iteration
    debug:
      msg: "name: {{ item.packageList | default([item.package]) }}"
    with_items: "{{ packages }}"

如果packageList存在,它将使用它,否则package放入一个单元素数组以匹配的形式packageList

PLAY [localhost] **********************************************************************************************

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

TASK [iteration] **********************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "name: [u'package1,', u'package2,', u'package3']"
}
ok: [localhost] => (item=None) => {
    "msg": "name: [u'package4']"
}

PLAY RECAP ****************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

推荐阅读