Using ipaddr filter to compare ip address with_items in group_vars

Ok, given the following group_vars:

iloms:

  • gateway: 10.224.64.1
    mask: 255.255.248.0
  • gateway: 10.85.0.1
    mask: 255.255.254.0

and an ip from a lookup:

ilom_ip: “{{ lookup(‘dig’, ‘mgmt-’ + ansible_local.system_facts.host_serial + ‘.example.com’) }}”

I need to compare ilom_ip to {{ item.gateway }}/{{ item.mask }} and if it is in the same subnet, use those values (and if not, test the next, etc)

I know I can concatenate the gw and mask:

ilom_net = ‘{{ item.gateway }}/{{ item.mask }}’

with_items: iloms

and that I can test if ilom_ip is in the same subnet as ilom_net with:

{{ ilom_ip | ipaddr(ilom_net) }}

But how do I combine these into a task and reliably get the correct gw/mask to use in additional tasks (setting ip/gw/netmask on on ilom)

I encountered a similar issue and managed to solve it by creating a simple filter plugin:

def ip_in_net(list, net):
from netaddr import IPAddress, IPNetwork
return [ip for ip in list if IPAddress(ip) in IPNetwork(net)]

class FilterModule(object):
def filters(self):
return {
‘ip_in_net’: ip_in_net
}

and then use it like that:

ip: “{{ ansible_all_ipv4_addresses | ip_in_net(‘172.16.0.0/24’) | first }}”

Now this obviously does not work with your data, and requires a ‘netaddr’ Python package (apt-get install python-netaddr in my Ubuntu 14.04), but quite likely you could use the interface provided by that package to suit your needs exactly, it’s very friendly.