"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
来获取域名。也许这会让您对如何获得所需的变量有足够的了解。
这是我 运行 来自 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
来获取域名。也许这会让您对如何获得所需的变量有足够的了解。