Автоматическое развёртывание ВМ в Proxmox VE с помощью OpenTofu и cloud-init
В этой статье расскажем, как за один вечер настроить автоматическое развёртывание виртуалок в 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 и другими.
Что нужно до начала?
Установленный Proxmox VE (проверено на 8.x).
Шаблон ВМ с поддержкой cloud-init (Ubuntu 22.04, например).
Хост-машина с установленным OpenTofu.
Провайдер Telmate/proxmox.
Шаг 1: создаём cloud-init шаблон в Proxmox
Скачай ISO Ubuntu:
wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso
Установи ВМ через ISO, задай минимальные настройки.
Установи
cloud-init
:sudo apt update && sudo apt install cloud-init -y
Выключи ВМ, запиши её как шаблон:
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: Запуск
Инициализируй проект:
tofu init
Добавь
terraform.tfvars
:pm_password = "your_proxmox_password" vm_password = "your_vm_password"
Применяй:
tofu apply
Через пару минут у тебя появятся виртуалки с nginx, готовые к работе.
Что можно улучшить?
Добавить статическую раздачу IP.
Установку Docker.
Установку Bitrix или ELMA365 прямо в cloud-init.
Настроить Ansible для post-config.
Заключение
Proxmox + OpenTofu + cloud-init — это реально мощный стек для автоматического развёртывания. Подходит как для pet-проектов, так и для enterprise-окружений. Всё на коде, всё масштабируется, всё под контролем.