Proxmox VE надає повноцінний REST API, через який доступні всі операції — від створення VM до керування кластером. Це основа для інтеграції з Terraform, Ansible, CI/CD і власними скриптами.
Автентифікація: API-токен vs. Cookie
| Метод | Застосування | Термін дії |
|---|---|---|
| API Token | Скрипти, автоматизація, CI/CD | Безстроково (до відкликання) |
| Session Cookie | Вебінтерфейс, разові запити | 2 години |
Створення API-токена
# Створити користувача для автоматизації
pveum user add automation@pve --password AutoPass123
# Призначити права
pveum aclmod / --users automation@pve --roles PVEVMAdmin
# Створити API-токен (без привілеїв суперкористувача)
pveum user token add automation@pve mytoken --privsep 0
# Вивід: automation@pve!mytoken = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Приклади запитів через curl
>TOKEN="automation@pve!mytoken=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
HOST="https://192.168.1.100:8006/api2/json"
# Список вузлів кластера
curl -s -k -H "Authorization: PVEAPIToken=$TOKEN" "$HOST/nodes" | python3 -m json.tool
# Список VM на вузлі pve
curl -s -k -H "Authorization: PVEAPIToken=$TOKEN" "$HOST/nodes/pve/qemu"
# Запустити VM 100
curl -s -k -X POST -H "Authorization: PVEAPIToken=$TOKEN" "$HOST/nodes/pve/qemu/100/status/start"
# Зупинити VM
curl -s -k -X POST -H "Authorization: PVEAPIToken=$TOKEN" "$HOST/nodes/pve/qemu/100/status/stop"
# Створити знімок
curl -s -k -X POST -H "Authorization: PVEAPIToken=$TOKEN" -d "snapname=api-test&description=Created+via+API" "$HOST/nodes/pve/qemu/100/snapshot"
Python SDK для Proxmox
>from proxmoxer import ProxmoxAPI
proxmox = ProxmoxAPI(
'192.168.1.100',
user='automation@pve',
token_name='mytoken',
token_value='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
verify_ssl=False
)
# Список усіх VM
for vm in proxmox.nodes('pve').qemu.get():
print(f"VM {vm['vmid']}: {vm['name']} - {vm['status']}")
# Створити знімок
proxmox.nodes('pve').qemu(100).snapshot.post(
snapname='python-snap',
description='Created via Python SDK'
)
# Запустити VM
proxmox.nodes('pve').qemu(100).status.start.post()
pip install proxmoxer requests. Офіційна документація API доступна на вашому сервері: https://YOUR-PVE:8006/pve-docs/api-viewer/
Terraform-провайдер Proxmox
>terraform {
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "~> 0.50"
}
}
}
provider "proxmox" {
endpoint = "https://192.168.1.100:8006/"
api_token = "automation@pve!mytoken=xxxxxxxx..."
insecure = true
}
resource "proxmox_virtual_environment_vm" "ubuntu" {
name = "tf-ubuntu"
node_name = "pve"
vm_id = 300
clone {
vm_id = 100 # ID шаблону
full = false
}
cpu { cores = 2 }
memory { dedicated = 2048 }
network_device {
bridge = "vmbr0"
model = "virtio"
}
}Часті помилки під час роботи з Proxmox API
401 Unauthorized: permission denied - invalid PVE ticket
596 Connection reset by peer / SSL_ERROR
Parameter verification failed: vmid: value does not look like a valid VM ID
403 Forbidden: Permission check failed (/vms/100, VM.PowerMgmt)| Повідомлення | Причина | Рішення |
|---|---|---|
| 401 Unauthorized: invalid PVE ticket | API-токен вказаний невірно або відкликаний, або забутий префікс PVEAPIToken= у заголовку | Перевірити формат заголовка: Authorization: PVEAPIToken=user@realm!tokenid=UUID |
| 596 Connection reset / SSL_ERROR | Клієнт звертається по HTTP замість HTTPS, або самопідписаний сертифікат не прийнятий без прапорця verify_ssl=False | Використовувати https:// і прапорець -k у curl або verify_ssl=False у proxmoxer для тестового стенду |
| Parameter verification failed: vmid | ID віртуальної машини переданий як рядок з неприпустимими символами або поза діапазоном | Вказувати vmid лише числом у допустимому діапазоні, без лапок у JSON-тілі запиту |
| 403 Forbidden: Permission check failed | У користувача API-токена немає ролі з потрібним правом (наприклад, VM.PowerMgmt) на цьому шляху | Призначити роль через pveum aclmod на шлях /vms/VMID або загальний /, а не лише створити токен |
API-токен проти Terraform-провайдера: що обрати
| Критерій | Прямий API-токен (curl/Python) | Terraform-провайдер |
|---|---|---|
| Разові операції і скрипти | Швидко, мінімум залежностей | Надмірно для однієї команди |
| Відтворювана інфраструктура з коду | Потрібно писати ідемпотентність вручну | Штатно — state-файл відстежує зміни |
| Відкат до попередньої конфігурації | Вручну, через окремі API-виклики | terraform apply з попереднім state |
| Поріг входу для команди | Нижчий — звичайний HTTP-клієнт | Вищий — потрібно знати HCL і життєвий цикл Terraform |
Коли автоматизація через API не підходить
- Разова ручна задача, яку простіше виконати через вебінтерфейс за одну хвилину — обгортати її в скрипт з автентифікацією не окупається
- У команді ніхто не підтримує отримані скрипти після відходу автора — необслуговувана автоматизація небезпечніша, ніж її відсутність, особливо поряд із
status/startіstatus/stop - Потрібна візуальна перевірка стану кластера перед кожною дією (сусідні ноди, вільне місце) — API не показує це так само наочно, як вебінтерфейс
- Інфраструктура змінюється настільки рідко, що Terraform state розходитиметься з реальністю між запусками — у цьому разі ручні операції надійніші за автоматизацію, за якою не стежать
Перевірка, що автоматизація працює правильно
# Токен дійсний і бачить кластер
curl -s -k -H "Authorization: PVEAPIToken=$TOKEN" "$HOST/version"
# Права токена обмежені очікуваним набором
pveum user permissions automation@pve
# Список задач, запущених через API, для звірки з логом скрипта
pvesh get /nodes/pve/tasks --limit 10- Виконайте запит до
/versionбез прив'язки до конкретної VM — якщо він повертає 200, токен робочий на базовому рівні - Звірте фактичні права токена командою
pveum user permissionsз тим, що очікувалося під час створення — зайві права найпростіше прибрати одразу - Після виконання скрипта перевірте список задач у
/nodes/NODE/tasks— кожна дія API має там відображатися з підсумковим статусом OK - Для Terraform виконайте
terraform planбез застосування і переконайтеся, що він не показує неочікуваних змін на вже наявних ресурсах
Обмеження прав токена за ролями і ACL розглядає стаття користувачі, ролі і ACL у Proxmox, а базовий захист самого вебінтерфейсу панелі — матеріал двофакторний захист панелі Proxmox.
Часті питання
Чи обходить API-токен двофакторну автентифікацію, увімкнену для входу у вебінтерфейс Proxmox?
API-токен і вхід у вебінтерфейс — це різні механізми автентифікації: токен має власний секрет і перевіряється окремо від сесії браузера, тому формально він не «обходить» двофакторний захист, а просто працює іншим шляхом входу, для якого цей захист не передбачено. Саме тому права і термін дії такого токена варто обмежувати особливо уважно.
Що безпечніше: видати токену автоматизації права суперкористувача чи обмежену роль?
Обмежена роль безпечніша практично завжди: токен створюється під конкретну задачу, і йому варто видавати лише ті права, які реально потрібні скрипту, через призначення ролі на конкретний шлях, а не на корінь дерева ресурсів. Права суперкористувача перетворюють витік одного токена на компрометацію всього кластера цілком, тоді як вузька роль обмежує збиток заздалегідь зрозумілими рамками.
Чи потрібно передавати пароль користувача за кожного запиту, якщо використовується API-токен?
Ні, у цьому і сенс токена: одного разу створене значення підставляється в заголовок запиту і діє без введення пароля, поки його явно не відкликали. Пароль потрібен лише для сесійного входу через cookie, що має обмежений термін дії, тоді як токен створено спеціально для скриптів і автоматизації, де повторне ручне введення пароля було б незручним і небезпечним.
Чи варто переходити на Terraform, якщо прямі виклики API через curl чи Python уже працюють?
Якщо наявні скрипти вирішують разові задачі і ними хтось постійно опікується, змінювати їх на Terraform не обов'язково. Перехід виправданий, коли інфраструктура має відтворюватися за описом із коду, потрібен відкат до попередньої конфігурації і відстеження стану, — тоді state-файл Terraform бере на себе те, що інакше довелося б реалізовувати вручну поверх прямих викликів API.