Terraform + Proxmox VE 9.1: автоматическое создание ВМ

29 November 2025

Полный гайд по работе 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

  1. Datacenter → Permissions → API Tokens.
  2. Create.
  3. User: root@pam
  4. Permissions: Administrator
  5. Запомнить 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
}

Рабочий цикл

  1. terraform init
  2. terraform plan
  3. terraform apply
  4. VM появляется в Proxmox → запускается → получает DHCP-IP → доступна по SSH.
  5. terraform destroy удаляет её полностью.

Best Practices для Proxmox VE 9.1

  • Не храни Token в git — используй переменные окружения.
  • В 9.1 cloud-init лучше работает с ide2cloudinit.
  • Для стабильной работы 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 его не поддерживает напрямую.

Leave a comment

Popular Posts

Headlines