加入词典列表
join list of dictionaries
我有一个 macaddresses 和 网络适配器 的列表,我想将它们合并到一个列表中。
vars:
network_adapters:
- name: "Network adapter one"
- name: "Network adapter two"
macaddresses:
- "00:50:56:9c:8c:b1"
- "00:50:56:9c:8c:b2"
可以使用以下方法使用附加变量来完成,但我希望 oneliner。
- name: "Set fact"
set_fact:
network_interfaces: >-
{{
network_interfaces | default([])
+ [item[0] | combine({'macaddress':item[1]})]
}}
loop: "{{ network_adapters | zip(macaddresses) }}"
输出:
{
"macaddress": "00:50:56:9c:8c:b1",
"name": "Network adapter one"
},
{
"macaddress": "00:50:56:9c:8c:b2",
"name": "Network adapter two"
}
以下是我的一些试用,也许有人觉得有用。
将哈希添加到 macaddresses 列表
"{{ macaddresses | json_query('[].{\"macaddress\": @}') }}"
{
"macaddress": "00:50:56:9c:8c:b1"
},
{
"macaddress": "00:50:56:9c:8c:b2"
}
合并成哈希列表
"{{ macaddresses | json_query('[].{\"macaddress\": @}') | zip(network_adapters) }}"
[
{
"macaddress": "00:50:56:9c:8c:b1"
},
{
"name": "Network adapter one"
}
],
[
{
"macaddress": "00:50:56:9c:8c:b2"
},
{
"name": "Network adapter two"
}
]
合并成字典
"{{ macaddresses | json_query('[].{\"macaddress\": @}') | map('combine', network_adapters) }}"
{
"macaddress": "00:50:56:9c:8c:b1",
"name": "Network adapter two"
},
{
"macaddress": "00:50:56:9c:8c:b2",
"name": "Network adapter two"
}
我对最后一个特别感兴趣。这两次输出最后一个 network_adapters 项的字典。
这是一个错误吗?
任务完成工作
- debug:
msg: "{{ dict(network_adapters|map(attribute='name')|zip(macaddresses))|
dict2items(key_name='name', value_name='macaddress') }}"
给予
msg:
- macaddress: 00:50:56:9c:8c:b1
name: Network adapter one
- macaddress: 00:50:56:9c:8c:b2
name: Network adapter two
问:"比较复杂的数据。保留其他属性,比如'ip'?"
network_adapters:
- name: "Network adapter one"
ip: "192.168.0.1"
- name: "Network adapter two"
ip: "192.168.0.2"
答:没有“单行”,只有循环(你已经知道了),例如
- set_fact:
na2: "{{ na2|default([]) + [item.0|combine({'macaddress': item.1})] }}"
with_together:
- "{{ network_adapters }}"
- "{{ macaddresses }}"
给予
na2:
- ip: 192.168.0.1
macaddress: 00:50:56:9c:8c:b1
name: Network adapter one
- ip: 192.168.0.2
macaddress: 00:50:56:9c:8c:b2
name: Network adapter two
我有一个 macaddresses 和 网络适配器 的列表,我想将它们合并到一个列表中。
vars:
network_adapters:
- name: "Network adapter one"
- name: "Network adapter two"
macaddresses:
- "00:50:56:9c:8c:b1"
- "00:50:56:9c:8c:b2"
可以使用以下方法使用附加变量来完成,但我希望 oneliner。
- name: "Set fact"
set_fact:
network_interfaces: >-
{{
network_interfaces | default([])
+ [item[0] | combine({'macaddress':item[1]})]
}}
loop: "{{ network_adapters | zip(macaddresses) }}"
输出:
{
"macaddress": "00:50:56:9c:8c:b1",
"name": "Network adapter one"
},
{
"macaddress": "00:50:56:9c:8c:b2",
"name": "Network adapter two"
}
以下是我的一些试用,也许有人觉得有用。
将哈希添加到 macaddresses 列表
"{{ macaddresses | json_query('[].{\"macaddress\": @}') }}"
{ "macaddress": "00:50:56:9c:8c:b1" }, { "macaddress": "00:50:56:9c:8c:b2" }
合并成哈希列表
"{{ macaddresses | json_query('[].{\"macaddress\": @}') | zip(network_adapters) }}"
[ { "macaddress": "00:50:56:9c:8c:b1" }, { "name": "Network adapter one" } ], [ { "macaddress": "00:50:56:9c:8c:b2" }, { "name": "Network adapter two" } ]
合并成字典
"{{ macaddresses | json_query('[].{\"macaddress\": @}') | map('combine', network_adapters) }}"
{ "macaddress": "00:50:56:9c:8c:b1", "name": "Network adapter two" }, { "macaddress": "00:50:56:9c:8c:b2", "name": "Network adapter two" }
我对最后一个特别感兴趣。这两次输出最后一个 network_adapters 项的字典。 这是一个错误吗?
任务完成工作
- debug:
msg: "{{ dict(network_adapters|map(attribute='name')|zip(macaddresses))|
dict2items(key_name='name', value_name='macaddress') }}"
给予
msg:
- macaddress: 00:50:56:9c:8c:b1
name: Network adapter one
- macaddress: 00:50:56:9c:8c:b2
name: Network adapter two
问:"比较复杂的数据。保留其他属性,比如'ip'?"
network_adapters:
- name: "Network adapter one"
ip: "192.168.0.1"
- name: "Network adapter two"
ip: "192.168.0.2"
答:没有“单行”,只有循环(你已经知道了),例如
- set_fact:
na2: "{{ na2|default([]) + [item.0|combine({'macaddress': item.1})] }}"
with_together:
- "{{ network_adapters }}"
- "{{ macaddresses }}"
给予
na2:
- ip: 192.168.0.1
macaddress: 00:50:56:9c:8c:b1
name: Network adapter one
- ip: 192.168.0.2
macaddress: 00:50:56:9c:8c:b2
name: Network adapter two