如何解决使用 jmespath 将复杂数据结构中的多个数组连接起来
我正在尝试将在复杂数据结构中描述的 NFS 导出 转换为 nfs-server 守护进程接受的配置选项,然后在 ansible 中使用。 >
我有:
nfs_exports:
- path: /export/home
state: present
options:
- clients: "192.168.0.0/24"
permissions:
- "rw"
- "sync"
- "no_root_squash"
- "fsid=0"
- path: /export/public
state: present
options:
- clients: "192.168.0.0/24"
permissions:
- "rw"
- "sync"
- "root_squash"
- "fsid=0"
- clients: "*"
permissions:
- "ro"
- "async"
- "all_squash"
- "fsid=1"
必须变成:
[
{
"options": "192.168.0.0/24(rw,sync,no_root_squash,fsid=0)","path": "/export/home","state": "present"
},{
"options": "192.168.0.0/24(rw,root_squash,fsid=0) *(ro,async,all_squash,fsid=1)","path": "/export/public","state": "present"
}
]
到目前为止,我可以使用 {{ nfs_exports | json_query(query) }}
query: "[].{path:path,state:state,options:options.join(` `,[].join(``,[clients,`(`,join(`,`,permissions),`)`]))}"
得到
{
"options": "192.168.0.0/24(rw,"state": "present"
},{
"options": "192.168.0.0/24(rw,fsid=0)*(ro,"state": "present"
}
这可能很简单,但我无法通过最后一个选项加入,空格 ' ' 被删除。 因此,如果有人知道正确的查询,我们将不胜感激。
解决方法
给定查询:
[].{ path: path,state: state,options: join(' ',options[].join('',[clients,'(',join(',',permissions),')'])) }
关于 JSON
{
"nfs_exports": [
{
"path": "/export/home","state": "present","options": [
{
"clients": "192.168.0.0/24","permissions": [
"rw","sync","no_root_squash","fsid=0"
]
}
]
},{
"path": "/export/public","root_squash","fsid=0"
]
},{
"clients": "*","permissions": [
"ro","async","all_squash","fsid=1"
]
}
]
}
]
}
它会给你你预期的输出:
[
{
"path": "/export/home","options": "192.168.0.0/24(rw,sync,no_root_squash,fsid=0)"
},{
"path": "/export/public",root_squash,fsid=0) *(ro,async,all_squash,fsid=1)"
}
]
请注意:字符串文字 ``
不适用于空格字符串,因为如文档中所述,它将被解析为 JSON:
文字表达式是允许指定任意 JSON 对象的表达式
来源:https://jmespath.org/specification.html#literal-expressions
当您达到以下目的时,这很容易:
[].{ path: path,options: options[].join('',')']) }
你似乎已经实现了,这给了
[
{
"path": "/export/home","options": [
"192.168.0.0/24(rw,fsid=0)"
]
},fsid=0)","*(ro,fsid=1)"
]
}
]
因为您只需要将 options
中的整个数组与一个空格作为粘合字符连接起来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。