"Undefined variable" 当 运行 超过 Windows 台机器时 Ansible 出错

"Undefined variable" error on Ansible when run over Windows machines

这是我 运行 来自 AWX 的一个非常简单的 Ansible 剧本,用于获取有关主机的信息,它在 Linux 台机器上按预期工作:

---

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

但是,当 运行 超过 Windows 台机器时,它 returns 这个错误:

fatal: [MYWINHOST1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible_default_ipv4' is undefined\n\nThe error appears to be in '/tmp/bwrap_21138_4q41r57e/awx_21138_is8pox6p/project/roles/windows/tasks/getsomeinfo.yml': line 3, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Get some info\n ^ here\n"}

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

来自文档:

ansible_facts

This key should contain a dictionary which will be appended to the facts assigned to the host. These will be directly accessible and don’t require using a registered variable.

来源: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 地址是什么一样:

There's really not a great solution to this issue- the concept of a "default IP address" means different things to different people, and the Linux fact is wrong as much as it's right. Usually this comes down to locating an address on a particular subnet, which we have to filters to assist with given the list of IP addresses... Given the lack of clarity on this, I'm going to close this issue.

来源:nitzmahone's comment on the issue https://github.com/ansible/ansible/issues/17014

我要做的第一件事是使用新的表示法(消除任何因误解而失败的可能性):

---
- 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

当我注册 collection 时,我使用:facts.ansible_facts.ansible_domain 来获取域名。也许这会让您对如何获得所需的变量有足够的了解。