如何操作 Ansible 中的字典列表?
How to manipulate a list of dictionaries in Ansible?
有字典列表如下:
"test_list_of_dicts": [
{
"inner_dict":[
{"f1":"a","f2":"b"},
{"f1":"c","f2":"d"}
],
"id":"id1"
},
{
"inner_dict":[
{"f1":"e","f2":"f"},
{"f1":"g","f2":"h"}
],
"id":"id2"
}
]
我需要修改上面的结构并得到一个新的字典列表,如下所示:
"new_list_of_dicts": [
{"f1":"a","f2":"b","id":"id1"},
{"f1":"c","f2":"d","id":"id1"},
{"f1":"e","f2":"f","id":"id2"},
{"f1":"g","f2":"h","id":"id2"}
]
我找不到在 Ansible 中实现此目的的方法。
例如
- set_fact:
new_list_of_dicts: "{{ new_list_of_dicts|d([]) + [item|combine] }}"
with_subelements:
- "{{ test_list_of_dicts }}"
- inner_dict
给予
new_list_of_dicts:
[
{
"f1": "a",
"f2": "b",
"id": "id1"
},
{
"f1": "c",
"f2": "d",
"id": "id1"
},
{
"f1": "e",
"f2": "f",
"id": "id2"
},
{
"f1": "g",
"f2": "h",
"id": "id2"
}
]
参见with_subelements and subelements。
基本上与@vladimir 的回答中的示例相同,但不需要循环:
- name: manipulate dict
hosts: localhost
gather_facts: false
vars:
# Your var definition on a single line for legibility
test_list_of_dicts: [{"inner_dict":[{"f1":"a","f2":"b"},{"f1":"c","f2":"d"}],"id":"id1"},{"inner_dict":[{"f1":"e","f2":"f"},{"f1":"g","f2":"h"}],"id":"id2"}]
new_list_of_dicts: "{{ lookup('subelements', test_list_of_dicts, 'inner_dict')
| map('combine') | list }}"
tasks:
- name: Show result
debug:
var: new_list_of_dicts
哪个也给:
PLAY [manipulate dict] *****************************************************************************************************************************************************************************************************************
TASK [show result] *********************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"new_list_of_dicts": [
{
"f1": "a",
"f2": "b",
"id": "id1"
},
{
"f1": "c",
"f2": "d",
"id": "id1"
},
{
"f1": "e",
"f2": "f",
"id": "id2"
},
{
"f1": "g",
"f2": "h",
"id": "id2"
}
]
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
有字典列表如下:
"test_list_of_dicts": [
{
"inner_dict":[
{"f1":"a","f2":"b"},
{"f1":"c","f2":"d"}
],
"id":"id1"
},
{
"inner_dict":[
{"f1":"e","f2":"f"},
{"f1":"g","f2":"h"}
],
"id":"id2"
}
]
我需要修改上面的结构并得到一个新的字典列表,如下所示:
"new_list_of_dicts": [
{"f1":"a","f2":"b","id":"id1"},
{"f1":"c","f2":"d","id":"id1"},
{"f1":"e","f2":"f","id":"id2"},
{"f1":"g","f2":"h","id":"id2"}
]
我找不到在 Ansible 中实现此目的的方法。
例如
- set_fact:
new_list_of_dicts: "{{ new_list_of_dicts|d([]) + [item|combine] }}"
with_subelements:
- "{{ test_list_of_dicts }}"
- inner_dict
给予
new_list_of_dicts:
[
{
"f1": "a",
"f2": "b",
"id": "id1"
},
{
"f1": "c",
"f2": "d",
"id": "id1"
},
{
"f1": "e",
"f2": "f",
"id": "id2"
},
{
"f1": "g",
"f2": "h",
"id": "id2"
}
]
参见with_subelements and subelements。
基本上与@vladimir 的回答中的示例相同,但不需要循环:
- name: manipulate dict
hosts: localhost
gather_facts: false
vars:
# Your var definition on a single line for legibility
test_list_of_dicts: [{"inner_dict":[{"f1":"a","f2":"b"},{"f1":"c","f2":"d"}],"id":"id1"},{"inner_dict":[{"f1":"e","f2":"f"},{"f1":"g","f2":"h"}],"id":"id2"}]
new_list_of_dicts: "{{ lookup('subelements', test_list_of_dicts, 'inner_dict')
| map('combine') | list }}"
tasks:
- name: Show result
debug:
var: new_list_of_dicts
哪个也给:
PLAY [manipulate dict] *****************************************************************************************************************************************************************************************************************
TASK [show result] *********************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"new_list_of_dicts": [
{
"f1": "a",
"f2": "b",
"id": "id1"
},
{
"f1": "c",
"f2": "d",
"id": "id1"
},
{
"f1": "e",
"f2": "f",
"id": "id2"
},
{
"f1": "g",
"f2": "h",
"id": "id2"
}
]
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0