Search
Write a publication
Pull to refresh

Автоматическое развёртывание ВМ в Proxmox VE с помощью OpenTofu и cloud-init

Level of difficultyMedium

В этой статье расскажем, как за один вечер настроить автоматическое развёртывание виртуалок в 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-окружений. Всё на коде, всё масштабируется, всё под контролем.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.