Создание шаблона Cloud-Init в Proxmox VE
Пошаговое создание шаблона Ubuntu Cloud-Init в Proxmox VE: импорт cloud image, настройка диска, сети, пользователя и клонирование виртуальной машины.
Cloud-Init позволяет автоматически задавать параметры новой виртуальной машины при первом запуске: имя пользователя, SSH-ключ, сетевую конфигурацию, hostname и другие базовые настройки.
В Proxmox VE удобно создать одну подготовленную VM из cloud image, преобразовать её в шаблон и затем быстро клонировать новые виртуальные машины.
В этой инструкции рассматривается только создание шаблона Ubuntu Cloud-Init и запуск VM из него.
Подходит для: Proxmox VE 8 и 9
Уровень сложности: средний
Время выполнения: около 20 минут
Требуемый доступ: root или пользователь с правами на создание VM и шаблонов
Что потребуется
Перед началом подготовьте:
- установленный Proxmox VE;
- доступ к shell узла;
- доступ в интернет с узла;
- хранилище виртуальных дисков;
- свободный VM ID;
- SSH-ключ для входа в будущие VM.
Что будет создано
В результате появится:
- VM на базе официального Ubuntu cloud image;
- подключённый Cloud-Init диск;
- настроенная консоль;
- шаблон Proxmox;
- возможность создавать полные и связанные клоны;
- автоматическая передача SSH-ключа и сетевых параметров.
Выбор VM ID и имени
В примерах используются:
VM ID: 9000
Имя: ubuntu-2404-cloudinit
Хранилище: local-lvm
Bridge: vmbr0
Замените значения на подходящие для своей инфраструктуры.
Переход в рабочий каталог
Создайте каталог:
mkdir -p /var/lib/vz/template/cloud
cd /var/lib/vz/template/cloud
Загрузка Ubuntu Cloud Image
Загрузите образ Ubuntu Server 24.04 LTS:
wget -O ubuntu-24.04-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
Проверьте файл:
ls -lh ubuntu-24.04-server-cloudimg-amd64.img
Создание виртуальной машины
Создайте VM без диска:
qm create 9000 --name ubuntu-2404-cloudinit --memory 2048 --cores 2 --cpu x86-64-v2-AES --net0 virtio,bridge=vmbr0 --ostype l26
Проверьте:
qm config 9000
Импорт диска
Импортируйте cloud image в хранилище:
qm importdisk 9000 ubuntu-24.04-server-cloudimg-amd64.img local-lvm
После завершения диск появится как:
unused0
Проверьте:
qm config 9000
Подключение импортированного диска
Подключите диск как scsi0:
qm set 9000 --scsihw virtio-scsi-single --scsi0 local-lvm:vm-9000-disk-0
Имя тома может отличаться. Используйте фактическое значение, показанное после qm importdisk.
Проверьте:
qm config 9000 |
grep -E 'scsi|unused'
Добавление Cloud-Init диска
qm set 9000 --ide2 local-lvm:cloudinit
Проверьте:
qm config 9000 |
grep ide2
Ожидаемый параметр:
ide2: local-lvm:cloudinit
Настройка загрузки
Укажите основным загрузочным диском scsi0:
qm set 9000 --boot order=scsi0
Проверьте:
qm config 9000 |
grep boot
Настройка последовательной консоли
Для cloud image удобно использовать serial console:
qm set 9000 --serial0 socket --vga serial0
Это позволяет работать с VM через встроенную консоль Proxmox.
Включение QEMU Guest Agent
qm set 9000 --agent enabled=1
Официальный Ubuntu cloud image обычно уже содержит необходимые компоненты для работы Guest Agent, но его состояние следует проверить после запуска клона.
Увеличение системного диска
Исходный cloud image обычно имеет небольшой виртуальный диск.
Увеличьте его, например, на 20 ГБ:
qm resize 9000 scsi0 +20G
Проверьте:
qm config 9000 |
grep scsi0
Cloud-Init обычно расширяет раздел и файловую систему при первом запуске.
Настройка пользователя
Задайте пользователя:
qm set 9000 --ciuser ADMIN_USER
Замените:
ADMIN_USER
на нужное имя.
Добавление SSH-ключа
Создайте временный файл с публичным ключом:
nano /root/cloud-init-authorized-key.pub
Добавьте одну строку публичного ключа вида:
ssh-ed25519 AAAA... admin@example
Сохраните файл и примените:
qm set 9000 --sshkeys /root/cloud-init-authorized-key.pub
Проверьте:
qm config 9000 |
grep sshkeys
Настройка DHCP
Для автоматического получения адреса:
qm set 9000 --ipconfig0 ip=dhcp
Это подходит для сети с DHCP-сервером.
Настройка статического IPv4
Пример:
qm set 9000 --ipconfig0 ip=192.0.2.20/24,gw=192.0.2.1
Используйте адреса своей сети.
DNS-сервер:
qm set 9000 --nameserver 192.0.2.53
DNS search domain:
qm set 9000 --searchdomain example.com
Для универсального шаблона удобнее оставить DHCP, а статический IP задавать уже клону.
Отключение парольного входа
Если используется SSH-ключ:
qm set 9000 --cipassword 'TEMPORARY_PASSWORD'
Но хранить постоянный пароль в шаблоне не рекомендуется.
Безопаснее использовать только SSH-ключ и затем отключить парольный SSH-вход внутри гостевой системы.
Проверка полной конфигурации
qm config 9000
Пример основных параметров:
agent: enabled=1
boot: order=scsi0
ciuser: ADMIN_USER
cores: 2
ide2: local-lvm:cloudinit
ipconfig0: ip=dhcp
memory: 2048
name: ubuntu-2404-cloudinit
net0: virtio=...,bridge=vmbr0
scsi0: local-lvm:vm-9000-disk-0
scsihw: virtio-scsi-single
serial0: socket
vga: serial0
Проверка Cloud-Init данных
Покажите сгенерированную конфигурацию:
qm cloudinit dump 9000 user
Сетевая конфигурация:
qm cloudinit dump 9000 network
Метаданные:
qm cloudinit dump 9000 meta
Это полезно для проверки параметров до запуска.
Преобразование VM в шаблон
Перед преобразованием убедитесь, что VM выключена:
qm status 9000
Преобразуйте:
qm template 9000
Проверьте список:
qm list
В веб-интерфейсе объект будет отображаться как шаблон.
Создание полного клона
Полный клон создаёт независимую копию диска.
qm clone 9000 101 --name app01 --full 1 --storage local-lvm
Преимущества полного клона:
- не зависит от шаблона;
- можно перемещать отдельно;
- проще обслуживать;
- подходит для production.
Недостаток:
- создаётся дольше;
- занимает больше места.
Создание связанного клона
qm clone 9000 102 --name test01 --full 0
Связанный клон:
- создаётся быстро;
- занимает меньше места;
- зависит от базового шаблона;
- подходит для лабораторий и временных VM.
Поддержка linked clone зависит от хранилища.
Настройка клона
Задайте CPU и RAM:
qm set 101 --cores 4 --memory 4096
Задайте пользователя:
qm set 101 --ciuser ADMIN_USER
Задайте SSH-ключ:
qm set 101 --sshkeys /root/cloud-init-authorized-key.pub
Настройка статического IP для клона
qm set 101 --ipconfig0 ip=192.0.2.21/24,gw=192.0.2.1
DNS:
qm set 101 --nameserver 192.0.2.53
Проверьте:
qm config 101
Запуск клона
qm start 101
Проверьте:
qm status 101
Откройте консоль через веб-интерфейс или выполните:
qm terminal 101
Для выхода из serial console обычно используется:
Ctrl+O
Проверка Cloud-Init внутри VM
После входа:
cloud-init status
Подробный статус:
cloud-init status --long
Ожидаемый результат:
status: done
Проверьте журнал:
sudo journalctl -u cloud-init -u cloud-config -u cloud-final --no-pager
Основные файлы логов:
sudo tail -100 /var/log/cloud-init.log
sudo tail -100 /var/log/cloud-init-output.log
Проверка сети
ip addr
ip route
Проверка шлюза:
ping -c 3 192.0.2.1
Проверка DNS:
getent hosts example.com
Проверка SSH
С другой машины:
ssh ADMIN_USER@VM_IP
Проверьте, что вход выполняется по ключу.
Проверка QEMU Guest Agent
Внутри VM:
systemctl status qemu-guest-agent --no-pager
При необходимости:
sudo systemctl enable --now qemu-guest-agent
С узла Proxmox:
qm agent 101 ping
Изменение параметров перед первым запуском
Cloud-Init применяет основные параметры при первом запуске VM.
Поэтому IP, пользователя и SSH-ключ лучше задавать до команды:
qm start VM_ID
После первого запуска изменение Cloud-Init параметров может потребовать очистки состояния внутри гостевой системы.
Повторный запуск Cloud-Init
Внутри тестовой VM можно очистить состояние:
sudo cloud-init clean --logs
Затем выключить VM:
sudo poweroff
Изменить параметры в Proxmox и запустить снова.
На production-VM такую операцию выполняйте только с пониманием последствий.
Обновление исходного cloud image
Шаблон не обновляется автоматически.
Для получения свежего образа безопаснее:
- Скачать новый cloud image.
- Создать новый VM ID.
- Повторить настройку.
- Проверить клонирование.
- Перевести новый объект в шаблон.
- Удалить старый шаблон только после проверки.
Не заменяйте диск действующего шаблона без тестирования.
Типичные проблемы
VM не загружается
Проверьте:
qm config VM_ID
Убедитесь, что:
- диск подключён как
scsi0; - установлен
scsihw; - boot order указывает на
scsi0; - cloud image успешно импортирован.
Нет консоли
Проверьте:
qm config VM_ID |
grep -E 'serial0|vga'
Должно быть:
serial0: socket
vga: serial0
SSH-ключ не применился
Проверьте:
qm cloudinit dump VM_ID user
Внутри VM:
cat ~/.ssh/authorized_keys
Также проверьте имя пользователя, заданное через ciuser.
VM не получила IP
Проверьте:
qm cloudinit dump VM_ID network
Убедитесь, что:
- указан правильный bridge;
- DHCP доступен;
- VLAN настроен корректно;
- статический адрес и шлюз находятся в одной сети.
Cloud-Init завис в состоянии running
Проверьте:
cloud-init status --long
Журналы:
sudo tail -100 /var/log/cloud-init.log
sudo tail -100 /var/log/cloud-init-output.log
Диск не расширился
Проверьте:
lsblk
df -h
Проверьте работу модулей Cloud-Init growpart и resizefs.
При необходимости расширение файловой системы следует рассматривать отдельно.
Linked clone недоступен
Хранилище может не поддерживать связанные клоны.
Используйте полный клон:
qm clone TEMPLATE_ID NEW_VM_ID --full 1 --storage TARGET_STORAGE
Быстрый набор команд
Создать VM:
qm create 9000 --name ubuntu-2404-cloudinit --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
Импортировать диск:
qm importdisk 9000 ubuntu-24.04-server-cloudimg-amd64.img local-lvm
Подключить Cloud-Init:
qm set 9000 --ide2 local-lvm:cloudinit
Настроить DHCP:
qm set 9000 --ipconfig0 ip=dhcp
Преобразовать в шаблон:
qm template 9000
Создать полный клон:
qm clone 9000 101 --name app01 --full 1 --storage local-lvm
Итог
После выполнения инструкции:
- загружен Ubuntu cloud image;
- создана VM для Cloud-Init;
- импортирован и подключён системный диск;
- добавлен Cloud-Init диск;
- настроены пользователь, SSH-ключ и сеть;
- VM преобразована в шаблон;
- создан и запущен клон;
- проверена работа Cloud-Init внутри гостевой системы.
Cloud-Init шаблон значительно ускоряет создание однотипных Linux VM и уменьшает количество ручных действий.