Étant donné que mon_dict la pièce
vars:
my_dict:
key1: { "key1a": ["key1aa": "value1aa", "key1ab": "value1ab"]}
key2: { "key2a": ["key2aa": "value2aa", "key2ab": "value2ab"]}
tasks:
- set_fact:
my_list: "{{ my_list|default([]) + [{item.key: item.value}] }}"
loop: "{{ my_dict|dict2items }}"
- debug:
msg: "{{ my_list|to_json }}"
donne
msg: '[{"key2": {"key2a": [{"key2aa": "value2aa"}, {"key2ab": "value2ab"}]}},
{"key1": {"key1a": [{"key1aa": "value1aa"}, {"key1ab": "value1ab"}]}}]'
La sortie a été imprimée avec yaml
callback ( export ANSIBLE_STDOUT_CALLBACK=yaml
). Ensuite, la sortie a été divisée manuellement après le premier élément de la liste.
json_query
Il est également possible de créer la liste avec jmespath
c'est-à-dire json_query
. Par exemple, la tâche ci-dessous donne le même résultat
- set_fact:
my_list: "{{ my_dict|
dict2items|
json_query('[].[{key: key, value: value}]')|
map('items2dict')|
list }}"
to_nice_yaml
Il est plus facile de voir la structure des données lorsqu'elles sont imprimées avec le filtre to_nice_yaml
. Par exemple
- debug:
msg: "{{ my_list|to_nice_yaml }}"
donne
msg: |-
- key2:
key2a:
- key2aa: value2aa
- key2ab: value2ab
- key1:
key1a:
- key1aa: value1aa
- key1ab: value1ab
filtres_plugins
Il est également possible d'utiliser des Plugins de filtrage . Par exemple avec le plugin
$ cat filter_plugins/dict_utils.py
def dict2list(d):
l = []
for i in d:
h = {i:d[i]}
l.append(h)
return l
class FilterModule(object):
def filters(self):
return {
'dict2list': dict2list
}
la tâche ci-dessous donne le même résultat
- set_fact:
my_list: "{{ my_dict|dict2list }}"
Pour votre confort :