我有一个非常简单的游戏,它可以节省变量,并在hostvars中查找它们。
- name: Set hostvars
hosts: localhost
vars:
var_one: "I am a"
var_two: "test"
tasks:
- debug: var=hostvars['localhost']['var_one']
- debug: var=hostvars['localhost']['var_two']
但是,当我运行此游戏时,未定义变量:
PLAY [Set hostvars] ************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"hostvars['localhost']['var_one']": "VARIABLE IS NOT DEFINED!"
}
TASK [debug] *******************************************************************
ok: [localhost] => {
"hostvars['localhost']['var_two']": "VARIABLE IS NOT DEFINED!"
}
如何在hostvars中保存这些变量?
答案 0 :(得分:3)
您可以使用set_fact模块设置主机事实运行时:
---
- name: Set hostvars
hosts: localhost
tasks:
- set_fact: var_one="I am a"
- set_fact: var_two="test"
- debug: var=hostvars['localhost']['var_one']
- debug: var=hostvars['localhost']['var_two']
在Ansible运行期间,这些变量将在播放之间存在,但即使您使用事实缓存,也不会在执行中保存。
答案 1 :(得分:0)
尝试使用
msg =
而不是var =。根据调试模块的帮助
var - A variable name to debug. Mutually exclusive with the 'msg' option.
- name: Set hostvars
hosts: localhost
vars:
var_one: I am a
var_two: est
tasks:
- debug: msg=hostvars['localhost']['var_one']
- debug: msg=hostvars['localhost']['var_two']
...
PLAY [Set hostvars] ************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "hostvars['localhost']['var_one']"
}
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "hostvars['localhost']['var_two']"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
答案 2 :(得分:0)
这是可以看到事实(与Ansible目标主机绑定的变量)和常规变量之间的差异。
变量在内部存储在vars
结构中,因此您可以使用以下命令访问它们:
tasks:
- debug: var=vars['var_one']
- debug: var=vars['var_two']
另一方面,事实存储在hostvars
。
在任何一种情况下,除非你指的是带有动态名称的变量名,或者绑定到另一个主机而不是执行任务的主机,你可以简单地使用变量/ fact name来命名:
tasks:
- debug: var=var_one
- debug: var=var_two