Автоматизация Proxmox с помощью Pulumi: Полное руководство

Автоматизация Proxmox с помощью Pulumi

Перед тем, как перейти к Pulumi, мы раскроем основное преимущество автоматизации инфраструктуры. Автоматизация инфраструктуры позволяет быстро, предсказуемо и воспроизводимо развертывать окружение. Таким образом компании могут автоматически управлять ИТ-ресурсами (серверы, контейнеры и облачная инфраструктура). Автоматизация позволяет исключить ручные процессы. Ранее в статье о Proxmox мы описали, как использовать шаблоны виртуальных машин Proxmox в сочетании с Cloud-Init. Это уже даёт нам быстрый и предсказуемый процесс развертывания VM. Но чтобы довести автоматизацию до уровня "одной команды", нам нужен инструмент, который умеет описывать инфраструктуру как код. Одним из таких инструментов является Pulumi - современная IaC-платформа, позволяющая писать инфраструктурный код на современных языках программирования: Python, Go, C#, Java, TypeScript. В этой статье мы разберём, как Pulumi помогает автоматизировать создание VM в Proxmox, начиная с установки и заканчивая рабочим примером с помощью python.

Что такое Pulumi?

Pulumi - это open-source инструмент для управления инфраструктурой через код. Его ключевые особенности:

  • использует универсальные языки программирования, а не DSL (как Terraform).
  • работает с основными облачными платформами, которые использует большинство компаний
  • данные об инфраструктуре можно хранить локально или используя S3, Pulumi Cloud.
  • позволяет писать логику, циклы, условия, функции - всё, что доступно в языках программирования.

Для Proxmox существует провайдер pulumi-proxmoxve, который позволяет управлять:

  • виртуальными машинам (VM);
  • шаблонами;
  • дисками;
  • сетевыми интерфейсами;
  • cloud-init параметрами.

Шаг 1: Установка Pulumi

Pulumi можно установить на все популярные ОС:

Установка Pulumi на MacOS

brew install pulumi/tap/pulumi

Установка Pulumi на Windows

Скачиваем инстраллер с официального сайта Pulumi

Установка Pulumi на Linux

curl -fsSL https://get.pulumi.com | sh

После установки Pulumi добавляется в ~/.pulumi/bin. Если по каким-то причинам переменная PATH не обновилась:

export PATH=$PATH:$HOME/.pulumi/bin
echo 'export PATH=$PATH:$HOME/.pulumi/bin' >> ~/.bashrc
source ~/.bashrc

Проверяем установку

pulumi version

Если всё прошло успешно - увидим номер версии.

Шаг 2. Настройка Pulumi для работы с Proxmox

Чтобы Pulumi мог управлять Proxmox, ему нужен доступ к API.

2.1. Включаем API-доступ в Proxmox

  1. Открываем Proxmox Web UI
  2. Переходим: Datacenter → Permissions → API Tokens
  3. Создаём токен для пользователя, например root@pam
  4. Ставим галочку Privilege Separation = false (если хотим полный доступ)
  5. Копируем:
  • Token ID
  • Secret
  1. Добавляем права: Datacenter → Permissions → Add → Api token:
  • Path → /
  • Api token → Название токена
  • Role → Administrator

Шаг 3. Создаём Pulumi проект

mkdir pulumi-proxmox
cd pulumi-proxmox
pulumi new python

Pulumi создаст структуру:

Pulumi.yaml
__main__.py
requirements.txt

Устанавливаем провайдер:

pip install pulumi-proxmoxve

Pulumi предоставляет свой встроенный конфиг, c которым и будем работать:

pulumi config set proxmox:endpoint https://192.168.0.128:8016/
pulumi config set proxmox:api-name root@pam!pulumi
pulumi config set proxmox:public-key: "ssh-key"
pulumi config set proxmox:api-token "api token" --plaintext

Шаг 4. Пример кода: создание VM из шаблона

Теперь самое интересное - создадим VM из шаблона, который мы подготовили ранее.

Импорт провайдера:

