629 字
3 分钟
Terraform 联动 Proxmox VE 's cloud-images
1.创建用户
# 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 TerraformProv2.上传基础cloudinit配置
mkdir /var/lib/vz/snippets
tee /var/lib/vz/snippets/qemu-guest-agent.yml <<EOF#cloud-configruncmd: - apt update - apt install -y qemu-guest-agent - systemctl start qemu-guest-agentEOF3.创建cloud-image模板
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2qm create 9000 --name debianTemplateqm set 9000 --ide0 local-lvm:0,import-from=/root/debian-12-genericcloud-amd64.qcow2qm template 90004.编写main.tf
1.克隆创建单个虚拟机
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" }}应用配置
terraform initterraform apply
# 销毁可以使用terraform destroy2.部署多台机器
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