我正在使用 Ansible 在多个环境中创建用户。我正在尝试将包含创建新 unix 用户所需的所有数据的用户 var 合并到一个全局共享的 var 中。为此,我计划使用子元素来控制在哪些主机上创建哪些用户等。
但是,我正在努力弄清楚如何过滤这些数据,以便我可以为当前主机提供正确的凭据集。
我需要将“环境”键过滤为仅具有我正在寻找的“名称”值的元素,但在结果中保留父对象的键。
我有什么/我想要什么:
JSON:
{
"users": [
{
"name": "user1",
"token": "token",
"unix": "unixstring",
"mysql": "mysqlstring",
"environments": [
{
"name": "env_one",
"key": "keystring",
"user_groups": [
"one",
"two"
],
"host_groups": "all"
},
{
"name": "env_two",
"key": "keystring",
"user_groups": [
"three",
"four"
],
"host_groups": "all"
}
]
},
{
"name": "user2",
"token": "token",
"unix": "unixstring",
"mysql": "mysqlstring",
"environments": [
{
"name": "env_three",
"key": "keystring",
"user_groups": [
"one",
"two"
],
"host_groups": "all"
}
]
}
]
}
我想要的是:
{
"users": [
{
"name": "user1",
"token": "token",
"unix": "unixstring",
"mysql": "mysqlstring",
"environments": [
{
"name": "env_one",
"key": "keystring",
"user_groups": [
"one",
"two"
],
"host_groups": "all"
}
]
}
]
}
更多信息:
我能够使用此查询接近,但我不知道如何进一步缩小结果范围,以便保留每个“用户”对象中的所有键,但将子元素“环境”过滤到匹配的那些我的查询。
JMESPath 查询:users[?environments[?name=='env_one']]
输出:
{
"users": [
{
"name": "user1",
"token": "token",
"unix": "unixstring",
"mysql": "mysqlstring",
"environments": [
{
"name": "env_one",
"key": "keystring",
"user_groups": [
"one",
"two"
],
"host_groups": "all"
},
{
"name": "env_two",
"key": "keystring",
"user_groups": [
"three",
"four"
],
"host_groups": "all"
}
]
}
]
}
如果有用的话,这是 YAML 中的原始数据集:
YAML:
---
users:
- name: user1
token: token
unix: unixstring
mysql: mysqlstring
environments:
- name: env_one
key: keystring
user_groups:
- one
- two
host_groups: all
- name: env_two
key: keystring
user_groups:
- three
- four
host_groups: all
- name: user2
toke n: token
unix: unixstring
mysql: mysqlstring
environments:
- name: env_three
key: keystring
user_groups:
- one
- two
host_groups: all