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

1

18

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.

Frankforter answered 19/11, 2016 at 17:56 Comment(0)
M
31

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.

Mohamed answered 19/11, 2016 at 18:32 Comment(1)
Worth to mention that filter difference([inventory_hostname]) expects list as input parameter, important to use square brackets.Frond

© 2022 - 2024 — McMap. All rights reserved.