Ansible 解析可解析输出的困难

Ansible 解析可解析输出的困难,ansible,Ansible,[ansible 2.9.6,Ubuntu 20.04] 这看起来很简单,但我一直收到一条错误消息,上面说: fatal: [192.168.254.100]: FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ipv4addrs.'host[0]'}}"} 这是我的ansible剧本: --- - hosts

[ansible 2.9.6,Ubuntu 20.04]

这看起来很简单,但我一直收到一条错误消息,上面说:

fatal: [192.168.254.100]: FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ipv4addrs.'host[0]'}}"}
这是我的ansible剧本:

---
- hosts: nios
  connection: local
  vars:
    nios_provider:
            host: 192.x.x.x
            username: xxx
            password: xxx
            wapi_version: "2.11.2"
            
  tasks:
    - name: Find client app server records
      set_fact:
        recs: "{{ lookup('nios', 'record:host', filter={'name~':'sdk' }, provider=nios_provider) }}"

    - name: check return
      debug:
         msg: "{{ recs }}"

    - name: get host name
      debug:
        var: ipv4addrs.'host[0]'
以下是输出:

TASK [check return] **************************************************************************************************************************************************************
ok: [192.x.x.x] => {
    "msg": [
        {
            "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LmNvbS5lYWdsZWFjY2Vzcy5zZGstZDAwMQ:sdk-d001.somename.com/default",
            "ipv4addrs": [
                {
                    "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQuY29tLmVhZ2xlYWNjZXNzLnNkay1kMDAxLjEwLjcwLjAuMS4:10.70.0.1/sdk-d001.somename.com/default",
                    "configure_for_dhcp": false,
                    "host": "sdk-d001.somename.com",
                    "ipv4addr": "10.70.0.1"
                }
            ],
            "name": "sdk-d001.somename.com",
            "view": "default"
        },
        {
            "_ref": "record:host/ZG5zLmhvc3QkLl9kZWZhdWx0LmNvbS5lYWdsZWFjY2Vzcy5zZGstZDAwMg:sdk-d002.somename.com/default",
            "ipv4addrs": [
                {
                    "_ref": "record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQuY29tLmVhZ2xlYWNjZXNzLnNkay1kMDAyLjEwLjcwLjAuMi4:10.70.0.2/sdk-d002.somename.com/default",
                    "configure_for_dhcp": false,
                    "host": "sdk-d002.somename.com",
                    "ipv4addr": "10.70.0.2"
                }
            ],
            "name": "sdk-d002.somename.com",
            "view": "default"
        }
    ]
}

TASK [get host name] ***************************************************************************************************************************************************************
fatal: [192.168.254.100]: FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ipv4addrs.'host[0]'}}"}
我的目标是找到所有以(例如)“sdk”开头的主机名。可能有一个或几个。然后我想把全名和ip地址作为变量捕获。我尝试了很多不同的选项:rec.ipv4addrs[0]。主机,ipv4addrs[0]。主机,rec.ipv4addrs[0]。“主机”,rec.ipv4addrs[0]。“主机”。但是我找不到正确的语法

这似乎是一个dict块数组,其中包含一个ipv4addrs数组。因此,我尝试的第一件事是“ipv4addrs[0]['host']”,但毫无乐趣


提前感谢您的帮助。

您试图使用名为
ipv4addrs
的变量,但是 尚未定义任何具有该名称的变量。从前
debug
任务您显然有一个名为
recs
的变量,它是一个 每个字典都包含
ipv4addrs
属性的字典列表

如果要查找中每个记录的
host
属性
recs
,您可以这样写:

    - name: get host name
      debug:
        var: item.ipv4addrs[0].host
      loop: "{{ recs }}"
如果需要第一条记录中的
ipv4addrs.host
值,可以 可以写:

    - name: get host name
      debug:
        var: recs[0].ipv4addrs[0].host

您看到的错误源于表达式
ipv4addrs.“主机[0]”
没有任何意义;这不是一个语法
可拆卸支架。不能使用带点符号的字符串。

我认为带
host
的缩进(空格)和其余属性都已禁用。更正一下,我不确定你的建议。我无法控制来自Infoblox API的输出。或者您是说我应该以某种方式以编程方式删除“host”:和“sdk.etc”之间的空格?感谢您的响应,但您的两个建议都会产生错误“VARIABLE IS NOT DEFINED”。-名称:按名称获取主机调试:var:item.ipv4addrs.host循环:“{{recs}”-名称:获取主机调试:var:recs[0]。ipv4addrs.host任务[获取IP地址]***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************"然后用您实际定义的变量名替换变量名。在您的问题中,您显示了一个名为
recs
的变量。结果是:recs[0]。ipv4addrs[0].host。这个问题只解决了一半,因为我不知道能找到多少个记录。很好地抓住了缺少的数组索引。我已经更新了答案。你的目标是什么?你想要第一个主机名吗?最后一个?你想对所有的主机名都做些什么吗?我正在向DNS框(Infoblox)发送查询查找以客户端ID(3个字符)为前缀的所有主机名。然后,我需要为找到的每个主机名创建一个NAT条目。可能只有1个,也可能有10个。我需要为找到的每个主机/IP地址分配一个变量,并将其传递给另一个playbook。