Ansible批量创建Proxmox VM报错:'dict object'无'vm_id'属性
Ansible Playbook创建Proxmox VM报错排查与修复
问题概述
编写Ansible Playbook批量在Proxmox创建两台VM,VM属性存于list.yaml,默认配置存于defaults.yaml,执行时出现报错:'dict object' has no attribute 'vm_id'
错误原因
- 变量引用与循环目标不匹配:
- 原
list.yaml中vms是嵌套字典结构(vms: {vm1: {...}, vm2: {...}}),而非列表,无法直接用with_items循环。 - Playbook中错误定义了
list: '/vars/list.yaml'变量,并用with_items: "{{ list }}"循环字符串路径,导致循环对象完全错误。 - 任务中错误用
vms.vm_id引用属性,未结合循环变量item获取当前VM的属性。
- 原
- 拼写错误:
- include任务中的
defualts拼写错误,应为defaults - Proxmox模块参数
ballon拼写错误,应为balloon
- include任务中的
修复步骤
1. 修改list.yaml结构为列表格式
将嵌套字典改为列表,便于with_items循环遍历:
--- vms: - vm_id: "101" vm_name: "vm1" vm_cores: "2" vm_sockets: "1" vm_memory: "2048" vm_storage: "20G" - vm_id: "102" vm_name: "vm2" vm_cores: "2" vm_sockets: "1" vm_memory: "2048" vm_storage: "20G"
2. 修正主Playbook代码
移除无效变量定义,修正循环目标与变量引用,修复拼写错误:
--- - name: 'Creating VMs in Proxmox' hosts: all tasks: - name: 'including defaults' include_vars: /vars/defaults.yaml - name: 'including list' include_vars: /vars/list.yaml - name: 'Creating VMs' community.general.proxmox_kvm: api_user: "{{ user }}" api_password: "{{ passwd }}" api_host: "{{ host }}" node: "{{ node_name }}" vmid: "{{ item.vm_id }}" name: "{{ item.vm_name }}" vm_type: qemu ostype: l26 disks: - size: "{{ item.vm_storage }}" type: sata storage: local-lvm bootdisk: sata cpu: "{{ item.vm_cores }}" sockets: "{{ item.vm_sockets }}" cpuunits: 1000 cores: 1 balloon: "{{ item.vm_memory }}" netif: '{"net0":"name=virtio,ip=dhcp,ip6=dhcp,bridge=vmbr1,rate=200"}' localtime: true state: present with_items: "{{ vms }}"
修复说明
list.yaml改为列表后,vms变量成为包含两个VM配置字典的列表,with_items: "{{ vms }}"会逐个遍历每个VM配置。- 任务中用
item引用当前循环的VM字典,item.vm_id、item.vm_name等可正确获取对应属性。 - 移除了无效的
list变量定义,直接使用include_vars加载后的vms变量。 - 修正了两处拼写错误,避免潜在的执行问题。
内容的提问来源于stack exchange,提问作者Arun Swiftz -1
相关产品推荐
相关产品推荐

