В этой статье я покажу как можно подготовить шаблон виртуальной машины в Proxmox VE, и с помощью Cloud-Init настраивать виртуалки созданные из подготовленного шаблона. Из статье вы узнаете: что такое Cloud-Init, узнаете про облачные образы (Cloud Images). В качестве примера я буду использовать шаблон Debian 13.
🕒 6 мин.
Что такое Cloud-init
Для тех, кто не знаком с гипервизором Proxmox VE, можете почитать статью: Proxmox VE — знакомство и установка на ZFS.
Cloud-Init — это распространённый способ первоначальной настройки виртуальных машин. Часто используется в облаках, но Proxmox VE тоже поддерживает этот способ, при чём «из коробки». Cloud-Init — разработан Canonical и написан на Python.
Эту систему можно сравнить с Terraform или Ansible, хотя эти системы разного назначения и часто используются вместе а не заменяют друг друга.
- Terraform — работает с наружи, он подготавливает виртуальную машину. Он также может, через Cloud-Init, передать какие-нибудь параметры внутрь виртуалки.
- Cloud-Init — работает внутри виртуалки и запускается при первом её запуске, чаще всего однократно.
- Ansible — чаще используется многократно, когда нужно что-то поднастроить. Хотя для первоначальной настройки тоже можно использовать.
- Обратите внимание! Cloud-init умеет устанавливать пакеты и создавать пользователей, как и Ansible. Но если вы удалите пакет позже, Cloud-Init не восстановит его. Ansible — восстановит при следующем прогоне.
Datasource — это источник данных, из которого Cloud-Init получает данные для настройки виртуальной машины.
- В облаках — это специальный http-сервис.
- В Proxmox VE — это виртуальный CD-дисковод.
Облачные образы (Cloud Images)
Вы можете в обычный Debian установить пакет cloud-init, чтобы он начал искать и применять настройки из Datasource. Но лучше использовать специальные образы — Cloud Images. Вот некоторые примеры таких образов:
- Ubuntu — https://cloud-images.ubuntu.com (noble-server-cloudimg-amd64.img);
- Debian — https://cloud.debian.org/images/cloud/ (debian-13-generic-amd64.qcow2);
- Rocky Linux — https://rockylinux.org/ru-RU/download (Rocky-10-GenericCloud-Base.latest.x86_64.qcow2).
Использование готового облачного образа экономит время. Вам не нужно проходить установщик ОС. Вы просто скачиваете образ, импортируете его в виртуалку на Proxmox VE и создаёте шаблон. А затем, из шаблона, разворачиваете виртуальную машину, которая получает настройки с помощью cloud-init.
Кстати, мне самому помогла данная статья для изучения Cloud-Init — https://prohomelab.com/posts/cloud-init-install-in-proxmox/. Для быстрого старта рекомендую.
А также можете почитать:
Создание шаблона
Я покажу подготовку шаблона на примере Debian 13. Для начала скачаем облачный образ и поменяем размер диска в образе:
# wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2 # qemu-img resize debian-13-generic-amd64.qcow2 32G
- Я меняю на 32G.
Затем создадим виртуальную машину из web-интерфейса Proxmox VE.

General:
- VM ID: номер виртуальной машины
- Name: имя виртуальной машины

OS:
- Не нужно подсовывать iso образ, поэтому выбираем: Do not use any media

System:
- Поставьте галочку: Qemu Agent

Disks:
- Удалите преднастроенный диск

CPU:
- Cores: укажите желаемое количество ядер для шаблона
- Type: оставьте x86-64-v2-aes

Memory:
- Memory: укажите желаемое количество памяти для шаблона

Network:
- Bridge: выберите бридж
- VLAN Tag: если необходимо, то укажите vlan-id
- Model: оставьте VirtIO

Confirm:
- Проверьте все настройки и нажмите Finish
После создания виртуальной машины импортируем в неё диск из скачанного ранее облачного образа:
# qm set 100 --scsi0 data:0,import-from=/root/debian-13-generic-amd64.qcow2
А затем добавьте к виртуальной машине виртуальное устройство — CloudInit Drive:

Главное не запускайте эту виртуальную машину, так как Cloud-Init сработает только 1 раз, при первом запуске. Сейчас вам нужно сделать из этой виртуалки шаблон. Для этого пометьте эту виртуалку и нажмите Convert to template.

