[英]ansible/jinja2 how to get dict from list of merged dicts
我正在尝试从词典列表中获取字典,其中:key-它是所有合并的词典项目的值; 值-某些项目中包含的项目名称列表。
换句话说,我需要获取所有角色的字典(作为键)和具有该角色的项的名称(作为值)。
数据示例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 }}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.