[英]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.