Change variable in Ansible template based on group

31,247

Solution 1

You do it the other way around. You check if the identifier (hostname or IP or whatever is in your inventory) is in the defined group. Not if the group is in the hostvars.

{% if ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}

But, what you better should do is this:

Provide default in template

# role_name/templates/template.j2
node_master={{ role_name_node_master | default(true) }}

Than override in group_vars

# group_vars/es-masters.yml
role_name_node_master: false

Solution 2

If your inventory does not identify hosts with ansible_fqdn, ansible_hostname, etc., you can also use group_names to check if the current host has "es-masters" as one of its groups.

{% if 'es-masters' in group_names %}
node_master=true
{% else %}
node_master=false
{% endif %}

See https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables

Solution 3

To avoid error with non existing group you should check first if the group exists:

{% if 'es-masters' in group_names and ansible_fqdn in groups['es-masters'] %}
node_master=true
{% else %}
node_master=false
{% endif %}
Share:
31,247
Charles Newey
Author by

Charles Newey

I don't really keep this up-to-date, but are some links to my blog, GitHub, and LinkedIn profiles which you mind find helpful. :-) Blog GitHub (Personal) GitHub (Work) LinkedIn

Updated on July 10, 2022

Comments

  • Charles Newey
    Charles Newey almost 2 years

    I've got an Ansible inventory file a bit like this:

    [es-masters]
    host1.my-network.com
    
    [es-slaves]
    host2.my-network.com
    host3.my-network.com
    
    [es:children]
    es-masters
    es-slaves
    

    I also have a Jinja2 template file that needs a certain value set to "true" if a host belongs to the "es-masters" group.

    I'm sure that there's a simple way of doing it but after some Googling and reading the documentation, I've drawn a blank.

    I'm looking for something simple and programmatic like this to go in the Jinja2 template:

    {% if hostvars[host][group] == "es-masters" %}
    node_master=true
    {% else %}
    node_master=false
    {% endif %}
    

    Any ideas?

  • Chris F
    Chris F about 7 years
    How do I extend the answer with groups with children, posted in stackoverflow.com/questions/42955303/…