jinja2 selectattr() 中键的正则表达式匹配

Regex match for key in jinja2 selectattr()

给定数据:

"serverName", [
    serverData: [
          { 
            "internal_ip": "10.1.1.100",
            "external_ip": "172.16.1.10",
            "name": "dns-1"
      },
    ],
]

这会在 internal_ip 匹配 equalto 时提取 namedns-1。到目前为止,还不错。

- debug:
   msg: "{{  mydict | selectattr('internal_ip', 'equalto', '10.1.1.100') |  
   map(attribute='name') | list  }}"

在实际问题中,我不知道 知道我正在搜索的IP 地址属于哪种类型的*_ip。它可能在 internal_ip 之下,它可能在 external_ip 之下,据我所知,可能还有更多选项,唯一会一直存在的是我正在搜索的实际 IP 地址对于:“10.1.1.100”。

所以我需要像这样进行正则表达式匹配:

- debug:
   msg: "{{  mydict | selectattr('^.*$', 'equalto', '10.1.1.100') |  
   map(attribute='name') | list  }}"

我不确定这是否可行,但这似乎是摆脱困境的方法之一。

例如剧本

shell> cat playbook.yml
- hosts: localhost
  vars:
    mylist:
      - {internal_ip: 10.1.1.101, external_ip: 172.16.1.10, name: dns-1}
      - {internal_ip: 10.1.1.102, external_ip: 172.16.1.10, name: dns-2}
      - {internal_ip: 10.1.1.103, external_ip: 172.16.1.10, name: dns-3}
  tasks:
    - set_fact:
        sel: "{{ sel|default([]) + [item.name] }}"
      loop: "{{ mylist }}"
      when: sel_ip|default('') in item.values()|list
    - debug:
        var: sel

给予

shell> ansible-playbook playbook.yml -e sel_ip=172.16.1.10
  ...
  sel:
  - dns-1
  - dns-2
  - dns-3
shell> ansible-playbook playbook.yml -e sel_ip=10.1.1.103
  ...
  sel:
  - dns-3