我有一个清单文件,如下所示:
[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文件和清单文件位于同一文件夹中,有人可以帮助我纠正从清单文件访问变量所缺少的内容吗?
答案 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变量。