是否可以编写JMESPath表达式以返回设置了特定子属性值的对象名列表?在下面的示例中,我想获得 fileexists.stat.exists 设置为true的所有主机名列表。
我的目标是使用Ansible hostvars结构来获取存在特定文件的所有主机的列表。
{
"hostvars": {
"oclab1n01.example.org": {
"fileexists": {
"changed": false,
"failed": false,
"stat": {
"exists": false
}
}
},
"oclab1n02.example.org": {
"fileexists": {
"changed": false,
"failed": false,
"stat": {
"exists": true
}
}
},
"oclab1n03.example.org": {
"fileexists": {
"changed": false,
"failed": false,
"stat": {
"exists": true
}
}
}
} }
在这个例子中,我想获得以下输出
["oclab1n02.example.org", "oclab1n03.example.org"]
答案 0 :(得分:0)
是的,这是有可能的,但是它非常麻烦,因为对于这种通用查询,源数据集被标准化程度很差。
以下(太大)的jmespath查询...
[
{
"hostname": `oclab1n01.example.org`
,"fileexists_stat_exists": @.hostvars."oclab1n01.example.org".fileexists.stat.exists
}
,{
"hostname": `oclab1n02.example.org`
,"fileexists_stat_exists": @.hostvars."oclab1n02.example.org".fileexists.stat.exists
}
,{
"hostname": `oclab1n03.example.org`
,"fileexists_stat_exists": @.hostvars."oclab1n02.example.org".fileexists.stat.exists
}
]|[? @.fileexists_stat_exists == `true`]|[*].hostname
返回以下期望结果
[
"oclab1n02.example.org",
"oclab1n03.example.org"
]
如果原始数据被组织为一个对象列表,而不是对象中的一组嵌套对象,则无需事先了解 即可更轻松地搜索,排序和过滤列表涉及多少个主机名条目。
{"hostvars": [
{"hostname":"oclab1n01.example.org"
,"fileexists": true
,"filechanged": false
,"filefailed": false
,"filestat_exists": false
,"we_can_even_still_deeply_nest":{"however":
{"im_only_doing":"it here","to":"prove a point"}
}
}
,{"hostname":"oclab1n02.example.org"
,"fileexists": true
,"filechanged": false
,"filefailed": false
,"filestat_exists": true
}
,{"hostname":"oclab1n03.example.org"
,"fileexists": true
,"filechanged": false
,"filefailed": false
,"filestat_exists": true
}
]
}
上面的重新规范化数据集现在可以轻松查询
hostvars|[? @.filestat_exists == `true`]|[*].hostname