我在剧本中有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'] \”未定义“
答案 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"
}