Ansible合并列表词典
我目前正在构建一个Ansible playbook,它为我提供以下两个变量。我需要将它们合并到一个变量中,其中IPAddress匹配,如下例所示Ansible合并列表词典,ansible,Ansible,我目前正在构建一个Ansible playbook,它为我提供以下两个变量。我需要将它们合并到一个变量中,其中IPAddress匹配,如下例所示 --- - hosts: localhost gather_facts: no vars: sites: - siteGroupId: 123 siteName: name123 siteDevices: - ipAddress: 1.1.1.1
---
- hosts: localhost
gather_facts: no
vars:
sites:
- siteGroupId: 123
siteName: name123
siteDevices:
- ipAddress: 1.1.1.1
- ipAddress: 2.2.2.2
- siteGroupId: 456
siteName: name456
siteDevices:
- ipAddress: 3.3.3.3
- ipAddress: 4.4.4.4
devices:
- ipAddress: 1.1.1.1
deviceName: name123-a.tld
- ipAddress: 2.2.2.2
deviceName: name123-b.tld
- ipAddress: 3.3.3.3
deviceName: name456-a.tld
- ipAddress: 4.4.4.4
deviceName: name456-b.tld
预期产出:
sites:
- siteGroupId: 123
siteName: name123
siteDevices:
- ipAddress: 1.1.1.1
deviceName: name123-a.tld
- ipAddress: 2.2.2.2
deviceName: name123-b.tld
- siteGroupId: 456
siteName: name456
siteDevices:
- ipAddress: 3.3.3.3
deviceName: name456-a.tld
- ipAddress: 4.4.4.4
deviceName: name456-b.tld
到目前为止,我使用下面的代码成功地将名称添加到站点,但得到了4个站点(重复的siteGroupID作为输出)
输出:
{
"siteDevices": [
{
"deviceName": "name123-a.tld",
"ipAddress": "1.1.1.1"
}
],
"siteGroupId": 123,
"siteName": "name123"
},
{
"siteDevices": [
{
"deviceName": "name123-b.tld",
"ipAddress": "2.2.2.2"
}
],
"siteGroupId": 123,
"siteName": "name123"
},
{
"siteDevices": [
{
"deviceName": "name456-a.tld",
"ipAddress": "3.3.3.3"
}
],
"siteGroupId": 456,
"siteName": "name456"
},
{
"siteDevices": [
{
"deviceName": "name456-b.tld",
"ipAddress": "4.4.4.4"
}
],
"siteGroupId": 456,
"siteName": "name456"
}
任务
- set_fact:
devices_dict: "{{ devices|
items2dict(key_name='ipAddress',
value_name='deviceName') }}"
- set_fact:
sites2: "{{ sites2|default([]) + [
item|
combine({'siteDevices':
dict(my_ipAddress|
zip(my_ipAddress|
map('extract', devices_dict)))|
dict2items(key_name='ipAddress',
value_name='deviceName')})] }}"
vars:
my_ipAddress: "{{ item.siteDevices|json_query('[].ipAddress') }}"
loop: "{{ sites }}"
- debug:
var: sites2
给予
任务
- set_fact:
devices_dict: "{{ devices|
items2dict(key_name='ipAddress',
value_name='deviceName') }}"
- set_fact:
sites2: "{{ sites2|default([]) + [
item|
combine({'siteDevices':
dict(my_ipAddress|
zip(my_ipAddress|
map('extract', devices_dict)))|
dict2items(key_name='ipAddress',
value_name='deviceName')})] }}"
vars:
my_ipAddress: "{{ item.siteDevices|json_query('[].ipAddress') }}"
loop: "{{ sites }}"
- debug:
var: sites2
给予
非常感谢你!这正是我想要的。非常感谢!这正是我想要的。
"sites2": [
{
"siteDevices": [
{
"deviceName": "name123-a.tld",
"ipAddress": "1.1.1.1"
},
{
"deviceName": "name123-b.tld",
"ipAddress": "2.2.2.2"
}
],
"siteGroupId": 123,
"siteName": "name123"
},
{
"siteDevices": [
{
"deviceName": "name456-a.tld",
"ipAddress": "3.3.3.3"
},
{
"deviceName": "name456-b.tld",
"ipAddress": "4.4.4.4"
}
],
"siteGroupId": 456,
"siteName": "name456"
}
]