Как автоматизировать развёртывание виртуальных машин 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
- Откройте веб-интерфейс Proxmox
- Перейдите к API-токенам: Datacenter → Permissions → API Tokens
- Создайте токен, например root@pam
- Отключите «Privilege Separation» (для полного доступа) и нажмите «Add»
- Скопируйте:
- Token ID
- Secret
- Назначьте права: 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 upPulumi покажет, какая ВМ будет создана, и запросит подтверждение. После подтверждения ВМ появится в Proxmox.
Шаг 6. Удаление ВМ
Если ВМ больше не нужна:
pulumi destroyЧего мы добились?
- Полностью автоматизированное создание ВМ
- Использование шаблонов + Cloud-Init
- Управление через код на Python
- Возможность создавать десятки ВМ одной командой
Такой подход легко масштабируется: можно генерировать ВМ в цикле, создавать пулы ресурсов, автоматически подключать их к сетям и встроить всё это в CI/CD.
Для более глубокого погружения рекомендуем изучить официальную документацию Proxmox и следить за нашими новыми статьями. Мы оказываем услуги по Azure, Proxmox, защищённым шаблонам ВМ и усилению безопасности CI/CD.