从ansible json_query中删除括号

时间:2017-05-17 18:11:35

标签: ansible

我正在尝试解析ansible中的json,我得到了我需要的值,但输出是一个数组。我怎样才能获得价值?

示例json:

{
"Version": "2015-08-13",
"Accounts": [{
    "AccountName": "account1",
    "Regions": [{
        "RegionName": "region1",
        "RegionId": "region1",
        "RegionDetails": [{
            "id": "id1",
            "version": "v1"
        }, {
            "id": "id2",
            "version": "v2"
        }]
    }]
}, {
    "AccountName": "account2",
    "Regions": [{
        "RegionName": "region1",
        "RegionId": "region1",
        "RegionDetails": [{
            "id": "id1",
            "version": "v1"
        }, {
            "id": "id2",
            "version": "v2"
        }]
    }]
}]
}

Ansible playbook示例:

    - name: Set Global Vars
      hosts: localhost
      tasks:    
        - name: print json file
          debug:
            msg: "{{ (lookup('file','./example.json') | from_json) | json_query(query) }}"
          vars:
            query: "Accounts[?AccountName=='account1'][Regions[?RegionName=='region1'].RegionId]"
      register: region_id

Ansible输出:

    TASK [print json file] *********************************************************
ok: [localhost] => {
    "msg": [
        [
            [
                "region1"
            ]
        ]
    ]
}

正如您所看到的,'region1'值仍然是嵌套的。我怎样才能获得价值?

谢谢!

1 个答案:

答案 0 :(得分:2)

您的原始数据包含嵌套列表:Accounts是一个列表,每个帐户都包含Regions列表。

使用您的JMESPath查询,您可以按某些条件过滤列表,但结果仍然是列表,因为您的数据可能包含多个名为AccountName=='account1'的帐户。

如果您只对该帐户的第一个找到的帐户和首次找到的地区感兴趣,可以按如下方式修改查询:

Accounts[?AccountName=='account1'] | [0].Regions[?RegionName=='region1'] | [0].RegionId