Создание виртуалки из шаблона
Чтобы создать виртуалку из шаблона, нажмите правой кнопкой мышки на созданный шаблон и выберите Clone.

В Proxmox VE вы можете сделать 2-а типа клона:
- Full Clone — это полностью автономная виртуальная машина, после разворачивания ни как не связанная с шаблоном.
- Linked Clone — это виртуальная машина почти не занимает место, создаётся из снапшота шаблона, но не может быть перемещена на другую ноду (работает только вместе с шаблоном).
Затем, перейдите в раздел Cloud-Init и выполнить первоначальную настройку виртуалки, например:

- Укажем нового пользователя и пароль для него.
- Настроим получение ip-адреса по dhcp.
- Upgrade packages Yes — заставим обновляться систему при первом включении.
После изменения настроек нажимаем Regenerate Image.
Затем включаем виртуальную машину.
Напоминаю, что изменить настройки вы можете 1 раз, до первого включения виртуальной машины. Таким образом вы можете создавать разные виртуальные машины из одного шаблона.
Хотя вы всё же можете заставить сработать Cloud-Init снова. Для этого выполните команду:
cloud-init clean --logs
И выключите виртуалку:
shutdown -h now
При повторном включении Cloud-Init сработает ещё раз.
Продвинутая настройка
Как вы могли заметить в web-интерфейсе Proxmox VE не так уж и много настроек для Cloud-Init. Эти настройки передаются виртуалке через созданное устройство (CloudInit Drive). Но можно настраивать гораздо больше с помощью специальных конфигов.
Эти конфиги должны лежать в специальном хранилище на Proxmox VE в разделе Snippets. Включим раздел Snippets, например на хранилище local. Это делается на уровне Datacenter в меню Storage. Вы можете включить и на другом хранилище, но для статьи я использую хранилище local.

Теперь подготовим конфиг в этом хранилище:
nano /var/lib/vz/snippets/my-config.yaml
- Если у вас другое хранилище, то путь может отличаться.
В конфиг внесём следующий текст:
#cloud-config
hostname: deb-13
fqdn: deb-13.local
package_update: true
packages:
- qemu-guest-agent
- htop
users:
- name: admin
groups: sudo
shell: /bin/bash
sudo: ALL=(ALL)
lock_passwd: false
chpasswd:
list: |
admin:StrongPassword123
expire: false
runcmd:
- systemctl start qemu-guest-agent.service
Обратите внимание, конфиг для Cloud-Init должен начинается со строчки: #cloud-config. В конфиге мы:
- указали имя сервера: deb-13;
- обновили пакеты и установили qemu-guest-agent и htop;
- создали пользователя admin с паролем StrongPassword123 и дали пользователю право использовать sudo;
- запустили qemu-guest-agent.
Создаём новый клон:

Затем применяем конфиг к созданному клону (виртуалке):
qm set 103 --cicustom "user=local:snippets/my-config.yaml"
- Обратите внимание, 103 — это номер виртуалки (клона).
Дополнительно на вкладке Cloud-Init для этой виртуалки нужно указать IP Config: ip=dhcp.

- Можете сделать это для шаблона, чтобы все клоны уже были с этой настройкой.
Запускаем виртуалку, логинимся в неё (admin / StrongPassword123) и проверяем что htop установлен:

Итог
Технология Cloud-Init позволяет перенастраивать виртуальные машины (физические тоже, но чаще используется для виртуалок). Технология встроена в Proxmox VE, где используется специальное виртуальное устройство CloudInit Driver для проброса iso файла с конфигами в виртуалку.
Web-интерфейс Proxmox VE позволяет передать Cloud-Init некоторые настройки, но с помощью конфига мы можем передать больше настроек. Конфиги на Proxmox VE должны лежать в специальном хранилище — Snippets. А с помощью подобной команды мы подсовываем конфиг виртуалке:
# qm set 103 --cicustom "user=local:snippets/my-config.yaml"
При включении виртуалки конфиг преобразуется в iso-образ и через CloudInit Driver попадает на виртуалку. Там конфиг считывается с помощью программы Cloud-Init и применяются настройки.
Дополнительно, Proxmox VE позволяет виртуалку превратить в шаблон (template). А шаблон вместе с Cloud-Init ускоряет развёртывание новых виртуалок.
Если понравилась статья, подпишись на мой канал в VK или Telegram.