Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible - Take some variable values from one host and use them in another host

Tags:

shell

ansible

I have a playbook that contains the two separate hosts one is 'localhost' and another is 'xyz'.

- hosts: localhost
  connection: local
  gather_facts: False
  vars_prompt: 
    - name: "value" 
      prompt: "Enter your value" 
      private: yes
  roles:
    - a
###

- name: Define xyz
  hosts: xyz

  roles:
    - a
    - b

When we run the above playbook then in 'localhost' var_promot take the values from the user and after that, I want to use those values in the 'xyz' host roles in shell commands.

Currently, Inside 'a' role I have this type of code but it gives me an error.

- name: echo
  shell: " echo {{ value | urlencode }}"
  register: sout

Any idea how to do that or any other way for it?

like image 777
Dhananjay Gahiwade Avatar asked Dec 14 '25 20:12

Dhananjay Gahiwade


1 Answers

Neither vars_prompt nor roles is needed to reproduce the problem. Use simple vars and tasks instead. For example

- hosts: localhost
  vars:
    test_var: foo
  tasks:
    - debug:
        var: test_var

- hosts: xyz
  vars:
    test_var: "{{ hostvars.localhost.test_var }}"
  tasks:
    - debug:
        var: test_var

gives (debug output only)

ok: [localhost] => 
  test_var: foo

ok: [xyz] => 
  test_var: VARIABLE IS NOT DEFINED!

The variable test_var was declared in the first play and assigned to the host localhost. To use the variable in another host the dictionary hostvars is needed. But, the problem is that the variable test_var was not "instantiated". This means the variable was not included in the hostvars. Let's test it

- hosts: localhost
  vars:
    test_var: foo
  tasks:
    - debug:
        var: test_var
    - debug:
        var: hostvars.localhost.test_var

- hosts: xyz
  gather_facts: false
  tasks:
    - debug:
        var: hostvars.localhost.test_var

gives (debug output only)

ok: [localhost] => 
  test_var: foo

ok: [localhost] => 
  hostvars.localhost.test_var: VARIABLE IS NOT DEFINED!

ok: [xyz] => 
  hostvars.localhost.test_var: VARIABLE IS NOT DEFINED!

The problem will disappear when -e, --extra-vars is used

shell> ansible-playbook playbook.yml -e test_var=bar

gives (debug output only)

ok: [localhost] => 
  test_var: bar

ok: [localhost] => 
  hostvars.localhost.test_var: bar

ok: [xyz] => 
  hostvars.localhost.test_var: bar

To fix the problem for other sources of variables "instantiate" the variable in the first play. Use set_fact

- hosts: localhost
  vars:
    test_var: foo
  tasks:
    - debug:
        var: test_var
    - debug:
        var: hostvars.localhost.test_var
    - set_fact:
        test_var: "{{ test_var }}"
    - debug:
        var: hostvars.localhost.test_var

- hosts: xyz
  vars:
    test_var: "{{ hostvars.localhost.test_var }}"
  tasks:
    - debug:
        var: test_var

gives (debug output only)

ok: [localhost] => 
  test_var: foo

ok: [localhost] => 
  hostvars.localhost.test_var: VARIABLE IS NOT DEFINED!

ok: [localhost] => 
  hostvars.localhost.test_var: foo

ok: [xyz] => 
  test_var: foo

Test other sources, e.g.

shell> cat host_vars/localhost 
test_var: foo
- hosts: localhost
  tasks:
    - debug:
        var: test_var
    - set_fact:
        test_var: "{{ test_var }}"

- hosts: xyz
  vars:
    test_var: "{{ hostvars.localhost.test_var }}"
  tasks:
    - debug:
        var: test_var

gives (debug output only)

ok: [localhost] => 
  test_var: foo

ok: [xyz] => 
  test_var: foo
like image 165
Vladimir Botka Avatar answered Dec 16 '25 21:12

Vladimir Botka



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!