diff --git a/create_template_deb12.sh b/create_template_deb12.sh index f51f4ec..150b3dd 100755 --- a/create_template_deb12.sh +++ b/create_template_deb12.sh @@ -1,53 +1,172 @@ #!/bin/bash -# завершить выполнение, если некоторая команда, которая не является частью какого-либо теста (например, if [ ... ] или конструктора &&), возвращает ненулевой код +# Скрипт для создания шаблона ВМ в Proxmox VE с cloud-init +# Автоматически скачивает образ Debian 12, создает и настраивает ВМ как шаблон + set -e -# проверка запуска скрипта с параметром -if [ -n "$1" ]; then - vm_passwd="$1" -else - echo "Необходимо указать желаемый пароль для шаблона первым аргументом" +# Параметры по умолчанию +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=debian-12-generic-amd64.qcow2 -img_url=https://cloud.debian.org/images/cloud/bookworm/latest +# Установка значений по умолчанию для неопределённых параметров +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}" -# параметры вм -vm_id=508 -vm_name="deb12-cloudinit-template" -vm_memory=2048 -vm_cores=2 -vm_user="sa" +# Вывод информации о параметрах +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 -# данные proxmox -px_storage=local-lvm -px_bridge=vmbr0 - -# проверить наличие образа, если его нет - скачать образ ubuntu server 20.04 с поддержкой cloud-init +# Загрузка образа если отсутствует if [ ! -f "$cloudimg" ]; then - echo "Файл $cloudimg не существует" - echo Скачиваю образ $img_url/$cloudimg - wget $img_url/$cloudimg + echo "Скачиваю образ $img_url/$cloudimg" + wget -q --show-progress "$img_url/$cloudimg" fi -echo Создаю ВМ -qm create $vm_id --name $vm_name --memory $vm_memory --cores $vm_cores --net0 virtio,bridge=$px_bridge -qm importdisk $vm_id $cloudimg $px_storage -qm set $vm_id --scsihw virtio-scsi-pci --scsi0 $px_storage:vm-$vm_id-disk-0 -qm set $vm_id --boot c --bootdisk scsi0 -qm set $vm_id --ide2 $px_storage:cloudinit -qm set $vm_id --serial0 socket --vga serial0 -qm set $vm_id --cipassword=$vm_passwd --ciuser=$vm_user -qm set $vm_id --agent 1 +# Создание и настройка ВМ +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 $cloudimg +echo Удаляю скачанный образ +rm -f $cloudimg -echo Готово +echo +echo "Шаблон $vm_name (ID: $vm_id) успешно создан!" exit 0