#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. Подумайте о принятии ответа, если он решил ваш вопрос.