如何从Ansible Yaml中的清单文件访问组变量

时间:2018-10-23 14:53:22

标签: ansible ansible-inventory

我有一个清单文件,如下所示:

[example1]
H1 ip1 username1 
H2 ip2 username2
H3 ip3 username3

并且我已经定义了如下的组变量,以使该变量对该组中的所有主机通用:

[example1:vars]
temp='H2'

我正在尝试在主机字段下的ansible yml中访问此变量,如下所示:

---
 - name: temp playbook to practice hostvars
   hosts: "{{ hostvars['example1']['temp'] }}"
   tasks:
    .....
    .....
    ....

但是在执行此剧本时,出现如下所示的hostvars未定义错误:

"ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'hostvars' is undefined"

我的ansible文件和清单文件位于同一文件夹中,有人可以帮助我纠正从清单文件访问变量所缺少的内容吗?

2 个答案:

答案 0 :(得分:0)

请不要那样做。不好将具有“儿童”属性的组用于主机分组。

尽管如此,这是解决您的问题的方法。您尝试访问组的hostvar。您的清单中没有主机“ example1”。如您所见,hostvars具有用于host的变量。

以下代码将解决问题:

- hosts: localhost
  gather_facts: no
  tasks:
   - debug:
- hosts: '{{  hostvars[groups.example1[0]].temp }}'
  tasks:
     ...

我使用groups.example1来获取组example1中的主机列表,然后选择该组的第一个成员([0]),然后通过{{1 }}。

开始时带有hostvars的奇怪任务需要帮助Ansible初始化debug。没有它,它将失败,并出现不确定的变量错误。

但是,再次不要那样做。重塑群体的方式确实非常混乱。

答案 1 :(得分:0)

我知道这是一个老问题,但是刚刚找到了解决该问题的方法。只需在使用下一个任务或角色中使用hostvars之前放置此代码,就可以以某种方式将hostvars变量用于主机:定义。

- name: Do nothing
  hosts: all
  gather_facts: no
  become: no

似乎不需要run_once:是的(可能只是为了提高性能,如果有的话) 我不能说我了解幕后花絮,但似乎ansible(2.9、2.10)需要一些伪造的东西才能在下一个任务/角色中使用hostvars变量。