使用json查询ansible从json中提取多个值

使用json查询ansible从json中提取多个值,json,ansible,Json,Ansible,我有以下输出(代码段): msg: "{{ item }}" with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}" 当我尝试获取状态值时: msg: "{{ output.ansible_facts.openstack_servers | json_query('[].status')}}"

我有以下输出(代码段):

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
当我尝试获取状态值时:

      msg: "{{ output.ansible_facts.openstack_servers | json_query('[].status')}}"
      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
它很好用

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
我想提取几个值,但以下操作无效:

      msg: "{{ output.ansible_facts.openstack_servers | json_query('[status, flavor, az]')}}"
      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
我的语法有什么问题?

仔细阅读,他们确实有一个可能与您相关的示例

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
给定数据结构:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
它们提供了一个查询多个值的示例,这些值作为散列映射到结果输出

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
在本例中,我们得到了一个包含所有端口和端口名的哈希映射 群集:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
请注意,他们只是使用
vars:
来定义查询,表面上是为了可读性,但重要的一点就在这里:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
domain.server[?cluster=='cluster2']。{name:name,port:port}

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
因此,他们正在查询domain.server(这是一个字典列表,每个字典都具有相同的属性),只选择
cluster
值为
cluster2
的字典,然后为每个字典返回
name
作为
name
port
作为
port

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
在本例中,您希望返回多个属性,但不希望选择具有特定值的项。因此,您可以使用更类似于:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
msg: "{{ my_var | json_query('domain.server[*].{name: name, cluster: cluster}') }}"
我得到的结果是:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
    "msg": [
        {
            "cluster": "cluster1",
            "name": "server11"
        },
        {
            "cluster": "cluster1",
            "name": "server12"
        },
        {
            "cluster": "cluster2",
            "name": "server21"
        },
        {
            "cluster": "cluster2",
            "name": "server22"
        }
    ]
TLDR:根据您的具体问题和用例,我相信您想要的是:

      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"
      msg: "{{ output.ansible_facts.openstack_servers | json_query('[*].{status: status, flavor: flavor, az: az}') }}"

谢谢,希望对你有帮助

非常感谢!它起作用了。那正是我想要的。
      msg: "{{ item }}"
    with_items: "{{ output.ansible_facts.openstack_servers.content | from_json | json_query('[status, flavor]') }}"