【问题标题】:Ansible json_query different result in python3 vs python2Ansible json_query 在 python3 和 python2 中的不同结果
【发布时间】:2019-11-20 00:43:40
【问题描述】:

我从 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 下运行相同返回空列表

【问题讨论】:

    标签: ansible json-query


    【解决方案1】:

    我没有花时间去挖掘问题的根源,但是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') }}"
    

    【讨论】:

    • 解决方案 1 对我有用,谢谢。我不能使用解决方案 2,因为在这种情况下主机名总是不同的,基于模块的结果
    • 很高兴我能帮上忙。如果这正在解决您的问题,您应该接受答案,以便其他用户知道它已解决,并最终支持 the way to say thanks you on SO in favor of comments
    猜你喜欢
    • 2020-02-05
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多