繁体   English   中英

如何从 ansible yaml 内的清单文件访问组变量

[英]How to access group variables from inventory file inside ansible yaml

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

[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:
    .....
    .....
    ....

但是在执行此剧本时,我收到了如下所示的主机变量未定义错误:

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

我的 ansible 文件和清单文件在同一个文件夹中,有人能帮我纠正我缺少的东西来访问清单文件中的变量吗?

请不要那样做。 这是糟糕的方式。 使用具有 'children' 属性的组进行主机分组。

不过,这里有一个解决您的问题的方法。 您已尝试访问组的主机变量。 您的清单中没有主机“example1”。 正如您所见,主机变量具有主机变量。

以下代码可以解决问题:

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

我使用groups.example1获取组example1中的主机列表,然后获取该组的第一个成员 ( [0] ),然后通过hostvars查看其变量。

开始时debug的奇怪任务需要帮助 Ansible 初始化hostvars 没有它,它将因未定义的变量错误而失败。

但是,再一次,不要那样做。 这真的,真的很糟糕,重塑团体的方式。

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

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

似乎不需要 run_once: 是的(也许只是为了一些性能改进,如果有的话)我不能说我理解引擎盖下的东西,但似乎 ansible (2.9, 2.10) 需要一些虚假的东西才能在下一个任务/角色中使用 hostvars 变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM