Ansible - Getting Started with Nested Variables

Let's say you are creating variables using the vars pluginNested 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'] }}"


Add a Comment




We will never share your name or email with anyone. Enter your email if you would like to be notified when we respond to your comment.





Please enter 3fb77 in the box below so that we can be sure you are a human.




Comments

Web design by yours truely - me, myself, and I   |   jeremy.canfield@freekb.net   |