Ansible json_query在python3和python2中的不同结果

时间:2019-11-19 13:36:25

标签: ansible json-query

从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') }}"

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

1 个答案:

答案 0 :(得分:0)

我没有花时间去探究问题的根源,但是在Python 2.7和3.x之间,values()函数的返回显然存在差异。

这是我的测试中的直接调试或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') }}"