首页 > 解决方案 > 如何循环浏览字典列表?| 列表 - 错误:如果您传递了仅包含一个元素的列表/字典,请尝试添加 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."}

标签: ansiblejinja2

解决方案


由于缺少答案,我在这里引用 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"
}

推荐阅读