Vars from hosts?

Not sure the best way to do this, have read the documentation but still a wee bit befuddled.

We’re ramping up to be able to deploy to several hundred servers. Each server will have an assigned name. Some of the files that will be deployed will need that name, whereas as deployed they have a place holder. I think I have a pretty firm handle on using the replace module. What I’m not sure about is how best to apply the names to the servers and then pull each name out as a var, based on server being presently deployed to, so I can use it in the replace function.

SO, let’s say I have three servers each in Dallas and Baltimore. If I set up my inventory file as follows:

[Dallas]
server01 ansible_ssh_host=192.174.38.12
server02 ansible_ssh_host=someOtherIP
server03 ansible_ssh_host=yetAnotherIP

[Baltimore]
server04 ansible_ssh_host=aFourthIP
server05 ansible_ssh_host=aFifthIP
server06 ansible_ssh_host=LastIP

I have now named each server with a unique name, right? But in the inventory docs it says: “The preferred practice in Ansible is actually not to store variables in the main inventory file.” and I agree. At some point I will want to add more variables.
So how would I set up a variable file such that it provides a name, based on the IP being deployed to? and how do I reference that file in the playbook so the plays know where to get the vars from? Sorry, very new at all this.

Once I’ve done that, I’m thinking the play to replace the place holder would look something like this?

- replace:
    dest=abc.conf
    regexp='placeholder'
    replace={{ server_name }}
    backup=yes

I think you should try using the inventory_hostname variable for that.
It'll return those serverXX names you defined.

If you need more vars per host, I would use host_vars.

https://docs.ansible.com/playbooks_best_practices.html#group-and-host-variables

Giovanni

I see what you’re saying. Tried to put it into play, but I’m obviously still missing some fundamental knowledge. How do I call the variable?

I tried:

  • replace:
    dest=
    regexp=‘placeholder’
    replace={{ inventory_hostname }}
    backup =no

and it wouldn’t work. I can get the file to work, as an experiment in place of {{ inventory_hostname }} I put {{ ansible_eth0.ipv4.address }} and the replace worked, putting the IP address of the target system where ‘placeholder’ used to be, so I’ve got that part down, but calling variables I haven’t got a handle on yet.

Off to do more reading. Thanks for the help Giovanni!

regards, Richard

Actually, I’m reading Ansible: Up and Running, and under inventory_hostname it says I did it right, yet when I ran the playbook, I got an error saying inventory_hostname wasn’t defined. I think maybe I should start a new thread.

Try to put quotes around that ("{{ inventory_hostname }}") so it's
probably interpreted by Jinja2.

A working example:

Thanks again for the reply Giovanni.

I tried that, it’s still putting the IP address instead of the server name. Not sure what I’m missing.

regards, Richard