Создание шаблона 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

Шаблон не обновляется автоматически.

Для получения свежего образа безопаснее:

  1. Скачать новый cloud image.
  2. Создать новый VM ID.
  3. Повторить настройку.
  4. Проверить клонирование.
  5. Перевести новый объект в шаблон.
  6. Удалить старый шаблон только после проверки.

Не заменяйте диск действующего шаблона без тестирования.

Типичные проблемы

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 и уменьшает количество ручных действий.

← Предыдущая статья Создание снапшота виртуальной машины в Proxmox VE Следующая статья → Создание LXC-контейнера в Proxmox VE