Щоразу, коли мені потрібна нова віртуалка на Proxmox, я маю вибір із кількох варіантів - і більшість із них погані.
A. Завантажити ISO -> створити VM -> встановити ОС -> залогуватися -> додати користувача, налаштувати мережу і SSH. Довго, і так щоразу.
B. Щоб було швидше, машину з пункту A можна перетворити на template і далі клонувати. Залишиться залогуватися та поміняти IP, hostname і ключі. Частину роботи можна віддати Ansible - але це все одно два кроки: склонувати і прогнати плейбук. Трохи швидше.
C. Один раз приготувати шаблон з Cloud-Init, а при клонуванні вказувати SSH-ключ, hostname та IP прямо з Proxmox. Те, що треба.
А не ось це щоразу (так не робимо):
Cloud-Init - це той самий механізм, яким AWS, GCP та Azure налаштовують інстанси ще до першого запуску. У Proxmox він теж є: задаємо параметри (користувач, SSH-ключі, IP), а Cloud-Init застосовує їх при першому завантаженні машини.
Що потрібно зробити?#
- завантажити офіційний cloud image (готовий образ ОС із вбудованим Cloud-Init);
- зібрати з нього шаблон з диском Cloud-Init і перетворити на
template; - склонувати шаблон і передати клону hostname, IP та SSH-ключ;
- пересвідчитися, що машина піднялась саме так, як ми задали;
- те саме зробити мишкою у вебінтерфейсі - для тих, кому так звичніше.
З чим працюю?#
| |
- Proxmox VE 9.2 (підійде будь-який 8.x чи 9.x);
- Ubuntu 26.04 LTS cloud image від Canonical;
- сховище для дисків VM - у прикладі
local-lvm(підставляй назву свого); - міст
vmbr0, у який дивляться машини.
Доступ до GUI або SSH на Proxmox - і все. Адреси та VMID у прикладі - мої; усюди підставляй свої.
Спершу подивимось на весь шлях одним відео, а далі розберемо кожен крок.
Завантажуємо cloud image#
Cloud image - це готовий образ диска з уже встановленою ОС і Cloud-Init усередині. Важить він небагато, бо це не ISO-інсталятор, а майже порожня система, яка «добудує» себе при першому запуску.
| |
Перевіримо, що саме завантажили:
| |
| |
Формат qcow2, віртуальний розмір 3.5 ГБ, реально на диску - 825 МБ. Диск ми потім розширимо під потрібний розмір, Cloud-Init сам доросте файлову систему.
Збираємо шаблон#
1. Порожня VM без диска#
Диск підключимо наступним кроком - з образу. Поки що створюємо саму машину з контролером virtio-scsi-single (сучасний і найшвидший варіант SCSI у Proxmox):
| |
VMID 9000 - за традицією під шаблони віддають «високі» номери, щоб не плутати з робочими машинами.
2. Імпортуємо cloud image як диск#
| |
local-lvm- назва вашого сховища;0- розмір береться автоматично з образу;--scsi0- диск на SCSI-контролері.
Proxmox імпортує й сконвертує образ:
| |
3. Диск Cloud-Init#
| |
Це віртуальний CD-ROM, через який Proxmox передаватиме налаштування (користувача, SSH-ключі, IP) всередину машини. Побачите рядок generating cloud-init ISO - Proxmox щоразу перегенеровує цей диск, коли параметри змінюються.
4. Завантаження, консоль, агент#
| |
--boot order=scsi0- вантажимось лише з диска, не чекаючи CD-ROM;--serial0 socket --vga serial0- багато cloud images очікують serial console; без неї можна не побачити вивід при завантаженні;--agent enabled=1- вмикаємо QEMU Guest Agent, щоб Proxmox бачив IP машини й коректно робив shutdown та freeze для бекапів. Щоб агент справді відповідав, він має бути встановлений усередині образу - Ubuntu cloud image це вміє, інакше в GUI побачите «Guest Agent not running».
5. Перетворюємо на шаблон#
| |
| |
Готово. У дереві Proxmox машина з’явиться з іконкою шаблону, запустити її вже не можна - тільки клонувати.
Клонуємо й задаємо параметри#
Ось тут і починається магія. Клонуємо шаблон у нову VM:
| |
--full робить повну, незалежну копію диска. (Є ще linked clone - швидший і легший, але прив’язаний до шаблону; про різницю - нижче.)
А тепер найцікавіше: одним рядком задаємо користувача, SSH-ключ та IP, які Cloud-Init застосує при першому старті:
| |
--ciuser- ім’я користувача, якого створить Cloud-Init;--cipassword- його пароль (за бажання; надійніше заходити ключем);--sshkeys- шлях до файлу з публічним ключем, він ляже вauthorized_keys;--ipconfig0- мережа дляnet0: або статичноip=.../gw=..., абоip=dhcp;--nameserver- DNS-сервер (ще є--searchdomain).
Збільшимо диск під робочий розмір - Cloud-Init сам розширить кореневу файлову систему при старті:
| |
Запускаємо:
| |
Перевіряємо: воно справді піднялось саме так#
Момент істини - заходимо на свіжу машину тим самим ключем, який вкинули при клонуванні, і дивимось, що Cloud-Init застосував:
| |
| |
Усе на місці: hostname web01, IP саме той, що задали, вхід ключем працює, cloud-init status: done, а коренева файлова система вже розрослася до нового розміру диска. Від qm clone до робочої машини - кілька секунд, без жодного логіну в консоль.
Те саме, але мишкою#
Не всі люблять CLI, тож покажемо той самий шлях у вебінтерфейсі. Відкриваємо VM web01 -> вкладка Cloud-Init - і бачимо рівно те, що задавали командою: користувач, DNS, SSH-ключ та IP Config. Далі беремо шаблон -> More -> Clone -> і Proxmox пропонує той самий діалог клонування.
Вкладка Cloud-Init - це просто інший вигляд на ті самі параметри. Усе, що ми передали через qm set, тут можна відредагувати в полях:

