CODECAVE
Время чтения: 2 мин.

Как автоматизировать развёртывание виртуальных машин Proxmox с помощью Pulumi

Развёртываем ВМ в Proxmox за считаные минуты с Pulumi и Python

Автоматизация инфраструктуры — ключ к быстрому, эффективному, предсказуемому и воспроизводимому развёртыванию окружений. Большинство руководств по Proxmox и Pulumi досадно поверхностны: в них много громких слов, но нет ни реальных примеров, ни пошагового разбора. Мы знаем, что одной теории вам мало. Вам нужно руководство, которое погружается в детали, раскрывает подводные камни и даёт рабочий код, который можно сразу развернуть.

В нашей предыдущей статье о Proxmox мы показали, как шаблоны ВМ Proxmox в связке с Cloud-Init радикально ускоряют развёртывание. Это прочная основа, но есть подход ещё мощнее.

Чтобы добиться настоящей автоматизации «одной командой» и избавиться от дрейфа конфигурации из-за ручных правок, нужен инструмент, который позволяет описывать инфраструктуру так же, как вы пишете код приложения. В отличие от устаревших инструментов с проприетарными языками, Pulumi позволяет описывать инфраструктуру на уже знакомых вам языках программирования: Python, Go, C#, Java и TypeScript. А значит, вы опираетесь на имеющиеся навыки программирования, применяете лучшие практики разработки ПО и легко встраиваете всё это в конвейеры CI/CD. В этом практическом руководстве мы подробно покажем, как использовать Pulumi с Proxmox: от установки до рабочего примера на Python, который вы сможете сразу адаптировать под себя. Этот разбор даст вам знания и уверенность, чтобы по-новому выстроить управление инфраструктурой. Готовы прокачать навыки? Приступим.

Что такое Pulumi?

Pulumi — инструмент с открытым исходным кодом для управления облачной инфраструктурой. Его ключевые особенности:

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

В Proxmox провайдер pulumi-proxmoxve позволяет управлять:

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

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

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

Установка в macOS

brew install pulumi/tap/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

Если команда выводит номер версии Pulumi, установка завершена.

Шаг 2. Настройка интеграции Pulumi с Proxmox

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

2.1 Включение доступа к API в Proxmox

  1. Откройте веб-интерфейс Proxmox
  2. Перейдите к API-токенам: Datacenter → Permissions → API Tokens
  3. Создайте токен, например root@pam
  4. Отключите «Privilege Separation» (для полного доступа) и нажмите «Add»
  5. Скопируйте:
    • Token ID
    • Secret
  6. Назначьте права: Datacenter → Permissions → Add → Api token:
    • Path → /
    • Api token → имя токена
    • Role → Administrator

Шаг 3. Создание проекта Pulumi

mkdir pulumi-proxmox
cd pulumi-proxmox
pulumi new python

После инициализации у вас появятся файлы:

Pulumi.yaml
__main__.py
requirements.txt

Установка провайдера:

pip install pulumi-proxmoxve

У Pulumi есть собственный встроенный механизм конфигурации — с ним мы и будем работать

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. Пример кода: создание ВМ из шаблона

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

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

# 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")

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

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

Создание ВМ из шаблона

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. Запуск

Предварительный просмотр плана:

pulumi preview

Применение:

pulumi up

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

Шаг 6. Удаление ВМ

Если ВМ больше не нужна:

pulumi destroy

Чего мы добились?

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

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

Для более глубокого погружения рекомендуем изучить официальную документацию Proxmox и следить за нашими новыми статьями. Мы оказываем услуги по Azure, Proxmox, защищённым шаблонам ВМ и усилению безопасности CI/CD.