【问题标题】:ansible json_query multiple valuesansible json_query 多个值
【发布时间】:2020-11-25 19:18:57
【问题描述】:

从之前在 ansible 中的 GET api 调用,我得到了一个 json 结果。

api 调用如下所示:

- name: Refresh Datadog monitors list
  uri:
    url: http://my.api.com
    return_content: yes
    method: GET
    status_code: 200
    headers:
      Content-Type: "application/json"
  register: results

结果看起来像这样(虚拟数据):

[{
    "name": "bob",
    "id": 13590804,
    "colour": "blue",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "john",
    "id": 123124515,
    "colour": "green",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "carl",
    "id": 3252532,
    "colour": "orange",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
},
{
    "name": "louis",
    "id": 5675467,
    "colour": "purple",
    "created": "2019-11-21T07:41:33.148976+00:00",
    "modified": "2019-11-21T07:41:33.148976+00:00",
    "overall_state_modified": "2019-11-25T06:45:08+00:00",
    "overall_state": "OK"
}]

在后续步骤中,我希望从 json 中仅提取两个值,使其看起来像:

[{
        "name": "bob",
        "id": 13590804
    },
    {
        "name": "john",
        "id": 123124515
    },
    {
        "name": "carl",
        "id": 3252532
    },
    {
        "name": "louis",
        "id": 5675467
    }
]

我已尝试从不同来源进行多次迭代以尝试获得此结果,例如:

- name: "Display all id's with names"
  debug: msg = "{{ results | json_query '[id, names]')}}"

和

- name: "Display all id's with names"
  debug: msg = "{{ results | json_query '[*][id, names]')}}"

我可以理解我对 jmespath 的了解存在差距,但文档有点压倒性,我无法找到确切的解决方案。

【问题讨论】:

    标签: ansible jmespath json-query


    【解决方案1】:

    您正在查找 JMESPath 文档中引用为 filters and multiselect hashes 的部分。

    所以你的任务应该是:

    - name: "Display all id's with names"
      debug: 
        msg: "{{ results | json_query('[*].{id: id, name: name}') }}"
    

    鉴于剧本:

    - hosts: all
      gather_facts: no  
            
      tasks:
        - debug:
            msg: "{{ results | json_query('[*].{id: id, name: name}') }}"
          vars:
            results: 
              - name: bob
                id: 13590804
                colour: blue
                created: 2019-11-21T07:41:33.148976+00:00
                modified: 2019-11-21T07:41:33.148976+00:00
                overall_state_modified: 2019-11-25T06:45:08+00:00
                overall_state: OK
              - name: john
                id: 123124515
                colour: green
                created: 2019-11-21T07:41:33.148976+00:00
                modified: 2019-11-21T07:41:33.148976+00:00
                overall_state_modified: 2019-11-25T06:45:08+00:00
                overall_state: OK
              - name: carl
                id: 3252532
                colour: orange
                created: 2019-11-21T07:41:33.148976+00:00
                modified: 2019-11-21T07:41:33.148976+00:00
                overall_state_modified: 2019-11-25T06:45:08+00:00
                overall_state: OK
              - name: louis
                id: 5675467
                colour: purple
                created: 2019-11-21T07:41:33.148976+00:00
                modified: 2019-11-21T07:41:33.148976+00:00
                overall_state_modified: 2019-11-25T06:45:08+00:00
                overall_state: OK
    

    这个输出:

    PLAY [all] ********************************************************************************************************
    
    TASK [debug] ******************************************************************************************************
    ok: [localhost] => {
        "msg": [
            {
                "id": 13590804,
                "name": "bob"
            },
            {
                "id": 123124515,
                "name": "john"
            },
            {
                "id": 3252532,
                "name": "carl"
            },
            {
                "id": 5675467,
                "name": "louis"
            }
        ]
    }
    
    PLAY RECAP ********************************************************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    【讨论】:

    • 谢谢你,这工作得很好。最初我确实遇到了挑战,但那是因为我没有将所有输出粘贴到我的问题中。最终版本是:味精:“{{ results.json | json_query('[*].{id: id, name: name}') }}”
    • 或msg: "{{ results | json_query('json[*].{id: id, name: name}') }}" 实际上比上面链接的文档示例更接近。如果这是您正在寻找的答案,请考虑accepting it。
    猜你喜欢
    • 2023-03-25
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多