Ansible vmware_guest模块网络参数格式错误求助
问题:Ansible vmware_guest模块网络参数格式错误
我在将VM部署流程参数化时,IP分为IPAM自动生成和手动分配两种类型,运行Playbook时持续报错:
"Elements value for option 'networks' is of type <class 'str'> and we were unable to convert to dict: dictionary requested, could not parse JSON or key=value"
变量与中间数据
初始变量vm_networks配置:
vm_networks: - name: vlan_105 ip: "auto" netmask: "auto" gateway: "auto" connected: true start_connected: true device_type: vmxnet3 - name: vlan_106 ip: "auto" netmask: "auto" gateway: "auto" connected: true start_connected: true device_type: vmxnet3 - name: vlan_107 ip: 192.168.0.1 netmask: 255.255.255.0 gateway: 192.168.0.254 connected: true start_connected: true
IPAM分配后得到的vm_networks_updated数据:
vm_networks_updated: - connected: true device_type: vmxnet3 gateway: "10.17.1.254" ip: "10.17.1.2" name: "vlan_105" netmask: "255.255.255.0" start_connected: true - connected: true device_type: vmxnet3 gateway: "10.19.4.254" ip: "10.19.4.2" name: "vlan_106" netmask: "255.255.255.0" start_connected: true - connected: true device_type: vmxnet3 gateway: "192.168.0.254" ip: "192.168.0.1" name: "vlan_107" netmask: "255.255.255.0" start_connected: true
错误的Playbook处理步骤
我尝试通过以下步骤转换数据,但生成的vm_networks_updated_dict格式错误:
- set_fact: vm_networks_updated_keys: "{{ vm_networks_updated| map(attribute='name')|map('community.general.dict_kv', 'name')|list }}" - debug: var: vm_networks_updated_keys - set_fact: vm_networks_updated_dict: "{{ vm_networks_updated| zip(vm_networks_updated_keys) }}" - debug: var: vm_networks_updated_dict
生成的vm_networks_updated_dict是嵌套列表结构,不符合模块要求:
vm_networks_updated_dict: - - connected: true device_type: vmxnet3 gateway: "10.17.1.254" ip: "10.17.1.2" name: "vlan_105" netmask: "255.255.255.0" start_connected: true - name: "vlan_105" - - connected: true device_type: vmxnet3 gateway: "10.19.4.254" ip: "10.19.4.2" name: "vlan_106" netmask: "255.255.255.0" start_connected: true - name: "vlan_106" - - connected: true device_type: vmxnet3 gateway: "192.168.0.254" ip: "192.168.0.1" name: "vlan_107" netmask: "255.255.255.0" start_connected: true - name: "vlan_107"
最终调用vmware_guest模块时的错误配置:
- name: Create a virtual machine from a template community.vmware.vmware_guest: # 其他参数省略 networks: | "{{ vm_networks_updated_dict|to_yaml }}" # 其他参数省略
报错信息:
fatal: [bitwarden-001]: FAILED! => { "changed": false, "invocation": { "module_args": { ... "networks": [], ... } }, "msg": "Elements value for option 'networks' is of type <class 'str'> and we were unable to convert to dict: dictionary requested, could not parse JSON or key=value" }
解决方案
1. 错误根源分析
vmware_guest模块的networks参数要求接收字典组成的列表,每个字典对应一个网卡配置。- 额外的
zip操作完全多余,反而把正确的列表结构破坏成了嵌套列表。 - 使用
|多行字符串包裹变量并加双引号,会把原本的列表转换成字符串,导致模块无法解析。
2. 修正后的Playbook步骤
直接使用已经正确格式化的vm_networks_updated列表,不需要额外转换:
# 移除多余的set_fact和zip操作,直接使用vm_networks_updated - name: Create a virtual machine from a template community.vmware.vmware_guest: hostname: "{{ vc_hostname }}" username: "{{ vc_username }}" password: "{{ vc_password }}" validate_certs: "{{ vc_validate_certs }}" template: "{{ vm_spec.template |default(vm_spec_template) }}" name: "{{ vm_spec.name }}" state: poweredon datacenter: "{{ vm_spec.datacenter }}" cluster: "{{ vm_spec.cluster }}" folder: "{{ vm_spec.folder }}" disk: - datastore: "{{ vm_spec.datastore }}" size_kb: "{{ vm_spec.disk_size * 1048576 }}" type: thin hardware: memory_mb: "{{ vm_spec.memory * 1048576 }}" num_cpus: "{{ vm_spec.cpus }}" num_cpu_cores_per_socket: "{{ vm_spec.cores_per_socket }}" networks: "{{ vm_networks_updated }}" wait_for_ip_address: true delegate_to: localhost register: deploy
3. 关键修正点
- 移除所有关于
vm_networks_updated_keys和vm_networks_updated_dict的set_fact操作,vm_networks_updated本身就是符合要求的列表结构。 - 给
networks参数直接赋值{{ vm_networks_updated }},不要使用多行字符串或额外引号包裹,避免将列表转为字符串。
内容的提问来源于stack exchange,提问作者Ajai
相关产品推荐
相关产品推荐

