You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ansible的vmware_guest_network模块提取数据后循环报错问题

问题

借助Ansible的vmware_guest_network模块,已将多台虚拟机的网络数据提取至变量vm_info.network_data中,示例数据如下:

{
    "vm_info.network_data": {
        "0": {
            "allow_guest_ctl": true, 
            "connected": true, 
            "device_type": "VMXNET3", 
            "label": "Network adapter 1", 
            "mac_addr": "xxxxxx", 
            "name": "DVSwitch: xxxxxxx", 
            "start_connected": true, 
            "unit_number": 7, 
            "wake_onlan": true
        }, 
        "1": {
            "allow_guest_ctl": true, 
            "connected": true, 
            "device_type": "VMXNET3", 
            "label": "Network adapter 2", 
            "mac_addr": "rrrrr", 
            "name": "DVSwitch: tttttttt", 
            "start_connected": true, 
            "unit_number": 8, 
            "wake_onlan": true
        }, 
        "2": {
            "allow_guest_ctl": true, 
            "connected": true, 
            "device_type": "VMXNET3", 
            "label": "Network adapter 3", 
            "mac_addr": "xxxxxxxxx", 
            "name": "DVSwitch: vvvvvvvvvv", 
            "start_connected": true, 
            "unit_number": 9, 
            "wake_onlan": true
        }
    }
}

需要针对start_connected未设置为true的虚拟机触发提示信息,但vm_info.network_data是字典类型而非列表,使用以下语句时出现报错:

- debug:
    msg: "{{ inventory_hostname }}"
  loop: "{{ vm_info.network_data }} | map(attribute='start_connected')|wantlist=True }}"
解决方法

vm_info.network_data是字典结构,无法直接用map处理,需先将字典值转换为列表,再进行过滤和循环操作。

方法1:用dict2items转换字典为键值对列表

先把字典转成包含键值对的列表,再提取值部分,筛选出start_connected不为true的项:

- debug:
    msg: "{{ inventory_hostname }} 存在网卡未设置开机自动连接:{{ item.value.label }}"
  loop: "{{ vm_info.network_data | dict2items }}"
  when: not item.value.start_connected

方法2:直接调用字典values()方法取所有值列表

Ansible支持直接调用字典的values()方法获取值列表,再过滤目标项:

- debug:
    msg: "{{ inventory_hostname }} 存在网卡未设置开机自动连接:{{ item.label }}"
  loop: "{{ vm_info.network_data.values() }}"
  when: not item.start_connected

说明

  • 两种方法都能将字典结构的网络数据转换为可循环的列表
  • 通过when条件筛选出start_connected不为true的网卡,精准输出提示
  • 原报错原因是直接对字典使用map,而map仅支持可迭代的列表结构,转换为值列表后即可正常处理

内容的提问来源于stack exchange,提问作者Goul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:55:32