# Шаблоны VM и cloud-init в Proxmox VE: быстрый деплой

> Как создать шаблон VM в Proxmox VE на базе cloud-init: подготовка образа, настройка сети и SSH-ключей, клонирование через API.

## Что такое шаблон VM и зачем нужен cloud-init

Шаблон в Proxmox VE — это заготовка виртуальной машины, из которой можно быстро клонировать новые VM без повторной установки операционной системы. Cloud-init — стандарт настройки облачных образов при первом старте: он задаёт имя хоста, сеть, пользователя и SSH-ключ до того, как система полностью загрузится.

Вместе шаблон и cloud-init превращают разворачивание сервера в операцию на минуту: клонировали шаблон, передали параметры сети и ключа, запустили VM — она сама сконфигурируется при первой загрузке. Это особенно полезно при массовом создании [виртуальных машин](https://www.zevshost.net/ru/kb/proxmox-vm-sozdat/) с одинаковой базовой конфигурацией.

## Как подготовить облачный образ под шаблон

Для шаблона используется не обычный 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](https://www.zevshost.net/ru/kb/proxmox-snapshot-clone/).

## Автоматизация массового разворачивания через 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](https://www.zevshost.net/ru/kb/proxmox-api-automation/).

## Чек-лист перед использованием шаблона в продакшене

- Образ основан на официальном облачном дистрибутиве с поддержкой cloud-init.
- ID шаблонов вынесены в отдельный диапазон и не пересекаются с рабочими VM.
- SSH-ключ в шаблоне ведёт на учётную запись, к которой нет доступа у посторонних.
- Выбран осознанно тип клона: связанный для скорости, полный для независимости от шаблона.
- Процесс клонирования и настройки сети проверен на тестовом сервере перед массовым запуском.

После проверки шаблон можно смело использовать для повторяемого развёртывания серверов одинаковой конфигурации без ручной установки ОС на каждой машине.

## Частые вопросы

### Какой тип клона лучше выбрать для рабочего сервера — связанный или полный?

Связанный клон создаётся почти мгновенно и хранит только разницу с диском шаблона, но навсегда зависит от него и требует хранилище с подходящей поддержкой — поэтому он хорош для тестовых и временных машин. Полный клон копирует весь диск целиком и после создания уже не связан с шаблоном, что делает его надёжнее для серверов, которые должны работать независимо и долго.

### Что будет, если задать конкретный IP-адрес уже на уровне самого шаблона?

Если задать статический IP прямо в шаблоне, каждый созданный из него клон при запуске попытается использовать один и тот же адрес, что приведёт к конфликту в сети. Поэтому сетевые параметры удобнее переопределять уже после клонирования — для каждого нового сервера отдельно, а на уровне шаблона задают только общие для всех клонов данные, такие как пользователь и SSH-ключ.

### Подойдёт ли обычный установочный ISO-образ вместо облачного для создания шаблона?

Нет смысла: обычный установочный ISO не содержит агента cloud-init и требует полноценной установки системы через инсталлятор с ручным выбором параметров. Весь смысл подхода с шаблонами — в готовом облачном образе, который уже умеет настраиваться автоматически при первом запуске, поэтому для быстрого массового разворачивания используют именно его, а не классический установочный диск.

### Зачем шаблонам обычно выделяют отдельный диапазон ID, а не нумеруют вместе с рабочими VM?

Отдельный диапазон ID избавляет от путаницы между шаблонами и рабочими серверами: без него легко случайно запустить, изменить или удалить сам шаблон, думая, что это обычная виртуальная машина. Если номера шаблонов визуально выделены, администратор сразу видит, с чем имеет дело, и риск задеть источник клонов по ошибке заметно снижается.

---

Источник: https://www.zevshost.net/ru/kb/proxmox-shablony-cloud-init/
