如何比较或查找 ansible 和 print 中两个列表中的特定值
How to compare or lookup specific values from two lists in ansible and print
如何比较 ansible 中的两个列表并在下面打印所需的输出,我在 Whosebug 中查看了其他 posts 关于 comparing/lookup 列表,但我想要的输出方式有点不同,无法弄清楚让这个工作的逻辑。请指出任何可以帮助 me.Thanks
的 post
列表 1:
[
{
"DES": "server1",
"PORT": "E46",
},
{
"DESCRIP": "server2",
"PORT": "E47",
},
{
"DESCRIP": "server3",
"PORT": "E4",
},
{
"DESCRIP": "server4",
"PORT": "E7",
}
]
列表 2:
[
{
"INTERFACES": [
"E6",
"E8",
"E9",
"E10",
"E11",
"E12",
"E13",
"E14",
"E27",
"E28",
"E37",
"E43",
"E44",
"E45",
"E46",
"E47"
],
"VLAN_ID": "17"
},
{
"INTERFACES": [
"E7",
"E10",
"E11",
"E12",
"E13",
"E14",
"E27",
"E28",
"E45",
"E46"
],
"VLAN_ID": "16"
}
]
期望的输出:
If list1 PORT
value matches/present in list2 INTERFACES
然后打印如下内容:server1 E46 has: VLAN_ID: 17 ; VLAN_ID: 16
或 server2 E47 has: VLAN_ID: 17 ; NO VLAN_ID: 16
如果 list1 PORT
值在 list2 INTERFACES
中没有 matches/present 然后打印类似 server3 E4 has NO VLAN_ID: 17 NO VLAN_ID: 16
下面是完整的所需打印:
server1 E46 has: VLAN_ID: 17 ; VLAN_ID: 16
server2 E47 has: VLAN_ID: 17 ; NO VLAN_ID: 16
server3 E4 has: NO VLAN_ID: 17 ; NO VLAN_ID: 16
server4 E7 has: VLAN_ID: 16 ; NO VLAN_ID: 17
例如
- set_fact:
srv_id: "{{ srv_id|d({})|combine({item.DESCRIP: _id}) }}"
loop: "{{ List1 }}"
vars:
_id: "{{ List2|
selectattr('INTERFACES', 'contains', item.PORT)|
map(attribute='VLAN_ID')|
list }}"
给予
srv_id:
server1: ['17', '16']
server2: ['17']
server3: []
server4: ['16']
(格式化应该很简单。)
如何比较 ansible 中的两个列表并在下面打印所需的输出,我在 Whosebug 中查看了其他 posts 关于 comparing/lookup 列表,但我想要的输出方式有点不同,无法弄清楚让这个工作的逻辑。请指出任何可以帮助 me.Thanks
的 post列表 1:
[
{
"DES": "server1",
"PORT": "E46",
},
{
"DESCRIP": "server2",
"PORT": "E47",
},
{
"DESCRIP": "server3",
"PORT": "E4",
},
{
"DESCRIP": "server4",
"PORT": "E7",
}
]
列表 2:
[
{
"INTERFACES": [
"E6",
"E8",
"E9",
"E10",
"E11",
"E12",
"E13",
"E14",
"E27",
"E28",
"E37",
"E43",
"E44",
"E45",
"E46",
"E47"
],
"VLAN_ID": "17"
},
{
"INTERFACES": [
"E7",
"E10",
"E11",
"E12",
"E13",
"E14",
"E27",
"E28",
"E45",
"E46"
],
"VLAN_ID": "16"
}
]
期望的输出:
If list1 PORT
value matches/present in list2 INTERFACES
然后打印如下内容:server1 E46 has: VLAN_ID: 17 ; VLAN_ID: 16
或 server2 E47 has: VLAN_ID: 17 ; NO VLAN_ID: 16
如果 list1 PORT
值在 list2 INTERFACES
中没有 matches/present 然后打印类似 server3 E4 has NO VLAN_ID: 17 NO VLAN_ID: 16
下面是完整的所需打印:
server1 E46 has: VLAN_ID: 17 ; VLAN_ID: 16
server2 E47 has: VLAN_ID: 17 ; NO VLAN_ID: 16
server3 E4 has: NO VLAN_ID: 17 ; NO VLAN_ID: 16
server4 E7 has: VLAN_ID: 16 ; NO VLAN_ID: 17
例如
- set_fact:
srv_id: "{{ srv_id|d({})|combine({item.DESCRIP: _id}) }}"
loop: "{{ List1 }}"
vars:
_id: "{{ List2|
selectattr('INTERFACES', 'contains', item.PORT)|
map(attribute='VLAN_ID')|
list }}"
给予
srv_id:
server1: ['17', '16']
server2: ['17']
server3: []
server4: ['16']
(格式化应该很简单。)