Вложенные уровни ansible with_subelements

Я пытаюсь перебирать вложенные циклы, как в этом вопросе:

Ansible with_subelements

Однако мне нужно пройти еще один уровень. В комментарии (от января 2017 г.) говорится, что дополнительные уровни вложенности не поддерживаются. Так ли это до сих пор? Если нет, как я могу ссылаться на более глубокие уровни?

Мои данные:

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
3 048
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам не нужны name и prefix из корневого dict, вы можете уменьшить исходный список до простого списка зон:

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. Вторая задача такая же, но мы перебираем наш сгенерированный список.

Это работает отлично - имя и префикс нужны только для других задач. Большое спасибо!

Sam 11.04.2018 14:05

Другие вопросы по теме