使用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
相关产品推荐
相关产品推荐

