How to set configure the hosts file for hosts in ansible inventory

ansible

I've started learning and using ansible for configuring my staging and production servers. One thing I'd like to do is configure /etc/hosts through the inventory file.

It seems that this is possible. Here is one such usage:
https://gist.github.com/rothgar/8793800

However, I'm a little green to Ansible and I don't get it. Can someone please explain in plain english how I make it work in practice?

For example, if my inventory file contains.

[compute]
1.2.3.4 
5.6.7.8

[db]
2.3.4.5
6.7.8.9
10.11.12.13

[all]
compute
db

[all:vars]
...

I'd like to say with consistency that my hosts file after running the playbook contained

2.3.4.5 db1
6.7.8.9 db2
10.11.12.13 db3
1.2.3.4 compute1
5.6.7.8 compute2

Is this possible?

Best Answer

You could generate your hosts entries from a template. Loop over the list of groups, discard groups like all and ungrouped, and then loop over the list of hosts in each group:

{# this loops over the list of groups.  inside the loop #}
{# "group" will be the group name and "hosts" will be the #}
{# list of hosts in that group. #}
{% for group,hosts in groups.items() %}

{# skip the "all" and "ungrouped" groups, which presumably #}
{# you don't want in your hosts file #}
{% if group not in ["ungrouped", "all"] %}

{# generate a hosts entry for each host, using the "loop.index" #}
{# variable and the group name to generate a unique hostname. #}
{% for host in hosts %}
{{host}} {{group}}{{loop.index}}
{% endfor %}

{% endif %}
{% endfor %}

The above is using {{host}} for the ip address, because this lets me tested it out on my system, but you would probably prefer {{hostvars[host]['ansible_default_ipv4']['address']}} in a real environment, unless you are positive you are always using ip addresses in your inventory.

Related Topic