Reddy Bhavani Prasad
Reddy Bhavani Prasad

Reputation: 1115

How to use variables defined through vars_prompt of one host in another host vars?

I am having 2 plays in a playbook. One of them prompts for input from user and I want to use that variable in another play. Please suggest me how to do that

---
- hosts: workers
  gather_facts: false
  sudo: true
  vars_prompt:
     - name: "server_ip"
       prompt: "Enter the Server IP"
       private: no

  roles:
    - client-setup-worker

- hosts: master
  gather_facts: false
  sudo: true
  vars:
    server: "{{ hostvars['workers']['server_ip'] }}"

  roles:
    - client-setup-master

In the above playbook I want to use server_ip defined in workers hosts to be used in master hosts.

I am facing the error "The error was: \"hostvars['workers']\" is undefined" while doing so

Upvotes: 1

Views: 1238

Answers (2)

mdaniel
mdaniel

Reputation: 33203

I am facing the error "The error was: \"hostvars['workers']\" is undefined" while doing so

That's because workers is evidently a group, and not a host, which is the only thing one will find declared in hostvars

You'll need to grab one of the hosts at random from the workers group, and then extract its fact; I believe this will do that:

update after seeing the mostly correct answer by @VladimirBotka

- hosts: workers
  vars_prompt:
  # as before ...
  pre_tasks:
  - name: re-export the vars_prompt for cross playbook visibility
    set_fact:
      server_ip: '{{ server_ip }}'
  roles:
  # as before

- hosts: masters
  vars:
    server: '{{ hostvars[(groups.workers|first)].server_ip }}'

Upvotes: 2

Vladimir Botka
Vladimir Botka

Reputation: 68044

The scope of variables declared in vars_prompt is the play.

Such variable may be put into the hostvars by set_facts "to use that variable in another play". For example the play below

- hosts: test_01
  gather_facts: false
  vars_prompt:
     - name: "server_ip"
       prompt: "Enter the Server IP"
       private: no
  tasks:
    - set_fact:
        stored_server_ip: "{{ server_ip }}"
    - debug:
        var: stored_server_ip

- hosts: test_02
  gather_facts: false
  vars:
    server: "{{ hostvars.test_01.stored_server_ip }}"
  tasks:
    - debug:
        var: server

gives (abridged):

ok: [test_01] => {
    "stored_server_ip": "10.1.0.10"
}
ok: [test_02] => {
    "server": "10.1.0.10"
}

Upvotes: 1

Related Questions