如何在 Ansible 中从列表中选择值最接近另一个值的项目



我有一个返回以下输出的剧本:

ok: [Lab_Core_SW] => {
"Test_List": [
{
"Firewall_IP": "10.120.193.100",
"IP_Address": "10.120.0.0",
"IP_and_Mask": "10.120.0.0/16",
"Subnet_Mask": "16",
"VRF_Name": "vrf1"
},
{
"Firewall_IP": "10.120.160.36",
"IP_Address": "10.120.46.0",
"IP_and_Mask": "10.120.46.0/25",
"Subnet_Mask": "25",
"VRF_Name": "vrf2"
},
{
"Firewall_IP": "10.120.187.68",
"IP_Address": "10.120.0.0",
"IP_and_Mask": "10.120.0.0/16",
"Subnet_Mask": "16",
"VRF_Name": "vrf3"
},
{
"Firewall_IP": "10.109.1.66",
"IP_Address": "10.0.0.0",
"IP_and_Mask": "10.0.0.0/8",
"Subnet_Mask": "8",
"VRF_Name": "vrf4"
},
{
"Firewall_IP": "10.120.184.68",
"IP_Address": "10.120.0.0",
"IP_and_Mask": "10.120.0.0/16",
"Subnet_Mask": "16",
"VRF_Name": "vrf5"
}
]
}

有没有办法我可以获取列表中每个项目的Subnet_Mask并找到最接近 32 的数字,然后只打印列表中的该项目,所以我只剩下以下内容:

{
"Firewall_IP": "10.120.160.36",
"IP_Address": "10.120.46.0",
"IP_and_Mask": "10.120.46.0/25",
"Subnet_Mask": "25",
"VRF_Name": "vrf2"
}

我不想使用when: item.Subnet_Mask >= x因为这可能会返回多个结果或不返回任何结果,具体取决于核心交换机上的路由。

我看过ipaddr过滤器,但它似乎没有我需要的东西。

我知道 python 中的 lambda 函数,但如果有可能以任何方式将其与 ansible 联系起来,我无法找到方法。

任何帮助表示赞赏

我不确定您的确切用例,但是您可以通过执行以下操作从列表中提取具有最接近其他属性的属性的项目。请注意,它正在从 JSON 文件加载您的输出 - 在您的情况下,它可能已经注册。

Play.yaml:

---
- hosts: 127.0.0.1
connection: local
gather_facts: no
vars:
obj: "{{ lookup('file', 'list.json') | from_json }}"
tasks:
- set_fact:
diff: "{{ 32 - item['Subnet_Mask'] | int }}"
loop: "{{ obj['Test_List'] }}"
register: diff_result
- set_fact:
min_diff: "{{ diff_result.results | sort(attribute='ansible_facts.diff') | first }}"
- debug:
var: min_diff.item

此 playbook 循环遍历每个项目,从 32 中减去子网掩码,按差异对结果进行排序,并输出差异最小的项目。

运行方式:

ANSIBLE_JINJA2_NATIVE=True ansible-playbook play.yaml -i 127.0.0.1,

ANSIBLE_JINJA2_NATIVE是必要的,以确保使用set_factdiff记录为整数而不是字符串。

输出:

TASK [debug]
ok: [127.0.0.1] => {
"min_diff.item": {
"Firewall_IP": "10.120.160.36", 
"IP_Address": "10.120.46.0", 
"IP_and_Mask": "10.120.46.0/25", 
"Subnet_Mask": "25", 
"VRF_Name": "vrf2"
}
}

最新更新