access inventory file name

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:

  1. Use --extra-vars to specify the target environment, for example: --extra-vars=“inventory=qa”
  2. 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!