Unable to get value of variable from another Play in Ansible

I wish to obtain the value of “f_APP” variable of Play 2 into Play 3.

Below is my playbook which case be used as a testcase:

`

  • name: “Play 1”
    hosts: localhost
    tasks:

  • add_host: name={{ item }}
    groups=dest_nodes
    ansible_user={{ USER }}
    with_items: “{{ Dest_IP.split(‘,’) }}”

  • name: “Play 2”
    hosts: dest_nodes
    user: “{{ USER }}”
    tasks:

  • set_fact:
    f_APP: “Yellow”

  • name: “Play 3”

hosts: localhost
user: “{{ USER }}”

vars:
dbfiledet: “{{ hostvars[‘dest_nodes’][‘f_APP’] }}”

tasks:

  • debug: msg=“{{ dbfiledet.stdout }}”

`

I get the below error for my attempt:

playbook RUN command:

ansible-playbook variabletest.yml -e “USER=user1 Dest_IP=10.17.44.26,10.17.54.26”

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match ‘all’

PLAY [Play 1]

TASK [Gathering Facts] ************************************************************************************************************************************** ok: [localhost]

TASK [add_host] ********************************************************************************************************************************************* changed: [localhost] => (item=10.17.44.26) changed: [localhost] => (item=10.17.54.26)

PLAY [Play 2]

TASK [Gathering Facts] ************************************************************************************************************************************** ok: [10.17.54.26] ok: [10.17.44.26]

TASK [set_fact] ********************************************************************************************************************************************* ok: [10.17.44.26] ok: [10.17.54.26]

PLAY [Play 3]

TASK [Gathering Facts] ************************************************************************************************************************************** ok: [localhost]

TASK [debug] ************************************************************************************************************************************************ fatal: [localhost]: FAILED! => {“msg”: “The task includes an option with an undefined variable. The error was: "hostvars[‘dest_nodes’]" is undefined\n\nThe error appears to be in ‘variabletest.yml’: line 36, column 6, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - debug: msg="{{ dbfiledet.stdout }}"\n ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n with_items:\n - {{ foo }}\n\nShould be written as:\n\n with_items:\n - "{{ foo }}"\n”}

PLAY RECAP

10.17.44.26 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

10.17.54.26 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 localhost

: ok=3 changed=1 unreachable=0 failed=1 skipped=0

rescued=0 ignored=0

I’m on the latest version of ansible and python 2.7.5

Can someone suggest what is wrong and how can i get the value for the variable in Play 3 please ?

Unfortunately play variables do not persist in between plays by design in Ansible, generally I would try and group the tasks in a play together but you can write your vars to files on the local Host or remote node in play 2 and then read that file in play 3. One thing I can also suggest although I don’t have a laptop to test currently is:

Play2:
Hosts: test
Tasks:
set_fact:
myvar: foo

Play3
Hosts: test
Tasks:
set_fact:
myvar: “{{ hostvars[‘test’][‘myvar’] }}”

^ that might work as I believe hostvars once defined will be carried throughout execution

I’ve read variables don’t survive across “hosts” lines.

Mike

They do.
Variables is register to the host and is available in subsequent plays.

But to read variables from another host you always need to use hostvars to access them.

"dest_nodes" is the group of hosts. "hostvars" requires a host as an index.
This is the reason of the error:

    The error was: "hostvars['dest_nodes']" is undefined

Cheers,

  -vlado