Ansible hostvars未定义

时间:2016-05-27 23:51:36

标签: ansible ansible-playbook ansible-2.x

我有一个非常简单的游戏,它可以节省变量,并在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中保存这些变量?

3 个答案:

答案 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']

引用the documentation

在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