модифицировал скрипт создания шаблона

master
Artem Dolgiy 2025-06-25 18:57:47 +03:00
parent 4dc8b8701c
commit f5e9afbeb9
1 changed files with 154 additions and 35 deletions

View File

@ -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