Proxmox Cloud Init 24.04 туториал

Proxmox Cloud Init 24.04 туториал

Создание шаблона виртуальной машины Ubuntu 24.04 для Proxmox и CloudInit

Это краткое руководство по настройке шаблона виртуальной машины Ubuntu в Proxmox с использованием CloudInit в скриптовой манере.

Для этого руководства я сделал несколько предположений:

  • Вы хотите, чтобы ваши виртуальные машины загружались через UEFI, а не через BIOS
  • Основное хранилище вашего узла Proxmox называется local-zfs
  • Вы хотите использовать Ubuntu 24.04
  • У вас есть ключи SSH, хранящиеся в ~/.ssh/authorized_keys домашней папки вашего обычного пользователя

Основы

Первый шаг — загрузить облачный образ для Ubuntu, затем мы изменим размер этого образа

wget -q https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
qemu-img resize noble-server-cloudimg-amd64.img 32G

Обратите внимание, что даже если я изменяю размер этого образа до 32 гигабайт, на самом деле размер файла не будет 32 гигабайта, это потому, что образ — это то, что называется разреженным файлом. Образ начинается с ~2 ГБ, но если мы не изменим размер образа сейчас, у любых клонированных виртуальных машин не будет места для хранения. Можете свободно изменить 32 ГБ на 20, 80 или на любой другой, который вам нравится.

Создание виртуальной машины

Следующий шаг — создание базовой виртуальной машины, на основе которой мы будем строить:

sudo qm create 8001 --name "ubuntu-2404-cloudinit-template" --ostype l26 \
--memory 1024 \
--agent 1 \
--bios ovmf --machine q35 --efidisk0 local-zfs:0,pre-enrolled-keys=0 \
--cpu host --socket 1 --cores 1 \
--vga serial0 --serial0 socket \
--net0 virtio,bridge=vmbr0

Вы можете свободно менять 8001 на что угодно, главное, чтобы вы заменили 8001 в последующих командах на то, что вы выбрали. Выбранная память не имеет значения, поскольку эта конкретная виртуальная машина не запустится, обязательно отрегулируйте объем оперативной памяти для клонированных виртуальных машин. --agent включает гостевого агента Qemu, который полезен для разных вещей, таких как просмотр IP-адресов любых интерфейсов. Мы установим тип ЦП на хост (вы почти всегда этого хотите) с одним сокетом и одним ядром (не забудьте изменить количество ядер в клонированных виртуальных машинах). Далее идет графический процессор, вы можете выбрать virtio вместо serial0, если хотите, но в этом нет необходимости; тип последовательного графического процессора позволяет копировать и вставлять, что может быть полезно. Наконец, сетевой адаптер, если у вас есть специальный интерфейс моста, который вы хотите выбрать, измените vmbr0 на любой другой. Если вы хотите использовать тег VLAN, добавьте ,tag=## сразу после имени моста (без пробелов)

Настройка оборудования

sudo qm importdisk 8001 noble-server-cloudimg-amd64.img local-zfs
sudo qm set 8001 --scsihw virtio-scsi-pci --virtio0 local-zfs:vm-8001-disk-1,discard=on
sudo qm set 8001 --boot order=virtio0
sudo qm set 8001 --scsi1 local-zfs:cloudinit

Первая команда импортирует образ, который мы скачали ранее, если ваше дисковое хранилище не является local-zfs (например, local-lvm), то замените его на то, что вам нужно. Следующая команда подключает диск к виртуальной машине. Если ваш дисковый накопитель не на SSD (а он должен быть), опустите ,discard=on. Третья команда устанавливает порядок загрузки. Четвертая добавляет псевдо-CDROM-привод cloudinit.

Создание файла vendor.yaml для cloudinit

cat << EOF | sudo tee /var/lib/vz/snippets/vendor.yaml
#cloud-config
runcmd:
- apt update
- apt install -y qemu-guest-agent
- systemctl start qemu-guest-agent
- reboot

