kotfzq
Last Updated: February 25, 2016
·
7.869K
· informatiq
6bf7a77224e98ee76a60913446cae1ca

ansible list groups host belongs to in template module

In my #ansible playbook I needed to list the groups the current host belongs in a config file (sensu client.json "subscriptions"). I had the following line in my template file

{% set count = [] %}[{% for gname in groups %}{% for host in groups[gname] %}{% if hostvars[host]["ansible_default_ipv4"]["address"] == ansible_ssh_host %}{% if count|length > 0 %},{% endif %}"{{ gname }}"{% if count.append(1) %}{% endif %}{% endif %}{% endfor %}{% endfor %}]

This would loop over all groups, and for each group it will loop over the hosts and compares the ansible_ssh_host to hostvars[host]["ansible_default_ipv4"]["address"] (current host's ip)
the count list is used to determine when i have written one group already and then add a ',' before the group onwards, as i needed to writethem in the form [ group1, group2, group3 ] and the format was not tolerant to extra ','

enjoy

Say Thanks
Respond

2 Responses
Add your response

10091
3c1b7e921632632e11d5d2ee59403f5f

This looks like is misformatted in Coderwall.

You can fix this by indenting each line with 4 spaces.

Trivally speaking, this is the way to list group names for the active host:

{% for group in group_names %}
    {{ group }}
{% endfor %}

Also this part:

if hostvars[host]["ansible_default_ipv4"]["address"] == ansible_ssh_host

Looks a little strange.

If you just want to join a list, there's also no need for the count:

{{ ",".join(listvar) }}
over 1 year ago ·
10092
6bf7a77224e98ee76a60913446cae1ca

Thanks michael for your comment, actually i needed to keep it all in oneline because it needs to be all in one line in the template
but that group_names seems to be so trivial that it makes me me ashamed

over 1 year ago ·
Filed Under