Ansible Json 查询

Ansible Json 查询

我从一个 Ansible 任务中得到了如下的字典输出“

msg": {
        "vSwitch0": {
            "failback": true,
            "failover_active": [
                "vmnic1",
                "vmnic0"
            ],
            "failover_standby": [],
            "failure_detection": "link_status_only",
            "lb": "loadbalance_srcid",
            "mtu": 1500,
            "notify": true,
            "num_ports": 128,
            "pnics": [
                "vmnic0",
                "vmnic1"
            ],
            "security": [
                false,
                false,
                false
            ],
            "ts": false
        }
    }
}

我尝试使用 Json Query 将上述输出存储在变量中作为“all_vswitch_info”,并尝试提取如下所示的 pnics 列表,当我现在使用下面的内容时,

  • 调试:消息:“{{all_vswitch_info| json_query('pnics')}}”

我得到的是空值

ok: [localhost] => {
    "msg": ""
}

注意:我尝试使用其他选项作为消息:“{{all_vswitch_info| json_query('[].pnics')}}”,但仍然得到相同的结果

ok: [localhost] => {
    "msg": ""
}

是否缺少了什么?注意:此特定输出包含 vSwitch0。在某些情况下,这可能是任何名称,例如 vswitch23 或 vswitch 3,或者使用其他名称。我无法在 json_query 中将名称硬编码为 vSwitch0。但是,物理是每个目标机器不会改变的属性名称。

答案1

正确的json_查询将会

  pnics: "{{ all_vswitch_info|json_query('*.pnics') }}"

给出

  pnics:
  - - vmnic0
    - vmnic1

您可以使用以下方式展平列表:json_查询

  pnics: "{{ all_vswitch_info|json_query('*.pnics|[]') }}"

或使用过滤器压平

  pnics: "{{ all_vswitch_info|json_query('*.pnics')|flatten }}"

两种选择均

  pnics:
  - vmnic0
  - vmnic1

完整测试剧本的示例

- hosts: localhost

  vars:

    all_vswitch_info:
      vSwitch0:
        failback: true
        failover_active:
        - vmnic1
        - vmnic0
        failover_standby: []
        failure_detection: link_status_only
        lb: loadbalance_srcid
        mtu: 1500
        notify: true
        num_ports: 128
        pnics:
        - vmnic0
        - vmnic1
        security:
        - false
        - false
        - false
        ts: false

    pnics: "{{ all_vswitch_info|json_query('*.pnics') }}"

  tasks:

    - debug:
        var: pnics

相关内容