Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible hostvars undefined

I have a very simple play which saves vars and looks them up in hostvars.

- name: Set hostvars
  hosts: localhost
  vars:
    var_one: "I am a"
    var_two: "test"
  tasks:
    - debug: var=hostvars['localhost']['var_one']
    - debug: var=hostvars['localhost']['var_two']

However, when I run this play the vars aren't defined:

PLAY [Set hostvars] ************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "hostvars['localhost']['var_one']": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "hostvars['localhost']['var_two']": "VARIABLE IS NOT DEFINED!"
}

How can I save these vars in hostvars?

like image 579
cscan Avatar asked Oct 17 '25 14:10

cscan


2 Answers

You can set host facts runtime using set_fact module:

---
- name: Set hostvars
  hosts: localhost
  tasks:
    - set_fact: var_one="I am a"
    - set_fact: var_two="test"
    - debug: var=hostvars['localhost']['var_one']
    - debug: var=hostvars['localhost']['var_two']

Quoting the documentation:

These variables will survive between plays during an Ansible run, but will not be saved across executions even if you use a fact cache.

like image 165
Pasi H Avatar answered Oct 21 '25 05:10

Pasi H


This is where the difference between facts (variables bound to Ansible target hosts) and regular variables can be seen.

Variables are internally stored in vars structure, so you can access them with:

tasks:
  - debug: var=vars['var_one']
  - debug: var=vars['var_two']

Facts, on the other hand are stored in hostvars.


In either case, unless you were referring to a variable name with a dynamic name, or a fact bound to another host than the one executing the task, you can simply use the variable/fact name by using its name:

tasks:
  - debug: var=var_one
  - debug: var=var_two
like image 34
techraf Avatar answered Oct 21 '25 05:10

techraf



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!