使用Ansible从json内容获取dict的特定列表
我花了很多时间最终没有得到我需要的,我的要求是如此复杂,所以我更愿意与你分享我的担忧:: 我有这个json.content来解析它:使用Ansible从json内容获取dict的特定列表,json,list,ansible,Json,List,Ansible,我花了很多时间最终没有得到我需要的,我的要求是如此复杂,所以我更愿意与你分享我的担忧:: 我有这个json.content来解析它: "json": { "content": [ { "name": "machine1", "hasChildren&quo
"json": {
"content": [
{
"name": "machine1",
"hasChildren": false,
"resourceData": {
"entries": [
{
"value": {
"type": "string",
"value": "Red Hat Enterprise Linux 7 (64-bit)"
},
"key": "MachineGuestOperatingSystem"
},
{
"value": {
"type": "string",
"value": "Folder1"
},
"key": "VMware.VirtualCenter.Folder"
},
{
"value": {
"type": "boolean",
"value": true
},
"key": "Destroy"
}
]
}
},
{
"name": "machine2",
"hasChildren": false,
"resourceData": {
"entries": [
{
"value": {
"type": "string",
"value": "Red Hat Enterprise Linux 7 (64-bit)"
},
"key": "MachineGuestOperatingSystem"
},
{
"value": {
"type": "string",
"value": "Folder2"
},
"key": "VMware.VirtualCenter.Folder"
},
{
"value": {
"type": "boolean",
"value": false
},
"key": "Destroy"
}
]
}
},
{
"name": "machine3",
"hasChildren": false,
"resourceData": {
"entries": [
{
"value": {
"type": "string",
"value": "Windows Server 2016 or later (64-bit)"
},
"key": "MachineGuestOperatingSystem"
},
{
"value": {
"type": "string",
"value": "Folder3"
},
"key": "VMware.VirtualCenter.Folder"
},
{
"value": {
"type": "boolean",
"value": true
},
"key": "Destroy"
}
]
}
}
]
}
我希望输出如下内容:
[{"name":"machine1", "OsName": "Red Hat Enterprise Linux 7 (64-bit)", "Folder": "Folder1"}, {"name":"machine2", "OsName": "Red Hat Enterprise Linux 7 (64-bit)", "Folder": "Folder2"},
{"name":"machine3", "OsName": "Windows Server 2016 or later (64-bit)", "Folder": "Folder3"}]
我尝试了所有的解决方案,但没有办法,所有的结果都不是我想要的。有人可以帮我找到一个解决方案来获得这个结果下面的任务就是这样做的
-设置事实:
_列表:“{json.content}json|u查询(查询)}”
变量:
查询:“[]。{name:name,
OsName:resourceData.entries[0].value.value,
文件夹:resourceData.entries[1].value.value}”
给予
\u列表:
-文件夹:Folder1
OsName:Red Hat Enterprise Linux 7(64位)
姓名:machine1
-文件夹:Folder2
OsName:Red Hat Enterprise Linux 7(64位)
姓名:machine2
-文件夹:Folder3
OsName:Windows Server 2016或更高版本(64位)
名称:机器
Q:“它改变了(键、值)的顺序,因此[0]或[1]的引用将不同。” A:按键选择项目。您必须查看结果并选择所选列表中的第一项,例如,下面的任务会给出相同的结果
-设置事实:
_列表:“{json.content}json|u查询(查询)}”
变量:
查询:“[]。{name:name,
OsName:resourceData.entries[?key=`MachineGueStoreratingSystem`].value.value |[0],
文件夹:resourceData.entries[?key=`VMware.VirtualCenter.Folder`].value.value |[0]}”
Q:过滤“红帽…”获取输出
-文件夹:Folder1
OsName:Red Hat Enterprise Linux 7(64位)
姓名:machine1
-文件夹:Folder2
OsName:Red Hat Enterprise Linux 7(64位)
姓名:machine2
答:使用selectattr,例如,下面的任务完成此任务
-调试:
msg:“{{{u列表|
selectattr('OsName','eq','Red Hat Enterprise Linux 7(64位)'|
列表}”
问:“在哪里可以学习这种搜索?” 答:这本书中有一些例子。作为提示,请参阅下面关于如何将这些示例转换为Ansible的代码
-name:'search(foo,{“foo”:“value”})->“value”'
调试:
msg:{{{u dict}json{u查询({u查询)}”
变量:
_格言:{“foo”:“value”}
_查询:“foo”
-name:'search(foo[?bar==`10`],{“foo”:[{“bar”:1},{“bar”:10}]})->[{“bar”:10}]'
调试:
msg:{{{u dict}json{u查询({u查询)}”
变量:
_格言:{“foo”:[{“bar”:1},{“bar”:10}]}
_查询:“foo[?bar=`10`]”
-name:'search(foo | bar,{“foo”:{“bar”:“baz”})->“baz”'
调试:
msg:{{{u dict}json{u查询({u查询)}”
变量:
_格言:{“foo”:{“bar”:“baz”}
_查询:“foo | bar”
感谢您的快速回复,您给了我一个希望,但in entries有数千个条目,并且它以某种方式改变了(键、值)的顺序,因此每次运行playbook时,[0]或[1]的引用都不相同。欢迎您。按键选择项目。我已经更新了答案。我已经测试过了,它工作得很好,非常感谢。如果你能给我一个我可以学习这种搜索的来源,我将非常感激,只是一个链接对我很有用,可以学习如何使用Ansible通过json进行竞争性搜索。我已经添加了一些示例。除此之外,看看我的项目。搜索json_查询(示例2,20,43,69140267,…)。