G_G
G_G

Reputation: 153

Regex match for key in jinja2 selectattr()

Given the data:

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

This extracts the name value dns-1 when the internal_ip matches the equalto. So far, so good.

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

In the real problem, I do not know which type of *_ip will the ip address I'm searching for will reside. It could be under internal_ip, it could be under external_ip and for all I know, there could be even more options, the only thing that will always be there - is the actual IP address I'm searching for: '10.1.1.100`.

So I need to regex match like so:

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

I'm not sure if this is possible, but it seems to be one of the ways out of this jam.

Upvotes: 1

Views: 2298

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67984

For example, the playbook

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

gives

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

Upvotes: 2

Related Questions