Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass Ansible variables from one role (running on one host) to another role running on another host within the same playbook

I have a playbook that runs different roles on different hosts. Is it possible to pass a variable from one role running on one host to another role on another host running within the same playbook run? Or any workaround ?

playbook
   host1
     role1
       here I get some variables: var1 var2 ...etc
   host2
     role2
       here I need to use var1 var2 ... etc from the above host/role

The task in role1 that sets teh variable db looks like this:

- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
  register: db

UPDATE: On the first host the values are dynamic, it's like a configuration file that is always updated. After I store the values in variables on host1 with the role1 I then move to the host2, run the role2 and do stuff with those values from variables stored by host1.

I tried with hostvars:

{{ hostvars.LBL.db.stdout }}
{{ hostvars['LBL']['db'] }}
{{ hostvars['LBL']['db']['stdout'] }}

and I get error:

in get_variables raise Exception("host not found: %s" % hostname) Exception: host not found: LBL

LBL exists in hosts as on it I run the first role

I set a variable on one host and I want that variable to be available to the other host. All this within a single playbook. Can it be done ?

hostvars is not working using it like this:

---   
- name: test hostvars host1
  hosts: LBL
  tasks:
    - command: "ls /bin"
        register: ls_out

- name: test hostvars host2
  hosts: LM
  tasks:
    - debug:
        var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"

error:

fatal: [10.104.148.138] => host not found: LBL

/etc/ansible/hosts

[root@NS1 ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138
like image 243
ady8531 Avatar asked Mar 31 '15 12:03

ady8531


2 Answers

This topic is complicated, and there are two different answers depending on what you want.

Access a variable defined in one role inside other for the same host

Example:

---
- hosts: host1
- roles:
    - role1
    - role2

Goal: You want to access some variable from role1 inside role2.

Use set_fact module.

Inside role1:

name: save precious value
set_fact: 
  pantsu: shiroi

Inside role2:

name: Nozoki...
debug: msg="Color is {{ pantsu }}"

Access to static variable for one host (or group) to other

Example:

[group_foo]
host1
host2
[group_bar]
host3
host4

group_vars/group_foo

important_value=bla-bla-ba

Goal: You want to use it in playbook for group2.

This is much trickier to do.

Inside group_vars/group_bar

other_var: '{{hostvars[groups["group_foo"][0]].important_value}}'

You can use other indexes besides '0'.

like image 150
George Shuklin Avatar answered Oct 19 '22 19:10

George Shuklin


The problem is in your inventory.

This message:

fatal: [10.104.148.138] => host not found: LBL

is because LBL is a group and not a host. Group LBL has one host in it: 10.104.148.136

Do one of the following:

1. Change your inventory (/etc/ansible/hosts) to:

LBL ansible_ssh_host=10.104.148.136
LM ansible_ssh_host=10.104.148.138

2. or if you really know what you're doing and LBL is a group and you wanna keep it that way then access the variable with:

{{ hostvars['10.104.148.136']['db']['stdout'] }}

Again LBL is a group not a host. More info.

like image 37
Kashyap Avatar answered Oct 19 '22 20:10

Kashyap