Быстрое клонирование и настройка машин proxmox

Меня попросили установить proxmox и настроить локальную сеть с серверами. Человек в своей работе использует программу *** (в точности не могу сказать что она делает). Смысл заключался в том, чтобы не изменяя hwid создать много серверов в локальной сети с определенным набором параметров и программ. После некоторых легких манипуляций с системой: добавил еще 1 интерфейс для локальной сети, настроил dhcp для автоматической раздачи интернет соединения, настроил ядро для пропуска трафика без ограничений, настроил саму первую виртуальную машину для верной работы в том режиме, в котором требовалось клиенту; – создал шаблон системы из виртуального сервера, который требовалось скопировать большое количество раз, на каждом изменить настройки сети и оперативную память.

Вручную это делать слишком накладно по времени, именно по этому я решил воспользоваться консольными командами и сделать все несколько быстрее!

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

Для быстрого удаления виртуальных машин по заданным айди:

#!/bin/bash
# Начальный и конечный ID для удаления виртуальных машин
START_ID=101
END_ID=219
# Остановка и удаление виртуальных машин
for ID in $(seq $START_ID $END_ID); do
echo "Проверка состояния виртуальной машины с ID=$ID"
STATUS=$(qm status $ID | awk '{print $2}')
if [ "$STATUS" == "running" ]; then
echo "Остановка виртуальной машины с ID=$ID"
qm stop $ID
# Ожидание завершения остановки
sleep 5
elif [ "$STATUS" == "stopped" ]; then
echo "Виртуальная машина с ID=$ID уже остановлена"
else
echo "Неизвестное состояние виртуальной машины с ID=$ID: $STATUS"
fi
echo "Удаление виртуальной машины с ID=$ID"
qm destroy $ID
done
echo "Все виртуальные машины с ID от $START_ID до $END_ID остановлены и удалены."

Что делает скрипт:
Выбираю начальный айди и последний (виртуальные машины которые требуется изменить). Проверяю состояние виртуальной машины, и, если она включена, выключаю ее. Дополнительно проверяю на то, что виртуальная машина выключена, если она уже выключена то просто переходим к пункту удаления виртуальной машины.

Вручную выполнять подобные действия на proxmox, когда у тебя 200+ виртуалок сложно, проще удалить их таким образом.

Скрипт создания виртуальных машин через консоль bash скриптом (полное копирование диска):

#!/bin/bash
# Переменные
TEMPLATE_ID=776 # ID шаблона виртуальной машины
START_ID=101 # Начальный ID для новых виртуальных машин
NUM_CLONES=120 # Количество копий
SUBNET="10.10.1.1/24"
GATEWAY="10.10.1.1"
DNS="1.1.1.1"
# Клонирование виртуальных машин
for i in $(seq 1 $NUM_CLONES); do
NEW_ID=$((START_ID + i - 1))
NEW_IP="10.10.1.$NEW_ID"
NEW_NAME="vps$NEW_ID"
NEW_WIN_NAME="WIN-$NEW_ID"
# Клонирование виртуальной машины
qm clone $TEMPLATE_ID $NEW_ID --name $NEW_NAME
echo "Клонирование завершено: ID=$NEW_ID, Имя=$NEW_NAME"
# Запуск виртуальной машины
qm start $NEW_ID
# Настройка сетевого интерфейса (если он не существует)
if ! qm config $NEW_ID | grep -q "net0:"; then
qm set $NEW_ID --net0 virtio,bridge=vmbr1,firewall=0
fi
# Ожидание запуска виртуальной машины
sleep 10
# Запуск qemu-guest-agent на виртуальной машине
qm guest exec $NEW_ID -- powershell -Command "& {
Start-Service -Name 'qemu-ga'
}"
# Настройка IP-адреса внутри гостевой операционной системы
qm guest exec $NEW_ID -- powershell -Command "& {
\$Interface = Get-NetAdapter | Where-Object { \$_.Status -eq 'Up' -and \$_.Name -like 'Ethernet*' }
New-NetIPAddress -InterfaceAlias \$Interface.Name -IPAddress $NEW_IP -PrefixLength 24 -DefaultGateway $GATEWAY
Set-DnsClientServerAddress -InterfaceAlias \$Interface.Name -ServerAddresses $DNS
}"
echo "Настройка IP-адреса завершена: ID=$NEW_ID, IP=$NEW_IP"
# Изменение имени устройства
qm guest exec $NEW_ID -- powershell -Command "& {
Rename-Computer -NewName $NEW_WIN_NAME -Force
Restart-Computer -Force
}"
echo "Изменение имени завершено: ID=$NEW_ID, Имя=$NEW_WIN_NAME"
# Перезагрузка виртуальной машины через 10 секунд
sleep 10
qm shutdown $NEW_ID --forceStop 1
sleep 10
qm start $NEW_ID
echo "Перезагрузка виртуальной машины завершена: ID=$NEW_ID"
done

