如何在另一台主机vars中使用通过一台主机的vars_prompt定义的变量?

时间:2019-05-28 04:57:52

标签: ansible

我在剧本中有2部戏。其中一个提示用户输入,我想在另一个游戏中使用该变量。请建议我该怎么做

---
- 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

在上面的剧本中,我想使用在工作主机中定义的server_ip来在主主机中使用。

这样做时我遇到错误“错误是:\“ hostvars ['workers'] \”未定义“

2 个答案:

答案 0 :(得分:1)

  

这样做时我遇到错误“错误是:\“ hostvars ['workers'] \”未定义“

这是因为workers显然是一个组,而不是 host ,这是在 host vars

中声明的唯一内容

您需要从workers组中随机抽取一台主机,然后提取其事实;我相信这样做会做到:

在看到由@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 }}'

答案 1 :(得分:0)

vars_prompt 中声明的变量scope播放

可以通过 set_facts 将此类变量放入 hostvars 中,以“在另一个游戏中使用该变量”。例如下面的播放

- 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

给予(节略):

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