在Windows计算机上运行时,Ansible上出现“未定义变量”错误

j9per5c4  于 2022-12-30  发布在  Windows
关注(0)|答案(2)|浏览(202)

这是一个非常简单的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事实值?

mkshixfv

mkshixfv1#

来自文档:

可能的事实

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

  • Source: 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地址列表...鉴于缺乏明确的这一点,我打算结束这个问题。

因此,为了澄清事实,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 }}
sycxhyv7

sycxhyv72#

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

---
- 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模块中有一个bug关闭,只有开发人员可以在这里提供帮助,因为Ansible团队可以以某种方式解决这个问题,或者您可能需要开发一个小模块来满足您的需要。
更新#1:
对于我所看到的如果你收集一个子集,你错过了一些你需要的信息...
如果您激活gather_factors,它不会失败并显示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来获取域。也许这能给予你对如何获取你需要的变量有足够的了解。

相关问题