使用Terraform通过Ubuntu ISO在Proxmox部署VM出现cloud-init报错如何解决
问题原因与解决方案
核心报错原因
你收到的Cloud-init parameters only supported on clones or updates报错,以及ISO创建VM失败的问题,来自配置中的3个核心错误:
- 同时配置了
clone(从已有模板克隆VM)和iso(从ISO新建VM)两个互斥参数 iso参数填写的是你本地Terraform工作目录的路径,Proxmox API无法识别该路径,必须填写Proxmox节点存储内的ISO路径- 非克隆创建的全新VM未配置云init设备的前提下,直接使用了
ipconfig0、sshkeys这类云init专属参数
修复步骤
步骤1:上传ISO到Proxmox存储
先将你本地的foo.iso上传到Proxmox节点的ISO存储中,比如默认的local存储,上传后ISO的标准路径格式为存储名:iso/镜像文件名,示例为local:iso/foo.iso。
步骤2:修正main.tf配置
以下是适配ISO创建VM的配置示例:
terraform { required_providers { proxmox = { source = "telmate/proxmox" version = "2.9.1" } } } provider "proxmox" { pm_api_url = "https://foo:8006/api2/json" pm_api_token_id = "" pm_api_token_secret = "pass" pm_tls_insecure = true } resource "proxmox_vm_qemu" "test_server" { count = 1 name = "test-vm-${count.index + 1}" target_node = var.proxmox_host agent = 1 cores = 2 sockets = 1 cpu = "host" memory = 2048 scsihw = "virtio-scsi-pci" # 调整启动顺序为IDE光驱优先,方便从ISO启动安装 boot = "order=ide2;scsi0" disk { slot = 0 size = "10G" type = "scsi" storage = "local-zfs" iothread = 1 } # 挂载ISO到IDE光驱,替换为你Proxmox存储内的实际ISO路径 ide { slot = 2 type = "cdrom" volume = "local:iso/foo.iso" } network { model = "virtio" bridge = "vmbr0" } lifecycle { ignore_changes = [ network, ] } # 如果你需要使用云init配置,保留以下配置;不需要则直接删掉本段即可 os_type = "cloud-init" ide { slot = 3 type = "cloudinit" storage = "local-zfs" } ipconfig0 = "ip=10.98.1.9${count.index + 1}/24,gw=10.98.1.1" sshkeys = <<EOF ${var.ssh_key} EOF }
步骤3:验证配置
执行terraform plan确认无报错后,再执行terraform apply创建VM即可。
注意事项
- 首次创建后需要手动进入Proxmox控制台完成系统安装,如果你需要全自动安装,需要提前给
foo.iso封装自动应答文件 - 原配置中的
clone参数必须删除,该参数和从ISO新建VM的逻辑完全互斥
内容的提问来源于stack exchange,提问作者user17502017
相关产品推荐
相关产品推荐

