我正在尝试从词典列表中获取字典,其中: 键-它是所有合并字典项的值; 值-某些项目中包含的项目名称列表。
我还需要获取所有角色的字典(作为键)和具有该角色的项的名称(作为值)。
示例数据yaml:
hostgroups:
- name: a-node
roles:
- aaa
- bbb
- ccc
- ddd
- eee
- name: b-node
roles:
- ccc
- ddd
- name: c-node
roles:
- ccc
- ddd
- zzz
- name: d-node
roles:
- ccc
- ddd
我想获取以下文件:
aaa:
a-node
bbb:
b-node
ccc:
a-node
b-node
c-node
d-node
ddd:
a-node
b-node
c-node
d-node
eee:
a-node
zzz:
c-node
在python上很容易,但是在ansible上却很困难。 该怎么做?
答案 0 :(得分:0)
这是您要查找的代码吗?
vars:
hostgroups:
...
role_groups: {}
tasks:
- set_fact:
role_list: "{{ hostgroups|json_query('[].roles')|flatten|unique }}"
- set_fact:
role_groups: "{{ role_groups|combine( { item: hostgroups|json_query(query) } ) }}"
vars:
query: "[?roles.contains(@, '{{ item }}')].name"
loop: "{{ role_list }}"
答案 1 :(得分:0)
感谢大家的答复,但我找到了解决方法:
- name: step 1
set_fact:
temp_1: "{{ temp_1|default([]) + [{'role': item.1, 'hostgroup': item.0.name }] }}"
with_subelements:
- "{{ hostgroups }}"
- roles
- name: Debug 2
check_mode: no
blockinfile:
dest: hosts
marker: "# {mark} Auto block {{ item[0] }}"
block: |
[{{ item[0]}}]
{% for i in item[1] %}
{{ i.hostgroup }}
{% endfor %}
with_items:
- "{{ temp_1 | groupby('role') | list }}"