Быстрое клонирование и настройка машин 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 #пример изменения объема виртуальной памяти