As suggested in the best practices doc, have two inventory files: qa and production
I call these using the -i parameter:
ansible-playbook -i qa …
Is there a way I can determine in my playbook which inventory I am using? The use case is I want to notify one chat room if using qa inventory, another if I use production.
I’ve tried just putting a variable in the root of the inventory file qa:
inventory=qa
[webservers]
host1
but that doesn’t work: is not displayed as a variable with: “ansible host1 -m setup -i qa”
I can define a variable for each host like:
[webservers]
host1 inventory=qa
but that is terribly redundant.
The name of the current inventory file in use is stored in the “inventory_file” variable name, so you could check that. Beyond that, there are two other options:
- Use --extra-vars to specify the target environment, for example: --extra-vars=“inventory=qa”
- The group_vars location is based on the location of the inventory file, so you could do something like this:
qa/group_vars/all:
inventory=qa
prod/group_vars/all:
inventory=production
The qa/hosts and prod/hosts would contain your different inventories, so you’ll get output like this:
$ cat play.yml
- hosts: all
gather_facts: no
tasks:
- name: show the variable
debug: var=inventory
$ ansible-playbook play.yml -i prod/hosts
PLAY [all] ********************************************************************
TASK: [show the variable] *****************************************************
ok: [you] => {
“inventory”: “production”
}
PLAY RECAP ********************************************************************
you : ok=1 changed=0 unreachable=0 failed=0
$ ansible-playbook play.yml -i qa/hosts
PLAY [all] ********************************************************************
TASK: [show the variable] *****************************************************
ok: [me] => {
“inventory”: “qa”
}
PLAY RECAP ********************************************************************
me : ok=1 changed=0 unreachable=0 failed=0
Hope that helps.
Hi,
We have multiple clusters. Each of the clusters need to have a different var file (cluster specific variables)
Currently the variable file name is same as the cluster name, so that when the extra-variable says cluster=ABC, my playbook picks up the variable file ABC.yml which I refer to in the playbook by {{cluster}}.yml.
This has a risk because the user while running the playbook might give the inventory file name of cluster XYZ and give cluster=ABC.
In order to avoid this risk, I want to pick up my variable file as {{inventory_file}}.yml
But looks like the variable file is referred to, before the variable inventory_file is loaded?
Because even though {{inventory_file}}.yml is picked up correctly under tasks(I printed it our using debug:) the variable file is not being picked up.
Am I missing something here?
Thanks and regards,
Mridu
“But looks like the variable file is referred to, before the variable inventory_file is loaded?”
I’m not sure what this means, can you elaborate?
Thanks!