Ansible - get hostnames and private IPs from inventory file

3.2k views Asked by At

Is there any way to get the private IP of each node?

With this template:

{{ ansible_managed }}

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for item in groups['all'] %}
{{ hostvars[item]['ansible_ssh_host'] }} {{ item }}
{% endfor %}

I get the following result:

Ansible managed

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1 arithproducer
127.0.0.1 controller
127.0.0.1 restapi

Being my inventory file:

[control]
controller ansible_ssh_host=192.168.50.3 ansible_ssh_user=vagrant

[servers]
restapi ansible_ssh_host=192.168.50.5 ansible_ssh_user=vagrant

[producers]
arithproducer ansible_ssh_host=192.168.50.4 ansible_ssh_user=vagrant

[services:children]
servers
producers

The idea is to get this information so I can populate the /etc/hosts/ file in the control node

1

There are 1 answers

1
SPM On

You can use the below mentioned template and task file.

Template file

{{ ansible_managed }}

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6


{% for group in groups %}
{% if groups[group] and group != 'all' %}
{% for host in groups[group] %}
{{hostvars[host].ansible_default_ipv4.address}} {{ ansible_hostname }}
{% endfor %}

{% endif %}
{% endfor %}

Task File

---
- name: Create HostsFile
  hosts: development
  user: vagrant
  become: yes
  become_method: sudo

  tasks:
    - name: Create Hosts File
      template: src=hostsFile.j2 dest=/tmp/hosts owner=root group=root