175 lines
5.8 KiB
Bash
Executable File
175 lines
5.8 KiB
Bash
Executable File
#!/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"
|
||
echo
|
||
echo "Справка - \"$0 -h\""
|
||
#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
|