Proxmox VE — Создание шаблона VM и использование Cloud-Init

В этой статье я покажу как можно подготовить шаблон виртуальной машины в 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. Вот некоторые примеры таких образов:

Использование готового облачного образа экономит время. Вам не нужно проходить установщик ОС. Вы просто скачиваете образ, импортируете его в виртуалку на Proxmox VE и создаёте шаблон. А затем, из шаблона, разворачиваете виртуальную машину, которая получает настройки с помощью cloud-init.

Кстати, мне самому помогла данная статья для изучения Cloud-Inithttps://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.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности