Ansible:使用json_查询在任意深度查找具有已知值的已知键?
使用Ansible:使用json_查询在任意深度查找具有已知值的已知键?,ansible,ansible-2.x,jmespath,json-query,Ansible,Ansible 2.x,Jmespath,Json Query,使用json\u查询可以完成类似的任务吗?经过一段时间的搜索,我找不到任何东西(无论是使用json_query还是使用jmespath)。我所能找到的一切都假设dict/json的结构是已知的(即搜索键的深度是已知的) JSON输入示例: { "changed": false, "msg": { "Data": { "Message": "returned status code doesn't match with the expected success code
json\u查询
可以完成类似的任务吗?经过一段时间的搜索,我找不到任何东西(无论是使用json_query
还是使用jmespath
)。我所能找到的一切都假设dict/json
的结构是已知的(即搜索键的深度是已知的)
JSON输入示例:
{
"changed": false,
"msg": {
"Data": {
"Message": "returned status code doesn't match with the expected success code",
"Status": "Failed",
"StatusCode": 409
},
"Message": "none",
"Status": "Failed",
"StatusCode": 409,
"error": {
"error": {
"@Message.ExtendedInfo": [
{
"Message": "Server is already powered OFF.",
"MessageArgs": [
],
"MessageArgs@odata.count": 0,
"MessageId": "IDRAC.1.6.PSU502",
"RelatedProperties": [
],
"RelatedProperties@odata.count": 0,
"Resolution": "No response action is required.",
"Severity": "Informational"
}
],
"code": "Base.1.0.GeneralError",
"message": "A general error has occurred. See ExtendedInfo for more information"
}
},
"retval": true
}
}
我想检查值服务器是否已关闭,是否存在关键消息。不假设JSON的键/结构的深度。带有自定义
下面的任务
vars:
my_key: Message
my_value: Server is already powered OFF
tasks:
- debug:
msg: "{{ item.key }}: {{ item.value is search(my_value)|
ternary(my_value, 'NOT FOUND') }}"
loop: "{{ input|dict_flatten|dict2items }}"
when: item.key.split('.')|list_reverse|first == my_key
给予
详细信息
过滤器dict_从下方展平的示例
给予
我在另一个网站上找到了以下答案(谢谢/u/boscopanda!):
我真的不明白,你想检查消息是否得到这个值:“服务器已经关机”而不输入?因此,如果我们将JSON视为一条消息,并且您有一个消息列表,您可以做到这一点:“代码> @ [ .MSG.Error .Error”“@消息.ExpDebug”(0)。如果我们将
@
视为您当前的node@bosskay972我在寻找一个不包含任何关于输入结构假设的解决方案(除了可能有一个名为“msg”的顶级键之外)。最后,我找到了一个答案,它不使用json_查询,但至少仍然坚持使用内置的ansible过滤器/功能(请参见下面的答案)。这不符合以下条件:“,以检查值服务器是否存在一条关键消息,
”。您是正确的@VladimirBotka。我本来应该用稍微不同的措辞来回答我最初的问题;我在寻找一个已知的值,如果需要的话,在寻找这个已知的值时,可以假设这个键也是已知的。我将把你的回答记为已被接受。
vars:
my_key: Message
my_value: Server is already powered OFF
tasks:
- debug:
msg: "{{ item.key }}: {{ item.value is search(my_value)|
ternary(my_value, 'NOT FOUND') }}"
loop: "{{ input|dict_flatten|dict2items }}"
when: item.key.split('.')|list_reverse|first == my_key
"msg": "msg.Data.Message: NOT FOUND"
"msg": "msg.error.error.@Message.ExtendedInfo.0.Message: Server is already powered OFF"
"msg": "msg.Message: NOT FOUND"
vars:
dict4: {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": [ 3, 4, 5 ]
},
"w": 3
}
}
tasks:
- debug:
var: dict4_flatten
vars:
dict4_flatten: "{{ dict4|dict_flatten('.') }}"
"dict4_flatten": {
"a.r": 1,
"a.s": 2,
"a.t": 3,
"b.u": 1,
"b.v.x": 1,
"b.v.y": 2,
"b.v.z.0": 3,
"b.v.z.1": 4,
"b.v.z.2": 5,
"b.w": 3
}
- debug:
var: js.msg
when: (js | to_json).find('Server is already powered OFF') != -1