Ansible / jmespath - 字典压缩列表的第一个列表

Ansible / jmespath - 1d list to zipped list of dictionaries

我正在尝试将一维 AWS EC2 ID 列表转换为适合用作 Ansible elb_target_group 模块的 targets 参数的字典列表。

示例输入:

TASK [debug]
ok: [localhost] => {
    "instance_ids": [
        "i-1111",
        "i-2222",
        "i-3333"
    ]
}

期望的输出:

TASK [debug]
ok: [localhost] => {
    "targets": [
        {"Id": "i-1111", "Port": 6443},
        {"Id": "i-2222", "Port": 6443},
        {"Id": "i-3333", "Port": 6443},
    ]
}

我试过的:json_query/JMESPath 表达式令人困惑 returnsnull 值:

---

- name: test
  hosts: localhost
  connection: local
  vars:
    instance_ids:
      - i-1111
      - i-2222
      - i-3333
    keys_list:
      - Id
      - Port
  tasks:
    - debug: var=instance_ids
    - debug:
        msg: "{{ instance_ids | zip_longest([6443], fillvalue=6443) | list }}" # Halfway there...
    - debug:
        msg: "{{ instance_ids | zip_longest([6443], fillvalue=6443) | list | map('json_query', '{Id: [0], Port: [1]}') | list }}"

输出:

TASK [debug]
ok: [localhost] => {
    "msg": [
        [
            "i-1111",
            6443
        ],
        [
            "i-2222",
            6443
        ],
        [
            "i-3333",
            6443
        ]
    ]
}

TASK [debug]
ok: [localhost] => {
    "msg": [
        {
            "Id": null,
            "Port": null
        },
        {
            "Id": null,
            "Port": null
        },
        {
            "Id": null,
            "Port": null
        }
    ]
}

'{Id: [0], Port: [1]}'部分应该怎么调整?

我用 json_query 和 JMESPath int 文字偶然发现了一个可行的解决方案:

"{{ instance_ids | json_query('[*].{Id: @, Port: `6443`}') }}"

示例:

- name: test
  hosts: localhost
  connection: local
  vars:
    instance_ids:
      - i-1111
      - i-2222
      - i-3333
  tasks:
    - debug:
        msg: "{{ instance_ids | json_query('[*].{Id: @, Port: `6443`}') }}"

输出:

TASK [debug]
ok: [localhost] => {
    "msg": [
        {
            "Id": "i-1111",
            "Port": 6443
        },
        {
            "Id": "i-2222",
            "Port": 6443
        },
        {
            "Id": "i-3333",
            "Port": 6443
        }
    ]
}