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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:32:04