В этой статье расскажем, как за один вечер настроить автоматическое развёртывание виртуалок в Proxmox VE с помощью OpenTofu и cloud-init. С нуля до готовых ВМ с веб-сервером, без ручной рутины.

Зачем вообще автоматизация?

В эпоху DevOps и IaC (Infrastructure as Code) ручная настройка серверов — это не только боль, но и риск. Один неправильный шаг — и у тебя production не взлетел. С автоматизацией ты получаешь:

  • предсказуемость;

  • повторяемость;

  • контроль версий;

  • и экономию времени.

В связке Proxmox + OpenTofu + cloud-init можно за минуты поднимать окружения любой сложности.

Что будем использовать?

  • Proxmox VE — гипервизор на базе Debian, поддерживает KVM и LXC, есть Web UI, API, кластеризация и cloud-init.

  • OpenTofu — форк Terraform с открытой лицензией (MPL), поддерживает провайдер Proxmox.

  • cloud-init — тулза для автоконфигурации ВМ на первом старте. Работает с Ubuntu, Debian и другими.

Что нужно до начала?

  1. Установленный Proxmox VE (проверено на 8.x).

  2. Шаблон ВМ с поддержкой cloud-init (Ubuntu 22.04, например).

  3. Хост-машина с установленным OpenTofu.

  4. Провайдер Telmate/proxmox.

Шаг 1: создаём cloud-init шаблон в Proxmox

  1. Скачай ISO Ubuntu:

    wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso
  2. Установи ВМ через ISO, задай минимальные настройки.

  3. Установи cloud-init:

    sudo apt update && sudo apt install cloud-init -y
  4. Выключи ВМ, запиши её как шаблон:

    qm template <vmid>

Шаг 2: Конфиг OpenTofu

Создай папку проекта, например proxmox-autodeploy/, и добавь туда следующие файлы:

main.tf

provider "proxmox" {
  pm_api_url      = "https://proxmox.local:8006/api2/json"
  pm_user         = "root@pam"
  pm_password     = var.pm_password
  pm_tls_insecure = true
}

resource "proxmox_vm_qemu" "web" {
  name        = "web-${count.index + 1}"
  count       = var.vm_count
  target_node = var.target_node
  clone       = var.template_name

  cores       = 2
  memory      = 2048
  scsihw      = "virtio-scsi-pci"
  bootdisk    = "scsi0"

  disk {
    size    = "10G"
    type    = "scsi"
    storage = "local-lvm"
  }

  network {
    model    = "virtio"
    bridge   = "vmbr0"
  }

  ipconfig0 = "ip=dhcp"

  cloudinit_user = "ubuntu"
  cloudinit_password = var.vm_password
  sshkeys = file("~/.ssh/id_rsa.pub")
}

variables.tf

variable "pm_password" {
  type = string
  sensitive = true
}

variable "vm_password" {
  type = string
}

variable "vm_count" {
  type = number
  default = 2
}

variable "template_name" {
  type = string
  default = "ubuntu-cloudinit-template"
}

variable "target_node" {
  type = string
  default = "proxmox-node1"
}

cloud-init.yaml (пример для настройки nginx)

#cloud-config
package_update: true
packages:
  - nginx
runcmd:
  - systemctl enable nginx
  - systemctl start nginx

Шаг 3: Запуск

  1. Инициализируй проект:

    tofu init
  2. Добавь terraform.tfvars:

    pm_password = "your_proxmox_password"
    vm_password = "your_vm_password"
  3. Применяй:

    tofu apply

Через пару минут у тебя появятся виртуалки с nginx, готовые к работе.

Что можно улучшить?

  • Добавить статическую раздачу IP.

  • Установку Docker.

  • Установку Bitrix или ELMA365 прямо в cloud-init.

  • Настроить Ansible для post-config.

Заключение

Proxmox + OpenTofu + cloud-init — это реально мощный стек для автоматического развёртывания. Подходит как для pet-проектов, так и для enterprise-окружений. Всё на коде, всё масштабируется, всё под контролем.