这是一个非常简单的Ansible剧本,我从AWX运行它来获取有关主机的信息,它在Linux机器上按预期工作:
---
- name: Get some info
debug:
msg: "{{ ansible_hostname }} {{ ansible_default_ipv4.address }} {{ ansible_distribution }}"
但是,在Windows计算机上运行时,它会返回以下错误:
致命错误:[MYWINHOST 1]:失败!=〉{“消息”:“任务包含一个带有未定义变量的选项。错误为:未定义“ansible_default_ipv4”\n\n错误出现在“/tmp/bwrap_21138_4q41r57e/awx_21138_is8pox6p/项目/角色/窗口/任务/getsomeinfo. yml”中:第3行第3列,但可能\n位于文件的其他位置,具体取决于语法问题。\n\n出错行可能是:\n\n\n- name:获取一些信息\n ^此处\n”}
如何从Windows计算机访问和打印相同的Ansible事实值?
2条答案
按热度按时间mkshixfv1#
来自文档:
可能的事实
这个键应该包含一个字典,它将被附加到分配给主机的事实上。这些事实将是直接可访问的,并且不需要使用注册变量。
因此,如果打印
hostvars[inventory_hostname]
显示变量ansible_facts.ip_addresses
,则可以通过ansible_ip_addresses
访问它-如果该节点仅分配了一个IP地址,请参阅下面的内容。这个问题真的没有一个很好的解决方案-"默认IP地址"的概念对不同的人有不同的含义,Linux的事实是错误的,因为它是正确的。通常这归结为定位一个地址在一个特定的子网,我们必须过滤器,以帮助给定的IP地址列表...鉴于缺乏明确的这一点,我打算结束这个问题。
因此,为了澄清事实,Windows和Linux中收集的事实并没有实现相同的变量,您当然可以解决这个问题,实现一个inline-if:
sycxhyv72#
我要做的第一件事是使用新的符号(消除任何由于误解而导致失败的可能性):
除非你使用像redis/memcache这样的缓存机制,否则有时候获取结果需要一些时间,而获取最少的事实可能更有效。
为了解决这个问题,我不能提供太多帮助,但如果在windows模块中有一个bug关闭,只有开发人员可以在这里提供帮助,因为Ansible团队可以以某种方式解决这个问题,或者您可能需要开发一个小模块来满足您的需要。
更新#1:
对于我所看到的如果你收集一个子集,你错过了一些你需要的信息...
如果您激活gather_factors,它不会失败并显示
The error was: 'ansible_default_ipv4' is undefined
。更新#2:
关于你的错误信息,看起来像是复制的东西没有正确对齐。
关于如何访问变量:
注册集合时,我用途:
facts.ansible_facts.ansible_domain
来获取域。也许这能给予你对如何获取你需要的变量有足够的了解。