Полный гайд по работе Terraform с Proxmox VE 9.1: создание cloud-init шаблона, настройка Terraform Provider и автоматическое создание VM.
Почему Terraform для Proxmox VE 9.1
Terraform позволяет управлять инфраструктурой как кодом. Для Proxmox 9.1 это особенно удобно:
- быстрое создание стендов (Kubernetes, Docker, тестовые ВМ);
- единый cloud-init шаблон для всех виртуалок;
- воспроизводимость — одна команда
applyсоздаёт полностью готовую VM; - хорошая работа с PVE API Token в версии 9.x.
Что изменилось в Proxmox VE 9.1
- Базовая система — Debian 12 (Bookworm), обновлённые qemu/kvm.
- cloud-init теперь использует nocloud backend по умолчанию.
- Новые конфиги сетей Debian 12 требуют
ip=dhcpили netplan config. - UUID-имена дисков изменились (и Terraform Provider стал работать стабильнее).
- local-lvm в 9.1 создаётся с более строгими параметрами хранения.
- Telmate/proxmox стал корректнее обрабатывать serial-консоль + cloud-init.
Подготовка окружения
Требования:
- Proxmox VE 9.1
- Terraform 1.2+
- Terraform Provider:
Telmate/proxmox >= 2.9 - Ubuntu Cloud Image / Debian Cloud Image
- API Token для Terraform
Создание API Token в PVE 9.1
- Datacenter → Permissions → API Tokens.
- Create.
- User:
root@pam - Permissions:
Administrator - Запомнить Token ID + Secret.
Создание cloud-init шаблона в Proxmox VE 9.1
1. Скачиваем Cloud Image
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
2. Создаём VM-шаблон (ID 9000)
qm create 9000 --memory 2048 --cores 2 --name "ubuntu-ci-template" --net0 virtio,bridge=vmbr0
3. Импортируем диск
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm
4. Подключаем диск + cloud-init
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
5. Создаём шаблон
qm template 9000
Шаблон готов. Он полностью совместим с Terraform и Proxmox VE 9.1.
Настройка Terraform Provider
terraform.tf
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = ">= 2.9.0"
}
}
}
provider.tf
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
}
variables.tf
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 }
Создание VM в Proxmox VE 9.1 через Terraform
Пример работает с cloud-init шаблоном ID 9000.
main.tf
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"
}
}
outputs.tf
output "vm_name" {
value = proxmox_vm_qemu.vm.name
}
output "vm_ip" {
value = proxmox_vm_qemu.vm.ssh_host
}
Рабочий цикл
terraform initterraform planterraform apply- VM появляется в Proxmox → запускается → получает DHCP-IP → доступна по SSH.
terraform destroyудаляет её полностью.
Best Practices для Proxmox VE 9.1
- Не храни Token в git — используй переменные окружения.
- В 9.1 cloud-init лучше работает с
ide2→ cloudinit. - Для стабильной работы Telmate/proxmox включай
agent = 1. - Шаблон должен быть только read-only — это важно для клонирования.
- Проверяй формат SSH ключей: некоторые старые RSA-ключи Debian 12 режет.
FAQ
Можно использовать Debian cloud image?
Да, Debian 12 Cloud работает идеально с PVE 9.1.
Работает ли с ZFS?
Да, но ZFS-диски импортируются через qm importdisk ... storage=zfs.
Нужен ли SSH-agent?
Нет, достаточно обычного ~/.ssh/id_rsa.pub.
Поддерживает ли PVE 9.1 cloud-init userdata?
Да, можно подсовывать cicustom, но Terraform Telmate его не поддерживает напрямую.