Разбираем на практике, как управлять VM в Proxmox через Terraform: изменять CPU/RAM, диски, cloud-init, теги, заметки, количество нод и параметры. Всё — как в реальной продовой конфигурации.
Кратко: меняем параметры VM → запускаем terraform plan → проверяем разницу → terraform apply. Proxmox провайдер делает всю грязную работу.
Proxmox VE 9.1 — мощная штука, но руками создавать VM не кайф. Terraform позволяет полностью описывать инфраструктуру кодом: VM, параметры, диски, cloud-init, сеть, storage. Изменения вносятся декларативно: ты просто правишь .tf, а Terraform приводит Proxmox к новому состоянию.
Пример минимальной VM в Proxmox через Terraform:
provider "proxmox" {
pm_api_url = "https://pve01:8006/api2/json"
pm_api_token_id = "terraform@pve!tf"
pm_api_token_secret = "YOURSECRET"
pm_tls_insecure = true
}
resource "proxmox_vm_qemu" "vm01" {
name = "dev-vm01"
target_node = "pve01"
clone = "ubuntu-base-cloudinit" # базовый cloud-init шаблон
cores = 2
memory = 2048
disk {
size = "10G"
type = "scsi"
storage = "local-lvm"
}
network {
model = "virtio"
bridge = "vmbr0"
}
agent = 1
}
Теперь — меняем параметры и смотрим, как Terraform с этим работает.
Хочешь апгрейднуть виртуалку? Просто меняешь значения:
resource "proxmox_vm_qemu" "vm01" {
name = "dev-vm01"
target_node = "pve01"
cores = 4 # было 2
memory = 4096 # было 2048
# остальное без изменений
}
Поведение: Proxmox позволяет менять CPU/RAM без пересоздания VM. Terraform спокойно выполнит API-update, VM перезапустится при необходимости.
disk {
size = "20G" # было 10G
type = "scsi"
storage = "local-lvm"
}
Важно: в Proxmox увеличение дисков — ок, уменьшение — невозможно. Terraform правильно выполнит resize через API.
Перемещение storage почти всегда вызывает пересоздание VM!
disk {
size = "20G"
type = "scsi"
storage = "ceph-storage" # сменили storage
}
Terraform покажет destroy + create. Это норма — Proxmox API иначе не умеет.
Proxmox VE 9.1 круто работает с cloud-init, а Terraform позволяет менять его значения:
os_type = "cloud-init"
ciuser = "devops"
cipassword = "StrongPass123!"
ipconfig0 = "ip=192.168.10.50/24,gw=192.168.10.1"
sshkeys = file("~/.ssh/id_rsa.pub")
Поведение: изменения применяются без пересоздания VM, Terraform дергает API cloud-init options.
terraform plan и applyКлассический цикл:
terraform fmt
terraform validate
terraform plan
terraform apply
На что смотреть в плане:
Главный чек: если Terraform показывает пересоздание VM — убедись, что там нет важных данных.
agent = 1. Без него Terraform иногда не может корректно получить статус.lifecycle { prevent_destroy = true } защищай от случайного удаления.Полный гайд по работе Terraform с Proxmox VE 9.1: создание cloud-init шаблона, настройка Terraform Provider и автоматическое создание VM.
Terraform позволяет управлять инфраструктурой как кодом. Для Proxmox 9.1 это особенно удобно:
apply создаёт полностью готовую VM;ip=dhcp или netplan config.Требования:
Telmate/proxmox >= 2.9root@pamAdministratorwget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
qm create 9000 --memory 2048 --cores 2 --name "ubuntu-ci-template" --net0 virtio,bridge=vmbr0
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --serial0 socket --vga serial0
qm template 9000
Шаблон готов. Он полностью совместим с Terraform и Proxmox VE 9.1.
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = ">= 2.9.0"
}
}
}
provider "proxmox" {
pm_api_url = "https://YOUR-PVE-IP:8006/api2/json"
pm_api_token_id = var.pve_token_id
pm_api_token_secret = var.pve_token_secret
pm_tls_insecure = true
}
variable "pve_token_id" { type = string }
variable "pve_token_secret" { type = string }
variable "vm_name" { type = string default = "devopz-91" }
variable "vm_memory" { type = number default = 2048 }
variable "vm_cores" { type = number default = 2 }
Пример работает с cloud-init шаблоном ID 9000.
resource "proxmox_vm_qemu" "vm" {
name = var.vm_name
target_node = "pve"
clone = "9000"
agent = 1
onboot = true
cores = var.vm_cores
memory = var.vm_memory
ssh_user = "ubuntu"
# v9.1: cloud-init поддерживает ipconfig0 грамотно
ipconfig0 = "ip=dhcp"
ciuser = "ubuntu"
cipassword = "P@ssw0rd123!"
sshkeys = file("~/.ssh/id_rsa.pub")
disk {
size = "10G"
}
network {
bridge = "vmbr0"
model = "virtio"
}
}
output "vm_name" {
value = proxmox_vm_qemu.vm.name
}
output "vm_ip" {
value = proxmox_vm_qemu.vm.ssh_host
}
terraform initterraform planterraform applyterraform destroy удаляет её полностью.ide2 → cloudinit.agent = 1.Да, Debian 12 Cloud работает идеально с PVE 9.1.
Да, но ZFS-диски импортируются через qm importdisk ... storage=zfs.
Нет, достаточно обычного ~/.ssh/id_rsa.pub.
Да, можно подсовывать cicustom, но Terraform Telmate его не поддерживает напрямую.