Что такое шаблон VM и зачем нужен cloud-init
Шаблон в Proxmox VE — это заготовка виртуальной машины, из которой можно быстро клонировать новые VM без повторной установки операционной системы. Cloud-init — стандарт настройки облачных образов при первом старте: он задаёт имя хоста, сеть, пользователя и SSH-ключ до того, как система полностью загрузится.
Вместе шаблон и cloud-init превращают разворачивание сервера в операцию на минуту: клонировали шаблон, передали параметры сети и ключа, запустили VM — она сама сконфигурируется при первой загрузке. Это особенно полезно при массовом создании виртуальных машин с одинаковой базовой конфигурацией.
Как подготовить облачный образ под шаблон
Для шаблона используется не обычный ISO, а готовый облачный образ дистрибутива в формате qcow2 — он уже содержит агент cloud-init и не требует ручной установки через инсталлятор.
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
qm create 9000 --name ubuntu-24-04-template --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
Номер 9000 условный: в качестве ID шаблонов удобно резервировать диапазон 9000-9999, чтобы не путать их с рабочими VM. Название стоит сразу сделать говорящим, например с версией дистрибутива.
Как создать шаблон из VM в Proxmox VE
После создания VM в неё импортируют скачанный диск и подключают отдельное устройство cloud-init, которое хранит параметры первого запуска.
qm importdisk 9000 noble-server-cloudimg-amd64.img local-zfs
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-zfs:vm-9000-disk-0
qm set 9000 --ide2 local-zfs:cloudinit
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0 socket --vga serial0
qm template 9000
Последняя команда qm template 9000 превращает обычную VM в шаблон: диск переводится в режим только для чтения, а сама VM пропадает из списка запускаемых — теперь она служит источником для клонов.
Настройка cloud-init: пользователь, SSH-ключ, сеть
Параметры первого запуска задаются на вкладке Cloud-Init карточки VM или через CLI ещё до превращения VM в шаблон.
| Параметр | Назначение |
|---|---|
| User | имя учётной записи, которая будет создана в системе |
| SSH public key | публичный ключ для входа без пароля |
| IP Config | статический IP или DHCP для сетевого интерфейса |
| DNS domain/servers | домен поиска и адреса DNS-серверов |
Если задать пользователя и ключ на уровне шаблона, каждый клон получит одинаковые стартовые данные, а конкретный IP-адрес удобнее переопределять уже после клонирования — под конкретный сервер.
Клонирование VM из шаблона: связанные и полные клоны
Из шаблона можно сделать два типа клонов: связанный (linked clone) и полный (full clone). Связанный клон хранит только разницу с диском шаблона и создаётся почти мгновенно, но зависит от исходного шаблона и требует хранилище с поддержкой такого режима. Полный клон копирует весь диск целиком и не зависит от шаблона после создания.
qm clone 9000 201 --name web-01 --full
Подробнее о разнице между снимками и клонами, а также о том, когда связанный клон опаснее полного, рассказано в статье про снапшоты и клонирование VM.
Автоматизация массового разворачивания через API
Клонирование и настройку cloud-init удобно вызывать скриптом, если серверы разворачиваются регулярно: параметры IP, имени и ключа можно передать сразу после клонирования одной командой.
qm clone 9000 202 --name web-02 --full
qm set 202 --ipconfig0 ip=10.0.0.22/24,gw=10.0.0.1
qm set 202 --sshkeys ~/.ssh/deploy_key.pub
qm start 202
Тот же результат достигается через REST API без консоли узла — это удобно для CI/CD и внешних систем оркестрации. Подробности вызовов и авторизации через токен описаны в статье про REST API и автоматизацию Proxmox VE.
Чек-лист перед использованием шаблона в продакшене
- Образ основан на официальном облачном дистрибутиве с поддержкой cloud-init.
- ID шаблонов вынесены в отдельный диапазон и не пересекаются с рабочими VM.
- SSH-ключ в шаблоне ведёт на учётную запись, к которой нет доступа у посторонних.
- Выбран осознанно тип клона: связанный для скорости, полный для независимости от шаблона.
- Процесс клонирования и настройки сети проверен на тестовом сервере перед массовым запуском.
После проверки шаблон можно смело использовать для повторяемого развёртывания серверов одинаковой конфигурации без ручной установки ОС на каждой машине.
Частые вопросы
Какой тип клона лучше выбрать для рабочего сервера — связанный или полный?
Связанный клон создаётся почти мгновенно и хранит только разницу с диском шаблона, но навсегда зависит от него и требует хранилище с подходящей поддержкой — поэтому он хорош для тестовых и временных машин. Полный клон копирует весь диск целиком и после создания уже не связан с шаблоном, что делает его надёжнее для серверов, которые должны работать независимо и долго.
Что будет, если задать конкретный IP-адрес уже на уровне самого шаблона?
Если задать статический IP прямо в шаблоне, каждый созданный из него клон при запуске попытается использовать один и тот же адрес, что приведёт к конфликту в сети. Поэтому сетевые параметры удобнее переопределять уже после клонирования — для каждого нового сервера отдельно, а на уровне шаблона задают только общие для всех клонов данные, такие как пользователь и SSH-ключ.
Подойдёт ли обычный установочный ISO-образ вместо облачного для создания шаблона?
Нет смысла: обычный установочный ISO не содержит агента cloud-init и требует полноценной установки системы через инсталлятор с ручным выбором параметров. Весь смысл подхода с шаблонами — в готовом облачном образе, который уже умеет настраиваться автоматически при первом запуске, поэтому для быстрого массового разворачивания используют именно его, а не классический установочный диск.
Зачем шаблонам обычно выделяют отдельный диапазон ID, а не нумеруют вместе с рабочими VM?
Отдельный диапазон ID избавляет от путаницы между шаблонами и рабочими серверами: без него легко случайно запустить, изменить или удалить сам шаблон, думая, что это обычная виртуальная машина. Если номера шаблонов визуально выделены, администратор сразу видит, с чем имеет дело, и риск задеть источник клонов по ошибке заметно снижается.