Ansible 使用数组的值作为键来循环遍历包含多个值的字典
Ansible using values of an array as a key to loop through a dictionary that contains multiple values
我正在尝试根据目录所属的组以及用户在变量中定义的内容来创建目录。
[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
谢谢
union_key | map('extract', certdir)
但这会给你一个列表列表,所以你需要应用 flatten
过滤器:
loop: "{{ union_key | map('extract', certdir) | flatten }}"
(如果 flatten
给出可迭代对象而不是列表,您可能还需要使用 list
过滤器)
顺便说一句,变量名和任务名说的是'union',但是你做的是'intersection'.
我正在尝试根据目录所属的组以及用户在变量中定义的内容来创建目录。
[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
谢谢
union_key | map('extract', certdir)
但这会给你一个列表列表,所以你需要应用 flatten
过滤器:
loop: "{{ union_key | map('extract', certdir) | flatten }}"
(如果 flatten
给出可迭代对象而不是列表,您可能还需要使用 list
过滤器)
顺便说一句,变量名和任务名说的是'union',但是你做的是'intersection'.