给定嵌套字典
nested_dict:
system:
disk:
cmd: df -a
memory:
cmd: free
hw:
pci:
cmd: lspci
foo: bar
包含任务的文件
shell> cat item-to-list.yml
- set_fact:
mylist: "{{ mylist +
[{'group': outer_item.key, 'name': item.key}|
combine(item.value)] }}"
loop: "{{ outer_item.value|dict2items }}"
以及下面的任务
- set_fact:
mylist: []
- include_tasks: item-to-list.yml
loop: "{{ nested_dict|dict2items }}"
loop_control:
loop_var: outer_item
- debug:
var: mylist
给
"mylist": [
{
"cmd": "df -a",
"group": "system",
"name": "disk"
},
{
"cmd": "free",
"group": "system",
"name": "memory"
},
{
"cmd": "lspci",
"foo": "bar",
"group": "hw",
"name": "pci"
}
]
问:“如何使用 json_query 将嵌套字典转换为列表?”
答:在 Ansible 和 JMESPath 中,除了嵌套循环或自定义过滤器插件外,没有一种方法可以从“names”和“dictionaries_to_combine_with”(见下文)列表中组合请求的字典。恐怕 json_query 在这里是一条死胡同。
- debug:
msg:
- "group: {{ item.0 }}"
- "names: {{ item.1 }}"
- "dictionaries_to_combine_with {{ item.2 }}"
with_together:
- "{{ nested_dict.keys()|list }}"
- "{{ nested_dict|json_query('*.[keys(@), values(@)]') }}"