首页 > 解决方案 > 过滤 ansible JSON 输出

问题描述

我正在尝试从此 JSON 输出中提取特定的键/值

{
    "result": {
        "results": [
            {
                "changed": false,
                "datacenter_info": [
                    {
                        "name": "DC_1",
                        "moid": "datacenter-2",
                        "config_status": "gray",
                        "overall_status": "gray"
                    }
                ],
                "invocation": {
                    "module_args": {
                        "hostname": "vcenter_hostname_1",
                        "username": "XXXXX",
                        "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
                        "validate_certs": false
                    }
                },
                "ansible_facts": {
                    "discovered_interpreter_python": "/usr/libexec/platform-python"
                },
                "failed": false,
                "item": "vcenter_hostname_1",
                "ansible_loop_var": "item"
            },
            {
                "changed": false,
                "datacenter_info": [
                    {
                        "name": "DC_2_A",
                        "moid": "datacenter-2",
                        "config_status": "gray",
                        "overall_status": "gray"
                    },
                    {
                        "name": "DC_2_B",
                        "moid": "datacenter-3",
                        "config_status": "gray",
                        "overall_status": "gray"
                    },
                    {
                        "name": "DC_2_C",
                        "moid": "datacenter-3",
                        "config_status": "gray",
                        "overall_status": "gray"
                    }
                ],
                "invocation": {
                    "module_args": {
                        "hostname": "vcenter_hostname_2",
                        "username": "XXXXX",
                        "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
                        "validate_certs": false
                    }
                },
                "failed": false,
                "item": "vcenter_hostname_2",
                "ansible_loop_var": "item"
            }
        ],
        "msg": "All items completed",
        "changed": false
    },
    "_ansible_verbose_always": true,
    "_ansible_no_log": false,
    "changed": false
}

预期的输出是:

{
    [
        {
            "datacenter_info": [
                {
                    "name": "DC_1",
                    "moid": "datacenter-1",
                    "config_status": "gray",
                    "overall_status": "gray"
                }
            "vcenter": "vcenter_hostname_1",
        },
        {
            "datacenter_info": [
                {
                    "name": "DC_2_A",
                    "moid": "datacenter-2",
                    "config_status": "gray",
                    "overall_status": "gray"
                },
                {
                    "name": "DC_2_B",
                    "moid": "datacenter-3",
                    "config_status": "gray",
                    "overall_status": "gray"
                },
                {
                    "name": "DC_2_C",
                    "moid": "datacenter-4",
                    "config_status": "gray",
                    "overall_status": "gray"
                }
            ],
            "vcenter": "vcenter_hostname_2"
        }
    ]
}

我试过:

- name: Append string to list
  set_fact:
    formatted: "{{ formatted + [ item.item ] + [ item.datacenter_info ] }}"

它非常接近,但我无法插入钥匙vcenter并且我丢失了钥匙datacenter_info

标签: ansible

解决方案


我不知道formatted包含什么,但我相信您正在寻找的是:

- name: Append string to list
  set_fact:
    formatted: '{{ formatted + [{"vcenter": item.item, "datacenter_info": item.datacenter_info}] }}'
  with_items: '{{ result.results }}'

推荐阅读