在 Windows 机器上运行时在 Ansible 上"Undefined variable"错误



这是一个非常简单的Ansible剧本,我从AWX上运行它来获取有关主机的信息,它在Linux机器上正常工作:

---
- name: Get some info
debug:
msg: "{{ ansible_hostname }} {{ ansible_default_ipv4.address }} {{ ansible_distribution }}"

但是,当在Windows机器上运行时,它返回这个错误:

fatal: [MYWINHOST1]: FAILED!=比;{"msg": "任务包含一个未定义变量的选项。错误是:'ansible_default_ipv4'未定义nn错误出现在'/tmp/bwrap_21138_4q41r57e/awx_21138_is8pox6p/project/roles/windows/tasks/getsomeinfo。Yml ':第3行,第3列,但可能在文件的其他地方,这取决于确切的语法问题。nnn- name: Get some infon ^ heren"}

如何从Windows机器访问和打印相同的Ansible facts值?

来自文档:

ansible_facts

这个键应该包含一个字典,它将被附加到分配给主机的事实。这些都可以直接访问,不需要使用注册变量。

<一口> 来源:https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html ansible-facts

因此,如果打印hostvars[inventory_hostname]显示了一个变量ansible_facts.ip_addresses,那么您可以通过ansible_ip_addresses访问它-如果该节点只有一个分配的IP地址,请参见下面的情况:

- debug:
msg: >-
{{ ansible_hostname }} 
{{ ansible_ip_addresses }} 
{{ ansible_distribution }}

,Ansible跟踪器报告了一个关于Windows机器有多个IP地址的错误,并且它似乎不像真正的默认IP地址那样微不足道:

这个问题真的没有一个很好的解决方案——"默认IP地址"的概念;对不同的人来说意味着不同的东西,Linux的事实是错的,也是对的。通常,这归结为定位特定子网上的地址,我们必须过滤以帮助给定的IP地址列表…考虑到这一点不明确,我将结束这个问题。

来源:nitzmahone对这个问题的评论https://github.com/ansible/ansible/issues/17014


因此,为了澄清问题,Windows和Linux中的事实收集并没有实现相同的变量,您当然可以解决这个问题,实现inline-if:

- debug:
msg: >-
{{ ansible_hostname }} 
{{ 
ansible_ip_addresses 
if ansible_os_family == "Windows" 
else ansible_default_ipv4.address 
}}
{# 
Mind that you still have to implement your own logic 
of what is the "default" IP if you have more 
than one IP address on that Windows machine, as linked above
#}
{{ ansible_distribution }}

我要做的第一件事是使用新的符号(消除任何由于误解而导致失败的可能性):

---
- name: Gather Info
hosts: all
gather_facts: yes
tasks:
- name: Get some info
debug:
msg: "{{ ansible_hostname }} {{ ansible_default_ipv4['address'] }} {{ ansible_distribution }}"

除非你使用像redis/memcache这样的缓存机制,否则有时需要一些时间来获取结果,而获取最少的事实可能会更有效。

为了解决这个问题,我不能提供太多帮助,但是如果在windows模块中有一个关闭的错误,只有开发人员可以在这里提供帮助,因为Ansible团队可以以某种方式解决这个问题,或者您可能需要为您的需求开发一个小模块。

更新# 1:

在我看来,如果你收集一个子集,你会错过一些你需要的信息…

如果您激活了gather_facts,它不会失败与The error was: 'ansible_default_ipv4' is undefined

更新# 2:

关于你的错误信息,看起来一些复制的东西没有正确对齐。

关于如何访问变量:

pre_tasks:
- name: Collect only minimum facts.
ansible.builtin.setup:
gather_subset: "!all"
register: facts

当我注册集合时,我使用:facts.ansible_facts.ansible_domain来获取域。也许这能让你对如何获得你需要的变量有足够的了解。

最新更新