# python
import pulumi
from pulumi_proxmoxve import Provider
from pulumi_proxmoxve.vm import VirtualMachine

Загружаем конфигурацию Pulumi:

# python
config = pulumi.Config("proxmox")
endpoint = config.require("endpoint")
public_key = config.require("public-key")
api_token = config.require_secret("api-token")
api_name = config.require("api-name")

Подключение к Proxmox API:

# python
provider = proxmoxve.Provider(
    "proxmoxve",
    endpoint=endpoint,
    api_token=f"{api_name}={api_token}",
    insecure=True
)

Создание VM из шаблона:

vm = proxmoxve.vm.VirtualMachine(
       resource_name="vm-test",
       node_name="srv0",        
       vm_id=9875,               
       name="pulumi-vm-test",
       agent=proxmoxve.vm.VirtualMachineAgentArgs(
           enabled=False,
           trim=True,
           type="virtio"
       ),
       bios="seabios",
       memory=proxmoxve.vm.VirtualMachineMemoryArgs(
           dedicated=4096
       ),
       cpu=proxmoxve.vm.VirtualMachineCpuArgs(
           cores=2,
           sockets=1
       ),
       clone=proxmoxve.vm.VirtualMachineCloneArgs(
           node_name="srv0",
           vm_id=9000,
           full=True
       ),
       disks=[
           proxmoxve.vm.VirtualMachineDiskArgs(
               interface="scsi0",
               datastore_id="local-lvm",
               size=20,              
               file_format="qcow2"
           )
       ],
       cdrom=proxmoxve.vm.VirtualMachineCdromArgs(
           interface="ide2",
           file_id="none"
       ),
       network_devices=[
           proxmoxve.vm.VirtualMachineNetworkDeviceArgs(
               bridge="vmbr0",
               model="virtio"
           )
       ],
       on_boot=True,
       operating_system=proxmoxve.vm.VirtualMachineOperatingSystemArgs(type="other"),
       initialization=proxmoxve.vm.VirtualMachineInitializationArgs(
           type="nocloud",
           datastore_id="local-lvm",
           dns=proxmoxve.vm.VirtualMachineInitializationDnsArgs(
               domain="example.com",
               servers=["1.1.1.1", "8.8.8.8"]
           ),
           ip_configs=[
               proxmoxve.vm.VirtualMachineInitializationIpConfigArgs(
                   ipv4=proxmoxve.vm.VirtualMachineInitializationIpConfigIpv4Args(
                       address="192.168.0.140/24",
                       gateway="192.168.0.1"
                   )
               )
           ],
           user_account=proxmoxve.vm.VirtualMachineInitializationUserAccountArgs(
               username="user",
               password="password123",
               keys=[public_key]
           )
       ),
       opts=pulumi.ResourceOptions(provider=prov

Шаг 5. Запуск автоматического создания VM в Proxmox

Просмотр плана:

pulumi preview

Применение:

pulumi up

Pulumi покажет, что будет создана VM, и попросит подтверждение. После подтверждения -VM появится в Proxmox.

Шаг 6. Очистка среды: удаление VM через Pulumi

Если больше не требует vm:

pulumi destroy

Результаты: Что даёт автоматизация Proxmox через Pulumi

  • Полностью автоматизированный процесс создания VM.
  • Использование шаблона + Cloud-Init.
  • Управление через Python-код.
  • Возможность создавать десятки VM одной командой.

Такой подход легко масштабируется: можно генерировать VM в цикле, создавать пулы ресурсов, автоматически подключать их к сетям и интегрировать всё это в CI/CD. Для более детального изучения мы советуем ознакомиться с официальной документацией Proxmox и следить за обновлениями наших статей.

Мы предоставляем услуги в следующих областях:

  • Azure и Proxmox — миграция и оптимизация инфраструктуры;
  • разработка защищённых шаблонов VM;
  • CI/CD автоматизация — от настройки до аудита безопасности.

Чтобы узнать больше о том, как мы реализуем безопасные решения автоматизации, посетите раздел DevOps на нашем сайте.