Разбираем на практике, как управлять VM в Proxmox через Terraform: изменять CPU/RAM, диски, cloud-init, теги, заметки, количество нод и параметры. Всё — как в реальной продовой конфигурации.
Кратко: меняем параметры VM → запускаем terraform plan → проверяем разницу → terraform apply. Proxmox провайдер делает всю грязную работу.
Почему Terraform + Proxmox
Proxmox VE 9.1 — мощная штука, но руками создавать VM не кайф. Terraform позволяет полностью описывать инфраструктуру кодом: VM, параметры, диски, cloud-init, сеть, storage. Изменения вносятся декларативно: ты просто правишь .tf, а Terraform приводит Proxmox к новому состоянию.
Начальная конфигурация VM
Пример минимальной 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 с этим работает.
1) Изменение CPU и RAM
Хочешь апгрейднуть виртуалку? Просто меняешь значения:
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 перезапустится при необходимости.
2) Изменение дисков (size, storage)
Увеличение размера диска
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 иначе не умеет.
3) Cloud-Init: изменение параметров
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 — убедись, что там нет важных данных.
Полезные советы и подводные камни
- Используй QEMU Agent —
agent = 1. Без него Terraform иногда не может корректно получить статус. - Не меняй storage у дисков, если не готов пересоздать VM.
- Cloud-init шаблон делай заранее → clone в Terraform работает идеально.
- Держи state вне локалки (minio, S3-compatible, GitLab storage).
- Не уменьшай диски — Proxmox не умеет.
- Если VM критичная — через
lifecycle { prevent_destroy = true }защищай от случайного удаления.