ansible - 如何循环浏览字典列表?| 列表 - 错误:如果您传递了仅包含一个元素的列表/字典,请尝试添加 wantlist=True
问题描述
我像这样从community.general.xml
模块中获取数据。接下来,我需要在循环中的同一个 xml 文件中使用接收到的数据进行选择。但如何解决它们,我不知道。
我得到这样的数据:
{
"scriptVal": {
"actions": {
"xpath": "//subClientProperties[vmContent/children[@displayName=\"test-pc4\"]]/subClientEntity",
"namespaces": {},
"state": "present"
},
"changed": false,
"count": 2,
"matches": [
{
"subClientEntity": {
"appName": "Virtual Server",
"backupsetName": "backupset-test",
"clientName": "Name-vcagent",
"displayName": "Name-VCAgent",
"instanceName": "VC01",
"subclientName": "test"
}
},
{
"subClientEntity": {
"appName": "Virtual Server",
"backupsetName": "Test01",
"clientName": "Name-vcagent",
"displayName": "Name-VCAgent",
"instanceName": "VC01",
"subclientName": "start9pm"
}
}
],
"msg": 2,
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"failed": false
},
}
我需要访问subClientEntity
字典的每个元素
每次我的尝试失败时:
- debug:
msg: "{{ item.id }} : {{ item.value] }}"
loop: "{{ scriptVal.matches.item.subClientEntity | default }}"
结果:
TASK [debug msg={{ item.id }} : {{ item.value] }}] *****************************
fatal: [localhost]: FAILED! => {"msg": "Invalid data passed to 'loop', it requires a list, got this instead: . Hint: If you passed a list/dict of just one element, try adding wantlist=True to your lookup invocation or use q/query instead of lookup."}
解决方案
由于缺少答案,我在这里引用 Vladimir Botka 的答案,这对我帮助很大:
代码:
- debug:
msg: "{{ item }}"
loop: "{{ scriptVal.matches|map(attribute='subClientEntity')|list }}"
结果:
ok: [localhost] => (item={'appName': 'Virtual Server', 'backupsetName': 'backupset-test', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'test'}) => {
"msg": {
"appName": "Virtual Server",
"backupsetName": "backupset-test",
"clientName": "Name-vcagent",
"displayName": "Name-VCAgent",
"instanceName": "VC01",
"subclientName": "test"
}
}
ok: [localhost] => (item={'appName': 'Virtual Server', 'backupsetName': 'Test01', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'start9pm'}) => {
"msg": {
"appName": "Virtual Server",
"backupsetName": "Test01",
"clientName": "Name-vcagent",
"displayName": "Name-VCAgent",
"instanceName": "VC01",
"subclientName": "start9pm"
}
}
代码:
- debug:
msg: "{{ scriptVal.matches.0.subClientEntity.keys()|list }}" '''
结果:
ok: [localhost] => {
"msg": [
"appName",
"backupsetName",
"clientName",
"displayName",
"instanceName",
"subclientName"
]
}
代码:
- debug:
msg: "{{ item.1 }}: {{ item.0[item.1] }}"
with_nested:
- "{{ scriptVal.matches|map(attribute='subClientEntity')|list }}"
- "{{ scriptVal.matches.0.subClientEntity.keys()|list }}"
结果:
ok: [localhost] => (item=[{'appName': 'Virtual Server', 'backupsetName': 'backupset-test', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'test'}, 'appName']) => {
"msg": "appName: Virtual Server"
}
ok: [localhost] => (item=[{'appName': 'Virtual Server', 'backupsetName': 'backupset-test', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'test'}, 'backupsetName']) => {
"msg": "backupsetName: backupset-test"
}
ok: [localhost] => (item=[{'appName': 'Virtual Server', 'backupsetName': 'backupset-test', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'test'}, 'clientName']) => {
"msg": "clientName: Name-vcagent"
}
ok: [localhost] => (item=[{'appName': 'Virtual Server', 'backupsetName': 'backupset-test', 'clientName': 'Name-vcagent', 'displayName': 'Name-VCAgent', 'instanceName': 'VC01', 'subclientName': 'test'}, 'displayName']) => {
"msg": "displayName: Name-VCAgent"
}