629 字
3 分钟
Terraform 联动 Proxmox VE 's cloud-images

1.创建用户#

Terminal window
# Proxmox 9 及更新版本
pveum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Pool.Audit Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.PowerMgmt SDN.Use"
pveum user add terraform-prov@pve --password <password>
pveum aclmod / -user terraform-prov@pve -role TerraformProv
# Proxmox 8 及更早版本
veum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Migrate VM.PowerMgmt SDN.Use"
pveum user add terraform-prov@pve --password <password>
pveum aclmod / -user terraform-prov@pve -role TerraformProv

2.上传基础cloudinit配置#

Terminal window
mkdir /var/lib/vz/snippets
tee /var/lib/vz/snippets/qemu-guest-agent.yml <<EOF
#cloud-config
runcmd:
- apt update
- apt install -y qemu-guest-agent
- systemctl start qemu-guest-agent
EOF

3.创建cloud-image模板#

Terminal window
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2
qm create 9000 --name debianTemplate
qm set 9000 --ide0 local-lvm:0,import-from=/root/debian-12-genericcloud-amd64.qcow2
qm template 9000

4.编写main.tf#

1.克隆创建单个虚拟机#

Terminal window
terraform {
required_version = "~> 1.14.0"
required_providers {
proxmox = {
source= "telmate/proxmox"
version="=3.0.2-rc07"
}
}
}
provider "proxmox" {
pm_api_url = "http://pve:8006/api2/json"
pm_user = "terraform-prov@pve"
pm_password = "password"
pm_tls_insecure = true # 关闭tls验证
}
resource "proxmox_vm_qemu" "cloudinit-example" {
vmid = 100 # 虚拟机id
name = "test-terraform0" #虚拟机名字
target_node = "pve" # 资源节点
agent = 1 #开启qemu-agent
cores = 1 #CPU数
memory = 1024 #内存
boot = "order=ide0" # 启动磁盘
clone = "debianTemplate" # 模板名称
scsihw = "virtio-scsi-single"
vm_state = "running" # "stopped"
automatic_reboot = true #自动重启
# Cloud-Init 配置
cicustom = "vendor=local:snippets/qemu-guest-agent.yml" # /var/lib/vz/snippets/qemu-guest-agent.yml
ciupgrade = false # 升级程序包
nameserver = "10.0.0.1"
ipconfig0 = "ip=10.0.0.2/24,gw=10.0.0.1,ip6=dhcp" # 如果ipv4 也需要dncp的话可以使用 "ip=dncp,ip6=dhcp"
skip_ipv6 = true
ciuser = "root"
cipassword = "Pass@123"
# sshkeys = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE/Pjg7YXZ8Yau9heCc4YWxFlzhThnI+IhUx2hLJRxYE Cloud-Init@Terraform"
# Most cloud-init images require a serial device for their display
serial {
id = 0
type = "socket"
}
disks {
ide {
ide0 {
disk {
storage = "local-lvm"
size = "5G"
}
}
# Some images require a cloud-init disk on the IDE controller, others on the SCSI or SATA controller
ide1 {
cloudinit {
storage = "local-lvm"
}
}
}
}
network {
id = 0
bridge = "vmbr0"
model = "virtio"
}
}

应用配置#

Terminal window
terraform init
terraform apply
# 销毁可以使用
terraform destroy

2.部署多台机器#

Terminal window
terraform {
required_version = "~> 1.14.0"
required_providers {
proxmox = {
source= "telmate/proxmox"
version="=3.0.2-rc07"
}
}
}
provider "proxmox" {
pm_api_url = "http://pve/api2/json"
pm_user = "terraform-prov@pve"
pm_password = "password"
pm_tls_insecure = true
}
resource "proxmox_vm_qemu" "cloudinit-example" {
count =3
vmid = count.index+101
name = "test-terraform${count.index}"
target_node = "pve"
agent = 1
cores = 1
memory = 1024
boot = "order=ide0" # 启动磁盘
clone = "debianTemplate" # 模板名称
scsihw = "virtio-scsi-single"
vm_state = "running" # "stopped"
automatic_reboot = true
# Cloud-Init 配置
cicustom = "vendor=local:snippets/qemu-guest-agent.yml" # /var/lib/vz/snippets/qemu-guest-agent.yml
ciupgrade = false # 升级程序包
nameserver = "10.0.0.1"
ipconfig0 = "ip=10.0.0.2/24,gw=10.0.0.1,ip6=dhcp" # 如果ipv4 也需要dncp的话可以使用 "ip=dncp,ip6=dhcp"
skip_ipv6 = true
ciuser = "root"
cipassword = "Pass@123"
# sshkeys = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE/Pjg7YXZ8Yau9heCc4YWxFlzhThnI+IhUx2hLJRxYE Cloud-Init@Terraform"
# Most cloud-init images require a serial device for their display
serial {
id = 0
type = "socket"
}
disks {
ide {
ide0 {
disk {
storage = "local-lvm"
size = "5G"
}
}
ide1 {
cloudinit {
storage = "local-lvm"
}
}
}
}
network {
id = 0
bridge = "vmbr0"
model = "virtio"
}
}
Terraform 联动 Proxmox VE 's cloud-images
https://blog.fiveqm.com/archives/terraform_pve_vm
作者
inuyume
发布于
2026-03-16
许可协议
CC BY-NC-SA 4.0