Змінили щось у GUI - натисніть Regenerate Image, щоб Proxmox перезібрав диск Cloud-Init. Нові мережеві параметри підхопляться при наступному завантаженні машини.
Ще швидше: другий клон#
Потрібна ще одна машина? Той самий шаблон, інший VMID, інший IP - і за секунди маємо другу:
| |
| |
| |
Дві однакові машини з різними адресами - і жодного ISO, жодного ручного налаштування.
Дрібниці, що стануть у пригоді#
- DHCP замість статики. Якщо в мережі є DHCP, досить
--ipconfig0 ip=dhcp- і адреса прилетить сама. - Linked clone проти full.
--fullробить незалежну копію (шаблон можна хоч видаляти). Linked clone створюється миттєво й майже не займає місця, але тримається за диск шаблону - зручно для швидких тестових машин, не варто для того, що має жити довго. - Коли Cloud-Init відпрацьовує. Повна конфігурація застосовується лише на першому завантаженні. Якщо хочете «скинути» машину до чистого стану з новими параметрами - простіше склонувати нову з шаблону, ніж перенавчати стару.
- Більше, ніж user і IP. Через Cloud-Init можна передавати цілий
user-data: ставити пакети, писати файли, запускати команди при першому старті. У Proxmox для цього є сніпети (snippets) - окрема тема, але саме так шаблон перетворюється на справжній «золотий образ».
Підсумок#
Один раз витрачений вечір на шаблон - і нові віртуалки перестають бути рутиною. Замість «встановити з ISO -> налаштувати мережу -> створити користувача» залишається qm clone, один qm set із потрібними параметрами і qm start. Hostname, IP та ключ - з коробки, бо про них подбав Cloud-Init.
Наступний логічний крок - не клонувати руками, а описати все кодом: той самий шаблон плюс Terraform, і цілий стенд піднімається однією командою. Але це вже окрема історія.



