#!/bin/bash # Скрипт для создания шаблона ВМ в Proxmox VE с cloud-init # Автоматически скачивает образ Debian 12, создает и настраивает ВМ как шаблон set -e # Параметры по умолчанию DEFAULT_VM_ID=508 DEFAULT_VM_NAME="deb12-cloudinit-template" DEFAULT_VM_USER="sa" DEFAULT_VM_CORES=4 DEFAULT_VM_SOCKETS=2 DEFAULT_VM_MEMORY=4096 DEFAULT_PX_STORAGE="local-lvm" DEFAULT_PX_BRIDGE="vmbr0" DEFAULT_CLOUDIMG="debian-12-generic-amd64.qcow2" DEFAULT_IMG_URL="https://cloud.debian.org/images/cloud/bookworm/latest" # Функция вывода справки show_help() { echo "Использование: $0 [ОПЦИИ] <пароль>" echo echo "Обязательные аргументы:" echo " пароль Пароль пользователя для cloud-init" echo echo "Опции:" echo " -h, --help Показать эту справку и выйти" echo " -i ID, --id ID ID создаваемой ВМ (по умолчанию: $DEFAULT_VM_ID)" echo " -n NAME, --name NAME Имя шаблона (по умолчанию: \"$DEFAULT_VM_NAME\")" echo " -u USER, --user USER Имя пользователя cloud-init (по умолчанию: \"$DEFAULT_VM_USER\")" echo " -s STORAGE, --storage STORAGE" echo " Хранилище Proxmox (по умолчанию: \"$DEFAULT_PX_STORAGE\")" echo " -b BRIDGE, --bridge BRIDGE" echo " Сетевой мост (по умолчанию: \"$DEFAULT_PX_BRIDGE\")" echo " -c CORES, --cores CORES" echo " Количество ядер CPU (по умолчанию: $DEFAULT_VM_CORES)" echo " -m MEMORY, --memory MEMORY" echo " Объем памяти в MB (по умолчанию: $DEFAULT_VM_MEMORY)" echo " -S SOCKETS, --sockets SOCKETS" echo " Количество сокетов CPU (по умолчанию: $DEFAULT_VM_SOCKETS)" echo echo "Примеры:" echo " $0 MySecurePassword123" echo " $0 -u admin MySecurePassword123" echo " $0 -i 510 -n my-template -u admin MySecurePassword123" echo " $0 -c 2 -m 2048 -S 1 MyPassword" exit 0 } # Парсинг аргументов командной строки while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help ;; -i|--id) vm_id="$2" shift 2 ;; -n|--name) vm_name="$2" shift 2 ;; -u|--user) vm_user="$2" shift 2 ;; -s|--storage) px_storage="$2" shift 2 ;; -b|--bridge) px_bridge="$2" shift 2 ;; -c|--cores) vm_cores="$2" shift 2 ;; -m|--memory) vm_memory="$2" shift 2 ;; -S|--sockets) vm_sockets="$2" shift 2 ;; *) if [ -z "$vm_passwd" ]; then vm_passwd="$1" shift else echo "Ошибка: Неизвестный аргумент $1" show_help exit 1 fi ;; esac done # Проверка обязательного аргумента (пароль) if [ -z "$vm_passwd" ]; then echo "Ошибка: Необходимо указать пароль для пользователя cloud-init" show_help exit 1 fi # Установка значений по умолчанию для неопределённых параметров cloudimg="${cloudimg:-$DEFAULT_CLOUDIMG}" img_url="${img_url:-$DEFAULT_IMG_URL}" vm_id="${vm_id:-$DEFAULT_VM_ID}" vm_name="${vm_name:-$DEFAULT_VM_NAME}" vm_memory="${vm_memory:-$DEFAULT_VM_MEMORY}" vm_cores="${vm_cores:-$DEFAULT_VM_CORES}" vm_sockets="${vm_sockets:-$DEFAULT_VM_SOCKETS}" vm_user="${vm_user:-$DEFAULT_VM_USER}" px_storage="${px_storage:-$DEFAULT_PX_STORAGE}" px_bridge="${px_bridge:-$DEFAULT_PX_BRIDGE}" # Вывод информации о параметрах echo "Параметры создания шаблона:" echo "--------------------------" echo "ID ВМ: $vm_id" echo "Имя шаблона: $vm_name" echo "Пользователь: $vm_user" echo "Ядра CPU: $vm_cores" echo "Сокеты CPU: $vm_sockets" echo "Память (MB): $vm_memory" echo "Хранилище: $px_storage" echo "Сетевой мост: $px_bridge" echo "--------------------------" echo # Загрузка образа если отсутствует if [ ! -f "$cloudimg" ]; then echo "Скачиваю образ $img_url/$cloudimg" wget -q --show-progress "$img_url/$cloudimg" fi # Создание и настройка ВМ echo "Создаю ВМ $vm_id: $vm_name" qm create "$vm_id" \ --name "$vm_name" \ --memory "$vm_memory" \ --cores "$vm_cores" \ --sockets "$vm_sockets" \ --numa 1 \ --agent enabled=1 \ --net0 virtio,bridge=$px_bridge echo "Импортирую диск" qm importdisk "$vm_id" "$cloudimg" "$px_storage" echo "Настраиваю оборудование ВМ" qm set "$vm_id" \ --scsihw virtio-scsi-single \ --scsi0 "$px_storage:vm-$vm_id-disk-0" \ --scsi1 "$px_storage:cloudinit,media=cdrom" \ --ide2 "none,media=cdrom" \ --boot "order=scsi0;ide2;net0" \ --cipassword="$vm_passwd" --ciuser="$vm_user" echo Конвертирую ВМ в шаблон qm template $vm_id echo Удаляю скачанный образ rm -f $cloudimg echo echo "Шаблон $vm_name (ID: $vm_id) успешно создан!" exit 0