Let's say you are creating variables using the vars plugin. Nested variables can be created like this.
food:
fruit: "Apple"
veggy: "Onion"
Or using the set_fact module.
- set_fact:
food:
fruit: "Apple"
veggy: "Onion"
The debug module can be used to print the value of the "food" key.
- name: output the 'food' key
debug:
var: food
Which should return something like this.
ok: [server1.example.com] => {
"vars[food]": {
"fruit": "Apple",
"veggy": "Onion"
}
}
The debug module can be used to print the value of the "fruit" variable.
- name: output the nested 'food.fruit' variable
debug:
var: food.fruit
Or like this, using Jinja2 syntax, delimiting each key with a period.
- name: output the nested 'food.fruit' variable
debug:
msg: "{{ food.fruit }}"
Or like this, using brackets.
- name: output the nested 'food.fruit' variable
debug:
msg: "{{ food['fruit'] }}"
Something like this should be returned.
ok: [server1.example.com] => {
"food.fruit": "Apple"
}
Period Delimiter
Let's say you have a key that contains a period (foo.bar in this example).
foo.bar:
var1: "Hello World"
If a key contains a period, you'll have to use brackets, like this.
- name: output the nested 'foo.bar.var1' variable
debug:
msg: "{{ foo.bar['var1'] }}"
Magic Variables
Let's say you one of your keys matches a magic variable. In this example, the "server1" key would probably match the inventory_hostname_short magic variable.
server1:
bar: "Hello World"
In this scenario, using vars may get the job done.
- name: output the nested 'hostname.bar' variable
debug:
var: vars[inventory_hostname_short].bar
Or, use the vars lookup plugin to reference the inventory_hostname_short variable.
- name: output the nested 'hostname.bar' variable
debug:
msg: "{{ lookup('vars', inventory_hostname_short)['bar'] }}"
In this example, the "server1" key would probably match the inventory_hostname_short magic variable, and is below the foo key.
foo:
server1:
bar: "Hello World"
In this scenario, when referencing the magic variable with brackets, do not place single quotes around the magic variable.
- name: output the nested 'foo.server1.bar' variable
debug:
msg: "{{ foo[inventory_hostname_short]['bar'] }}"
--extra-vars
Let's say you set the env variable to contain a value of dev using the -e or --extra-vars command line option.
ansible-playbook foo.yml --extra-vars "env=dev"
In this example, the env variable contains a value of dev, which matches the "dev" key.
dev:
foo:
bar: "Hello World"
In this scenario, use the vars lookup plugin to reference the env variable (dev key).
- name: output the nested 'env.foo.bar' variable
debug:
msg: "{{ lookup('vars', env)['foo']['bar'] }}"
Did you find this article helpful?
If so, consider buying me a coffee over at