I hope I am posting this to the correct area…
I’m really new to Ansible and am in the process of trying to learn it.
Question: Does Ansible have the ability to look at a master file that contains host file information and deploy information from that master file to the /etc/hosts file on all the nodes in my environment so that when I add a new host all that I need to do is update that master file and redeploy to all my nodes appending, or replacing, that existing /etc/hosts file?
Thanks.
If I understand correctly the master file you are talking about is playbook term in ansible. The playbook has all information related to hosts and deployment instruction. You can give the Input in playbook and it will modify the stuff accordingly.
Actually, I am referring to the master file outside the playbook.
In other words I just have a plain text master file with all my host entries. Then, I create a playbook that references that master file to send to all nodes as reference to update their /etc/hosts file.
Is that possible?
Yes. Use copy module. I hope so you are referring to inventory file which has all node details.
Like below
/etc/ansible/inventory
[all]
host1
host2
host3
/etc/ansible/playbook/master
host entry files
/etc/ansible/playbook/test.yaml
host: all
tasks:
- name: copying host file to all nodes
copy:
src: /etc/ansible/playbook/master
dest: /etc/hosts
mode: 0755
No, I’m not referring to the inventory file, it will be a separate file that will have other hosts. However, you have pointed me in the right direction, thank you for that.
Here is what I have come up with and this works, but my problem now is that every time there are new servers added, the existing servers will get the same hosts records all the time so there will be duplicates in the /etc/hosts. I haven’t been able to figure out how to look at the existing servers in the host file and only add new servers.:
— # Copy hosts file
- hosts: all
become: yes
tasks:
- name: update hosts template file
copy:
src: /home/ansible/hostfile
dest: /tmp/hostfile
owner: root
group: root
mode: 0644
backup: yes
- name: Append template file to master host file
shell: cat /tmp/hostfile >> /etc/hosts
- name: Delete temp file
file:
path: /tmp/hostfile
state: absent
This works, but my problem now is that every time there are new servers added, the existing servers will get the same hosts records all the time so there will be duplicates in the /etc/hosts. I haven’t been able to figure out how to look at the existing servers in the host file and only add new servers.
Why do you need that to append. If you have hosts file you can use copy to replace that role in every hosts file. I assume you have DNS server
I do not have a DNS server, hence the need to manually update the /etc/hosts file. This a small network with less than 50 clients.
Can you show me one example of your hosts file from one of node
Hello,
I think you should use templating and jinja2 a bit in here. Will make the file easier to control and avoid appending. You can also use NetworkManager (if you use that).
I think I found a way to do what I want to do. It’s dirty but it works:
— # Copy hosts file
- hosts: all
become: yes
tasks:
- name: update hosts template file
copy:
src: /home/ansible/hostfile
dest: /tmp/hostfile
owner: root
group: root
mode: 0644
backup: yes
- name: create master template file
shell: diff /tmp/hostfile /etc/hosts | grep '< ’ | sed ‘s/< //’ > /tmp/masterhosts
- name: Append template file to master host file
shell: cat /tmp/masterhosts >> /etc/hosts
- name: Delete temp file
file:
path: /tmp/hostfile
state: absent
- name: Delete master temp file
file:
path: /tmp/masterhosts
state: absent