1

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?

1
  • Would you be open to give your hosts explicit hostnames in the inventory? Because everything else might be prone to errors.
    – udondan
    Feb 29, 2016 at 4:15

2 Answers 2

5

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.

0

In the inventory file:

  [myhosts]
    192.168.29.2 host_name=host1
    192.168.29.3 host_name=host2

In the playbook.yaml

    - name: Update /etc/hosts from inventory
  lineinfile: dest=/etc/hosts regexp='.*{{item}}$' line='{{hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{hostvars[item]['host_name']}} ' state=present
  with_items: '{{groups.myhosts}}'

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .