Ansible, использующий значения массива в качестве ключа для перебора словаря, содержащего несколько значений

#ansible #ansible-facts #ansible-template

#ansible #ansible-факты #ansible-шаблон

Вопрос:

Я пытаюсь создавать каталоги на основе того, к каким группам они принадлежат и что пользователь определяет в переменной.

 [web20int]
server1
server2

[web20ext]
server3

[app01dev]
server1


certdir:
    
  web20int:
    - intwiki
    - intblogs

  web20ext:
    - wiki
    - xblogs

  app01dev:
    - app01dev


---
  - name: Set App Name Key List
    set_fact:
      ckeys: "{{ certdir.keys()|list }}"

  - name: Get Group Names
    debug:
      msg: "{{ group_names }} "

  - name: Get Cert App Names
    debug:
      msg: item
    loop: "{{ ckeys }}"

  - name: Setting Union between Group Names and Cert App Names
    set_fact:
      union_key: "{{ ckeys | intersect(group_names) }}"

  - name: Result of union
    debug:
       var: union_key
 

Здесь я не понимаю, как выполнить вложенный цикл или использовать шаблоны jini2.
Я хочу перебрать массив union_key, а затем перебрать certdir
и получить список значений для помещения в другой массив

   - name: create cert directory for app
    file:
      path: "{{ item }}"
      state: directory
      owner: root
      group: root
      mode: 0755
    loop: "{{ <SOME ARRAY THAT CONTAINS THE DIRECTORY NAMES }}"
 

Например, server1 принадлежит группам:
[web20int]
[app01dev]

Поэтому я хочу, чтобы массив содержал: intwiki intblogs app01dev

Спасибо

Ответ №1:

Вы можете map extract фильтровать:

 union_key | map('extract', certdir)
 

Но это даст вам список списков, поэтому вам нужно применить flatten фильтр:

 loop: "{{ union_key | map('extract', certdir) | flatten }}"
 

(Вам также может потребоваться использовать list фильтр, если flatten он выдает итерацию вместо списка)

Кстати, имя переменной и имя задачи говорят о «объединении», но вы выполняете «пересечение».

Комментарии:

1. Спасибо, это сработало как шарм. Спасибо, я думаю, что сначала я пытался объединить, а затем переключился на intersect.

2. Также мне не нужно было использовать фильтр списка, то, что вы написали, сделало свое дело

3. Подумайте о принятии ответа, если он решил ваш вопрос.