Ansible: Add IPs from inventory to /etc/hosts of all nodes
Solution 1:
The previous answer simply does not work because it adds a new line for the same host instead of modifying the existing line when an IP Address for a host changes.
The following solution takes into account when the ip address changes for a specific server and handles it well by only modifying the line instead of adding duplicate entries.
---
- name: Add IP address of all hosts to all hosts
lineinfile:
dest: /etc/hosts
regexp: '.*{{ item }}$'
line: "{{ hostvars[item].ansible_host }} {{item}}"
state: present
when: hostvars[item].ansible_host is defined
with_items: "{{ groups.all }}"
Solution 2:
Looks like you have errors in your syntax. Also what version of ansible are you using? The variable names may be different. On version 2.2
this works for me:
- name: Add IP address of all hosts to all hosts
lineinfile:
dest: /etc/hosts
line: "{{ hostvars[item].ansible_host }} {{ hostvars[item].inventory_hostname }} {{ hostvars[item].inventory_hostname_short }}"
state: present
with_items: "{{ groups.all }}"
UPDATE
Basil has thought about situations when the IP changes. In that case it is better to use his suggested solution:
- name: Add IP address of all hosts to all hosts
lineinfile:
dest: /etc/hosts
regexp: '.*{{ item }}$'
line: "{{ hostvars[item].ansible_host }} {{item}}"
state: present
when: hostvars[item].ansible_host is defined
with_items: "{{ groups.all }}"
Solution 3:
I had the same issue and here is my solution for anyone who is interested.
hosts/dev.ini
[controller]
controller1 ansible_ssh_host=10.11.11.10
controller2 ansible_ssh_host=10.11.11.11
controller3 ansible_ssh_host=10.11.11.12
[compute]
compute1 ansible_ssh_host=10.11.11.13
compute2 ansible_ssh_host=10.11.11.14
compute3 ansible_ssh_host=10.11.11.15
[block]
block1 ansible_ssh_host=10.11.11.16
block2 ansible_ssh_host=10.11.11.17
[haproxy]
haproxy1 ansible_ssh_host=10.11.11.18
[nginx]
nginx1 ansible_ssh_host=10.11.11.19
[deployment]
deployment ansible_ssh_host=10.11.11.20
[all:vars]
ansible_python_interpreter=/usr/bin/python3
tasks/main.yml
---
- name: Update /etc/hosts
become: true
blockinfile:
path: /etc/hosts
create: yes
block: |
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
{% for item in ansible_play_batch %}
{{ hostvars[item].ansible_ssh_host }} {{ item }}
{% endfor %}
Notes:
- python 3.7.5 ansible 2.9.0
- I decided to go with blockinfile instead of using templates because hostvars context was not getting updated inside the template. Plus I was in a hurry :-).