Что делает скрипт:
Тут немного сложнее. Выбираем айди нашего шаблона, с которого мы будем делать виртуальные машины и копировать систему. Выбираем первый айди виртуальной машины и начинаем счет. Указываем необходимое количество копий, подсеть, шлюз, днс сервер для локальной сети. Обратите внимание, что сеть автоматически прописывается исходя из айди виртульной машины, если айди виртуальной машины 101, то и айпи виртуальной машины будет .101. После того как мы определили параметры в нашем цикле мы клонируем виртуальную машину, присваиваем ей сразу необходимое нам имя, включаем guest agent (это важно), настраиваем сеть, после чего перезагружаем несколько раз (на всякий случай, бывало, что команда перезагрузки не срабатывала, поэтому после перезагрузки стоит выключение/включение).

Ну и небольшой скрипт для настройки отдельных параметров (если вдруг забыли что-то настроить или следует “до настроить”):

#!/bin/bash
START_ID=101
END_ID=220
# Цикл по ID серверов от 101 до 220
for ID in $(seq $START_ID $END_ID); do
echo "Проверка состояния виртуальной машины с ID=$ID"
STATUS=$(qm status $ID | awk '{print $2}')
if [ "$STATUS" == "running" ]; then
echo "Остановка виртуальной машины с ID=$ID"
qm stop $ID
# Ожидание завершения остановки
sleep 5
elif [ "$STATUS" == "stopped" ]; then
echo "Виртуальная машина с ID=$ID уже остановлена"
else
echo "Неизвестное состояние виртуальной машины с ID=$ID: $STATUS"
fi
echo "Изменяем объем оперативной памяти на сервере с ID $ID..."
qm set $ID -memory 6144
echo "Объем оперативной памяти на сервере с ID $ID изменен на 6 ГБ."
echo "Включаем сервер с ID $ID..."
qm start $ID
# Проверяем, что сервер включен
#while [ "$(qm status $ID)" != "running" ]; do
# sleep 5
#done
echo "Сервер с ID $ID включен."
done
echo "Все серверы обновлены."

Что делает скрипт:
Определяем стартовый айди и конечный. Проверяем статус виртуальной машины, если она включена – выключаем ее, если она выключена – переходим к следующему шагу. Изменяем объем оперативной памяти и перезапускаем сервер.

 

Немного поясню по командам:

qm status  ID #состояние виртуальной машины
qm destroy ID #удалить виртуальную машину
qm clone TEMPLATE_ID ID --name NAME #Клонирование определенного шаблона TEMPLATE_ID, айди скопированной машины ID, NAME ее имя
qm start ID #запуск машины с айди
qm guest exec ID -- powershell -Command "команда" #выполнить команду на сервере через guest agent (должен быть установлен на виртуальной машине)
qm shutdown ID --forceStop 1 #быстрая остановка виртуальной машины
qm set ID -memory 6144 #пример изменения объема виртуальной памяти

 

 



Comments

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *