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

如何从列表中选择与Ansible中的另一个值最接近的项,ansible,jinja2,Ansible,Jinja2,我有一个playbook,它返回以下输出: 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",

我有一个playbook,它返回以下输出:

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"
        }
    ]
}
是否有一种方法可以让我获取列表中每个项目的子网掩码,找到最接近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"
        }
我不想在以下情况下使用:item.Subnet\u Mask>=x,因为根据核心交换机上的路由,这可能返回多个结果,也可能不返回任何结果

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

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


感谢您的任何帮助

我不确定您的确切用例,但您可以通过执行以下操作从列表中提取一个属性最接近其他属性的项。注意,它是从一个JSON文件加载您的输出——在您的例子中,它可能已经注册了

play.yaml:

这个剧本在每个项目上循环,从32中减去子网掩码,根据差值对结果进行排序,并输出差值最小的项目

运行时使用:

ANSIBLE_JINJA2_本机对于确保使用set_fact将差异记录为整数而不是字符串是必需的

输出:


谢谢你回复我这个。我在最初的剧本中缺少的是ANSIBLE_JINJA2_NATIVE=真正的论点,在那之后一切都按预期进行了
---
- 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
ANSIBLE_JINJA2_NATIVE=True ansible-playbook play.yaml -i 127.0.0.1,
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"
    }
}