微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ansible / jmespath - 一维列表到字典压缩列表

如何解决Ansible / jmespath - 一维列表到字典压缩列表

我正在尝试将 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",{"Id": "i-3333",]
}

我尝试过的:一个 json_query / JMESPath 表达式会令人困惑地返回 null 值:

---

- 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",[
            "i-3333",6443
        ]
    ]
}

TASK [debug]
ok: [localhost] => {
    "msg": [
        {
            "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",{
            "Id": "i-3333","Port": 6443
        }
    ]
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。