我花了很多时间终于没有得到我需要的东西,我的要求太复杂了,所以我更愿意与您分享我的担忧::
我有这个 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"}]
我尝试了所有解决方案,但没有办法,所有结果都不是我想要的。有人可以帮我找到一个解决方案来获得这个参与结果
答案 0 :(得分:1)
下面的任务完成工作
- set_fact:
_list: "{{ json.content|json_query(query) }}"
vars:
query: "[].{name: name,
OsName: resourceData.entries[0].value.value,
Folder: resourceData.entries[1].value.value}"
给予
_list:
- Folder: Folder1
OsName: Red Hat Enterprise Linux 7 (64-bit)
name: machine1
- Folder: Folder2
OsName: Red Hat Enterprise Linux 7 (64-bit)
name: machine2
- Folder: Folder3
OsName: Windows Server 2016 or later (64-bit)
name: machine
Q: "它改变了(key, value)的顺序,所以用[0]或[1]引用会不一样。">
A:通过按键选择项目。您必须 pipe 结果并选择所选列表的第一项,例如下面的任务给出了相同的结果
- set_fact:
_list: "{{ json.content|json_query(query) }}"
vars:
query: "[].{name: name,
OsName: resourceData.entries[?key==`MachineGuestOperatingSystem`].value.value|[0],
Folder: resourceData.entries[?key==`VMware.VirtualCenter.Folder`].value.value|[0]}"
问:"过滤'Red Hat ...'获取输出"
- Folder: Folder1
OsName: Red Hat Enterprise Linux 7 (64-bit)
name: machine1
- Folder: Folder2
OsName: Red Hat Enterprise Linux 7 (64-bit)
name: machine2
A:使用 selectattr,例如下面的任务完成这项工作
- debug:
msg: "{{ _list|
selectattr('OsName', 'eq', 'Red Hat Enterprise Linux 7 (64-bit)')|
list }}"
问:“在哪里可以学习这种搜索?”
A:JMESPath Specification 中有示例。作为提示,请参阅下面的代码,了解如何将这些示例转换为 Ansible json_query
- name: 'search(foo, {"foo": "value"}) -> "value"'
debug:
msg: "{{ _dict|json_query(_query) }}"
vars:
_dict: {"foo": "value"}
_query: "foo"
- name: 'search(foo[?bar==`10`], {"foo": [{"bar": 1}, {"bar": 10}]}) -> [{"bar": 10}]'
debug:
msg: "{{ _dict|json_query(_query) }}"
vars:
_dict: {"foo": [{"bar": 1}, {"bar": 10}]}
_query: "foo[?bar==`10`]"
- name: 'search(foo | bar, {"foo": {"bar": "baz"}}) -> "baz"'
debug:
msg: "{{ _dict|json_query(_query) }}"
vars:
_dict: {"foo": {"bar": "baz"}}
_query: "foo | bar"