Lee Fox
Lee Fox

Reputation: 217

Multiple groups when iterating in a template file

This article from Ansible.com shows how you can iterate over a group inside of a template file: https://support.ansible.com/hc/en-us/articles/201957887-How-to-loop-over-a-list-of-hosts-in-a-group-inside-of-a-template-

It shows the following code:

{% for host in groups['db_servers'] %}
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}

It works beautifully, but the servers I want to iterate over are defined by being in multiple groups. So imagine that I want to iterate over all of the servers that are in BOTH the db_servers and qa groups. How can I do this?

I tried to specify the intersection of the group in the same manner I do in my playbook, but that doesn't work. So, when I try:

{% for host in groups['db_servers:&qa'] %}
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}

I get the following error:

fatal: [54.173.247.115] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'db_servers:&qa'", 'failed': True}

Any suggestions on how to iterate over multiple groups in a template file?

Upvotes: 5

Views: 5142

Answers (2)

udondan
udondan

Reputation: 59989

Ansible has the intersect filter. See Set Theory Filters.

{% for host in groups['db_servers'] | intersect(groups['qa']) %}
   {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}

Upvotes: 5

Micah Elliott
Micah Elliott

Reputation: 10274

You could wrap your loop in another for the two server groups:

{% for svrs in ['db_servers', 'qa'] %}
  {% for host in groups[svrs] %}
    {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
  {% endfor %}
{% endfor %}

Upvotes: 1

Related Questions