这是一个字符串/json/可解析的问题.

总体情况:我正在创建VPC,添加一些安全组,并创建一些VM.

下面的示例可以很好地处理如下所示的输出.但是,我需要标记新创建的安全组ID,以便我可以使用它们来创建VM.

- name: Create an VPC and some security groups and show the security group ID
  hosts: localhost
  vars:
    security_groups: []
    aws_region: "us-east-1"

  tasks:
    - name: "Create VPC test in AWS"
      amazon.aws.ec2_vpc_net:
        name: "test_vpc"
        cidr_block: "10.5.2.0/24"
        state: present
        region: "us-east-1"
      register: create_vpc_output

    - name: "Set VPC ID as fact"
      ansible.builtin.set_fact:
        vpc_id: "{{ create_vpc_output.vpc.id }}"

    - name: "Configuring security groups for VPC {{ vpc_id }}"
      amazon.aws.ec2_security_group:
        name: "{{ item.value.name }}"
        description: "{{ item.value.description }}"
        tags:
          Name: "{{ item.value.name }}"
        state: present
        vpc_id: "{{ vpc_id }}"
        region: "{{ aws_region }}"
      loop: "{{ query('dict', vpc_security_groups) }}"
      register: "create_sg_output"

      vars:
        vpc_security_groups:
          private_test1:
            name: "test1"
            description: "Allow all connections"
          private_test2:
            name: "test2"
            description: "Allow all connections"


    - name: Extract group_id and group_name
      set_fact:
        sg_groups: "{{ create_sg_output.results | map(attribute='group_id') | zip(create_sg_output.results | map(attribute='group_name')) }}"

    - name: Display extracted groups
      debug:
        var: sg_groups

结果:

TASK [Display extracted groups] ****************************************************************************************
ok: [localhost] => {
    "sg_groups": [
        [
            "sg-08xxxxxxxxxxxxxxxx",
            "test1"
        ],
        [
            "sg-05xxxxxxxxxxxxxxxx",
            "test2"
        ]
    ]
}

我如何调整它,使输出如下所示:

    "sg_groups": [
        {
            "group_id" : "sg-08xxxxxxxxxxxxxx",
            "group_name" : "test1"
        },
        {
            "group_id": "sg-05xxxxxxxxxxxxxx",
            "group_name" : "test2"
        }
    ]
}

注意添加的‘group_id’和‘group_name’,它们是从ec2_security_group调用返回的json中的数据的标签.

推荐答案

有更多选项:

  sg_groups: "{{ create_sg_output.results|
                 json_query('[].{group_id: group_id,
                                 group_name: group_name}') }}"

给你想要的

  sg_groups:
    [
        {
            "group_id": "sg-08",
            "group_name": "test1"
        },
        {
            "group_id": "sg-05",
            "group_name": "test2"
        }
    ]

此选项允许您重命名属性.有关详细信息,请参见JMESPath Specification.

  sg_groups: "{{ create_sg_output.results|
                 ansible.utils.keep_keys(target=['group_id', 'group_name']) }}"

完整的测试攻略示例

- hosts: localhost

  vars:

    create_sg_output:
      results:
        - group_id: sg-08
          group_name: test1
        - group_id: sg-05
          group_name: test2

    sg_groups: "{{ create_sg_output.results|map(attribute='group_id')|
                   zip(create_sg_output.results|map(attribute='group_name')) }}"

    sg_group2: "{{ create_sg_output.results|
                   json_query('[].{group_id: group_id,
                                   group_name: group_name}') }}"

    sg_group3: "{{ create_sg_output.results|
                   ansible.utils.keep_keys(target=['group_id', 'group_name']) }}"

  tasks:

    - debug:
        var: sg_groups

    - debug:
        var: sg_group2|to_nice_json

    - debug:
        var: sg_group3|to_nice_json

  • 如果group_id的值是唯一的,则最简单的选项是过滤器items2dict
  sg_groups_dict: "{{ create_sg_output.results|
                      items2dict(key_name='group_id',
                                 value_name='group_name') }}"

给了词典

  sg_groups_dict:
    sg-05: test2
    sg-08: test1

您可以迭代词典

    - debug:
        msg: "{{ item.key }} {{ item.value }}"
      with_dict: "{{ sg_groups_dict }}"

给予(删节)

ok: [localhost] => (item={'key': 'sg-08', 'value': 'test1'}) => 
  msg: sg-08 test1
ok: [localhost] => (item={'key': 'sg-05', 'value': 'test2'}) => 
  msg: sg-05 test2

如果您想要将词典转换为列表,请使用过滤器dict2items

  sg_groups: "{{ sg_groups_dict|
                 dict2items(key_name='group_id',
                            value_name='group_name') }}"

给出了预期结果

  sg_groups:
    [
        {
            "group_id": "sg-08",
            "group_name": "test1"
        },
        {
            "group_id": "sg-05",
            "group_name": "test2"
        }
    ]

完整的测试攻略示例

- hosts: localhost

  vars:

    create_sg_output:
      results:
        - group_id: sg-08
          group_name: test1
        - group_id: sg-05
          group_name: test2

    sg_groups_dict: "{{ create_sg_output.results|
                        items2dict(key_name='group_id',
                                   value_name='group_name') }}"
    sg_groups: "{{ sg_groups_dict|
                   dict2items(key_name='group_id',
                              value_name='group_name') }}"

  tasks:

    - debug:
        var: sg_groups_dict

    - debug:
        var: sg_groups|to_nice_json

    - debug:
        msg: "{{ item.key }} {{ item.value }}"
      with_dict: "{{ sg_groups_dict }}"

Json相关问答推荐

如何使用Laravel在MariaDB JSON kolumn中使用unicode字符

如何使用PowerShell从ExchangeOnline命令执行中获得JSON输出

使用 jolt 变换展平嵌套 JSON - 非常复杂

Jolt Spec 跳过数组中的第一个元素

XSLT 3.0 Json-to-xml,json 包含 html struct

APIM 生成 JsonArray 到 EventHub

匹配来自不同数组的值

如何编写 jolt 规范以将不同的对象转换为数组

嵌套存储在字符串变量中的 JSON 对象

根据数据框中的其他列值将列表 json 对象插入行

如何在生产环境中更改 Flutter 应用程序中的数据模型?

如何将西里尔字母转换为 utf16

Jolt - 在同一级别添加时组合值的问题

如何在 jQuery 中循环遍历 JSON 数组?

读取 HttpwebResponse json 响应,C#

将文件发送到 Rails JSON API

使用 ajax 将 JSON 发送到 PHP

如何按键查找特定的 JSON 值?

可以在 SharedPreferences 中保存 JSON 数组吗?

处理 HTTP 请求正文中的可选 JSON 字段