Как создать al oop внутри al oop in ansible и экспортировать переменные? - PullRequest
0 голосов
/ 06 февраля 2020

Итак, у меня есть два словаря:

dict_1:
  - name: one
  - name: two

dict_2:
  - identifier: one
    type: typeA
  - identifier: two
    type: typeB

Мне нужно перебрать оба и "экспортировать" переменные в process.yml. Это то, что я делаю сейчас, но не работаю должным образом:

#main.yml

- name:
  include_tasks: process.yml
  loop: "{{ dict_1 | flatten }}"
  loop_control:
    loop_var: entity
      loop: "{{ dict_2 | selectattr('identifier', 'equalto', entity) | map(attribute='type') | flatten }}"
        loop_control:
          loop_var: type


#process.yml

- name: Print variables
  debug:
    msg: "{{ entity }}_{{ type }}"

То, что я хотел увидеть после этого, было:

one_typeA
two_typeB

Как можно Я получаю этот результат от l oop?

1 Ответ

1 голос
/ 06 февраля 2020

Я думаю, что ваше оригинальное решение близко, немного сложнее, чем нужно. Обратите внимание, что это решение предполагает, что не будет более одного элемента из dict2, который вы найдете с помощью значения из dict1, это просто порядок, который вы не можете предсказать.

- debug: msg="{{ item.name }}_{{ dict_2 | selectattr('identifier', 'equalto', item.name) | map(attribute='type') | list | join() }}"
  with_items: "{{ dict_1 }}"

Если вы МОЖЕТЕ контролировать порядок списков, это становится еще проще.

- debug: msg="{{ item.0.name }}_{{ item.1.type }}"
  with_together:
    - "{{ dict_1 }}"
    - "{{ dict_2 }}"

И если вы можете контролировать порядок и содержимое, и вы хотите иметь все возможные Комбинация двух списков, вы можете сделать это:

- debug: msg="{{ item.0.name }}_{{ item.1.type }}"
  with_cartesian:
    - "{{ dict_1 }}"
    - "{{ dict_2 }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...