EOF

Этот файл выполняет две функции, первая довольно очевидная (установка qemu-guest-agent), вторая не очень. По какой-то причине CloudInit запускается после сетевого подключения, и поэтому вы не можете использовать SSH или даже пинговать виртуальную машину по имени, которое вы ей даете. Этот пакет запускается только один раз, поэтому после этой перезагрузки вы сможете использовать виртуальную машину.

Настройка CloudInit

sudo qm set 8001 --cicustom "vendor=local:snippets/vendor.yaml"
sudo qm set 8001 --tags ubuntu-template,24.04,cloudinit
sudo qm set 8001 --ciuser untouchedwagons
sudo qm set 8001 --cipassword $(openssl passwd -6 $CLEARTEXT_PASSWORD)
sudo qm set 8001 --sshkeys ~/.ssh/authorized_keys
sudo qm set 8001 --ipconfig0 ip=dhcp

Первая команда сообщает CI использовать файл поставщика, который мы указали ранее. Вторую можно пропустить, но она добавляет декоративные теги, которые отображаются в веб-интерфейсе Proxmox. Клонированные виртуальные машины наследуют все эти теги. Третий указывает пользователя для создания. Четвертый устанавливает пароль. Пятый импортирует открытые ключи SSH, чтобы вы могли войти по SSH. Наконец, сетевой адаптер virtio настроен на DHCP, это предполагается как значение по умолчанию, но необходимо указать вручную.

Наконец: преобразование в шаблон

sudo qm template 8001

Вот и все! Теперь ваш шаблон готов к использованию. Клонируйте этот шаблон по своему усмотрению (не забудьте настроить ядра и ОЗУ по мере необходимости) и запустите клон. После первой загрузки запустится Cloud-Init, создаст вашего пользователя, установит qemu-guest-agent и перезагрузится. После завершения перезагрузки вы можете использовать SSH и использовать виртуальную машину так, как вам нравится!

Пример скрипта

Скрипт для создания шаблонов proxmox для вас. В верхней части файла находятся две переменные среды, которые нужно будет настроить в соответствии с тем, как настроен proxmox.

#! /bin/bash

VMID=8200
STORAGE=local-zfs

set -x
rm -f noble-server-cloudimg-amd64.img
wget -q https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
qemu-img resize noble-server-cloudimg-amd64.img 8G
sudo qm destroy $VMID
sudo qm create $VMID --name "ubuntu-noble-template" --ostype l26 \
    --memory 1024 --balloon 0 \
    --agent 1 \
    --bios ovmf --machine q35 --efidisk0 $STORAGE:0,pre-enrolled-keys=0 \
    --cpu host --cores 1 --numa 1 \
    --vga serial0 --serial0 socket  \
    --net0 virtio,bridge=vmbr0,mtu=1
sudo qm importdisk $VMID noble-server-cloudimg-amd64.img $STORAGE
sudo qm set $VMID --scsihw virtio-scsi-pci --virtio0 $STORAGE:vm-$VMID-disk-1,discard=on
sudo qm set $VMID --boot order=virtio0
sudo qm set $VMID --scsi1 $STORAGE:cloudinit

cat << EOF | sudo tee /var/lib/vz/snippets/ubuntu.yaml
#cloud-config
runcmd:
    - apt-get update
    - apt-get install -y qemu-guest-agent
    - systemctl enable ssh
    - reboot
# Taken from https://forum.proxmox.com/threads/combining-custom-cloud-init-with-auto-generated.59008/page-3#post-428772
EOF

sudo qm set $VMID --cicustom "vendor=local:snippets/ubuntu.yaml"
sudo qm set $VMID --tags ubuntu-template,noble,cloudinit
sudo qm set $VMID --ciuser $USER
sudo qm set $VMID --sshkeys ~/.ssh/authorized_keys
sudo qm set $VMID --ipconfig0 ip=dhcp
sudo qm template $VMID