ansible/jinja2如何从合并的dict列表中获取dict



我正试图从字典列表中获取一个字典,其中:key-它是所有合并字典项的值;value-包含在某个项目中的项目名称列表。

另一个单词我需要获得所有角色的字典(作为键(和具有该角色的项的名称(作为值(。

示例数据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上很难。如何做到这一点?

这就是您要查找的代码吗?

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  }}"

感谢大家的回复,但我找到了解决方案:

- 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  }}"

最新更新