Ansible with_subelements嵌套级别

时间:2018-04-11 09:58:08

标签: arrays list loops nested ansible

我正在尝试迭代嵌套循环,就像这个问题:

Ansible with_subelements

我需要更深入一点。那里的评论(日期为2017年1月)表明,不支持额外的嵌套级别。这仍然是这样吗?如果没有,我如何参考更深层次?

我的数据:

dns:
  - name: Something
    prefix: st
    zones:
      - zone: something.com
        records:
          - record: testing.something.com
            type: TXT
            value: '"somethingtest"'
            ttl: 60

  - name: Devthing
    prefix: dt
    zones:
      - zone: devthing.com
        records:
          - record: testing.devthing.com
            type: TXT
            value: '"devthingtest"'
            ttl: 60
      - zone: testthing.com
        records:
          - record: testing.testthing.com
            type: TXT
            value: '"testthingtest"'
            ttl: 60
          - record: thingy.testthing.com
            type: TXT
            value: '"testthingthingytest"'
            ttl: 60

我的任务:

- name: Create DNS records
  route53:
    state: present
    zone: "{{ item.0.zone }}"
    record: "{{ item.1.record }}"
    type: "{{ item.1.type }}"
    ttl: "{{ item.1.ttl }}"
    value:  "{{ item.1.value }}"
  with_subelements:
    - "{{ dns }}"
    - records

区域,用户和访问策略已成功创建,因为它们不需要更深层次(记录级别)。

1 个答案:

答案 0 :(得分:2)

如果您不需要来自root dict的nameprefix,则可以将原始列表缩减为简单的区域列表:

with_subelements:
  - "{{ dns | map(attribute='zones') | list | sum(start=[]) }}"
  - records

并且 - 没有 - 嵌套的子元素仍然不受支持。

如果需要父选项,

更新,则需要进行一些预处理:

- set_fact:
    zones_loop: >
      {{ zones_loop|d([])
        + [ {} | combine(item[0]) | combine(item[1]) ]
      }}
  with_subelements:
    - "{{ dns }}"
    - zones

- debug:
    msg: "{{ item }}"
  with_subelements:
    - "{{ zones_loop }}"
    - records

通过第一个任务,我们遍历每个zone并将父键附加/组合到它们,形成新的zones_loop列表。第二个任务是相同的,但我们遍历生成的列表。