如何解决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 举报,一经查实,本站将立刻删除。