使用Terraform部署3台Proxmox虚拟机时遇类型错误求助
问题分析
错误原因明确:你在根模块中将列表类型的var.vm_name和var.vmid直接传给子模块,但子模块内的proxmox_vm_qemu资源要求name为单个字符串、vmid为单个数字,类型不匹配导致报错。
解决方案
以下两种标准Terraform批量创建资源的方式,任选其一即可:
方案1:修改子模块,支持批量创建
直接在../resources/proxmox/main.tf中用for_each遍历列表,批量生成虚拟机:
# ../resources/proxmox/main.tf provider "proxmox" { pm_api_url = var.proxmox_api_url pm_user = var.proxmox_api_user pm_password = var.proxmox_api_password pm_tls_insecure = true # 按需调整,生产环境建议关闭 } resource "proxmox_vm_qemu" "vm" { # 通过zipmap关联vm_name和vmid,遍历生成资源 for_each = zipmap(var.vm_name, var.vmid) name = each.key vmid = each.value agent = var.agent node = var.pve_node clone = var.template_name full_clone = var.full_clone # 补充必要配置(示例参数,根据你的模板调整) memory = 2048 cores = 2 network { bridge = "vmbr0" } }
子模块的variable.tf保持原定义(接收列表类型的vm_name和vmid),根模块调用无需修改。
方案2:在根模块循环调用子模块
若不想修改子模块,就在根模块用for_each多次调用子模块,每次传入单个vm_name和vmid:
# 根模块main.tf module "vm" { source = "../resources/proxmox" # 遍历关联后的name和id,批量调用模块 for_each = zipmap(var.vm_name, var.vmid) vm_name = each.key vmid = each.value agent = 1 pve_node = "pve" template_name = var.template_name full_clone = true proxmox_api_url = var.proxmox_api_url proxmox_api_user = var.proxmox_api_user proxmox_api_password = var.proxmox_api_password }
同时修改子模块的variable.tf,将vm_name和vmid改为单个值类型:
# ../resources/proxmox/variable.tf variable "vm_name" { type = string } variable "vmid" { type = number } # 其他变量保持不变
注意事项
- 确保
var.vm_name和var.vmid的长度一致,否则zipmap会报错 - 优先推荐
for_each而非count,因为for_each会基于元素值跟踪资源,避免索引变动导致的资源重建 - 子模块内的
proxmox_vm_qemu需补充完整必要配置(如内存、网络、磁盘等),否则Terraform会因缺少参数报错
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

