1

从 python2 迁移到 python3 后,我遇到了一个问题。似乎迁移以某种方式改变了处理 json 查询的方式。也许有人暗示如何解决这个问题

vars:
vmk_out: 
  host_vmk_info:
    hostname: 
      [
            {
                ipv4_address: "10.10.10.101",
                ipv4_subnet_mask: "255.255.255.0",
                stack: "defaultTcpipStack"
            },
            {
                ipv4_address: "10.10.20.101",
                ipv4_subnet_mask: "255.255.255.0",
                stack: "vmotion"
            }
        ]
tasks:
  - name: Extract list of IPs 
    set_fact:
      output: "{{ vmk_out.host_vmk_info.values() |json_query('[].ipv4_address') }}"

上面在 Python2 下运行,Ansible 2.9.1 返回 IP 地址列表,但在 Python3 下运行相同返回空列表

4

1 回答 1

0

没花时间去深究问题的根源,但是values()python 2.7和3.x的函数返回显然是有区别的。

这是直接调试或vmk_out.host_vmk_info.values()我的测试中的样子:

ansible 2.9.1 - python 3.6

ok: [localhost] => {
    "msg": "dict_values([[{'ipv4_address': '10.10.10.101', 'ipv4_subnet_mask': '255.255.255.0', 'stack': 'defaultTcpipStack'}, {'ipv4_address': '10.10.20.101', 'ipv4_subnet_mask': '255.255.255.0', 'stack': 'vmotion'}]])"
}

ansible 2.9.1 - python 2.7

ok: [localhost] => {
    "msg": [
        [
            {
                "ipv4_address": "10.10.10.101", 
                "ipv4_subnet_mask": "255.255.255.0", 
                "stack": "defaultTcpipStack"
            }, 
            {
                "ipv4_address": "10.10.20.101", 
                "ipv4_subnet_mask": "255.255.255.0", 
                "stack": "vmotion"
            }
        ]
    ]
}

您有 2 个解决方案来修复您当前的代码并使其与两个版本兼容。

解决方案 1:确保values()总是产生一个列表的输出:

output: "{{ vmk_out.host_vmk_info.values() | list | json_query('[].ipv4_address') }}"

解决方案2:停止使用values()并直接映射现有hostname列表

output: "{{ vmk_out.host_vmk_info.hostname | json_query('[].ipv4_address') }}"
于 2019-11-19T14:00:27.760 回答