С учетом вложенного словаря
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"
}
]
Q: "Как преобразовать вложенный словарь в список с помощью json_query?"
A: Ни в 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(@)]') }}"