Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ansible从json内容获取dict的特定列表_Json_List_Ansible - Fatal编程技术网

使用Ansible从json内容获取dict的特定列表

使用Ansible从json内容获取dict的特定列表,json,list,ansible,Json,List,Ansible,我花了很多时间最终没有得到我需要的,我的要求是如此复杂,所以我更愿意与你分享我的担忧:: 我有这个json.content来解析它: "json": { "content": [ { "name": "machine1", "hasChildren&quo

我花了很多时间最终没有得到我需要的,我的要求是如此复杂,所以我更愿意与你分享我的担忧::

我有这个json.content来解析它:


        "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,…)。