How to remove or exclude an item in an Ansible template list?

ScoSol picture ScoSol · Nov 19, 2016 · Viewed 14.7k times · Source

I'm writing an Ansible template that needs to produce a list of ip's in a host group, excluding the current hosts IP. I've searched around online and through the documentation but I could not find any filters that allow you to remove an item in a list. I have created the (hacky) for loop below to do this but was wondering if anyone knew a "best practice" way of filtering like this.

{% set filtered_list = [] %}

{% for host in groups['my_group'] if host != ansible_host %}
    {{ filtered_list.append(host)}}
{% endfor %}

Lets say groups['my_group'] has 3 ip's (192.168.1.1, 192.168.1.2 and 192.168.1.3). When the template is generated for 192.168.1.1 it should only print the ip's 192.168.1.2 and 192.168.1.3.

Answer

Konstantin Suvorov picture Konstantin Suvorov · Nov 19, 2016

There is difference filter for that:

- debug: var=item
  with_items: "{{ groups['my_group'] | difference([inventory_hostname]) }}"

This will give you all items hosts from my_group without current host.