#!/bin/bash # Список серверов для сканирования SERVER_IPS=("10.0.1.1" "10.0.1.2" "10.0.1.3" "10.0.1.4") # Пароль для sshpass SSH_PASS="Gladious123" # Функция для проверки наличия VMID на сервере check_vmid_on_server() { local server_ip="$1" local target_vmid="$2" if sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm list | awk 'NR>1 {print \$1}'" | grep -q "^${target_vmid}$"; then echo "VMID $target_vmid найден на сервере $server_ip." return 0 # Успех else echo "VMID $target_vmid не найден на сервере $server_ip." return 1 # Неудача fi } # Функция для отката VM до snapshot DEFAULT и запуска VM на сервере rollback_and_start_vmid_on_server() { local server_ip="$1" local target_vmid="$2" echo "Выполняется откат VMID $target_vmid до snapshot DEFAULT на сервере $server_ip..." sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm rollback $target_vmid DEFAULT" local rollback_ret=$? if [ $rollback_ret -eq 0 ]; then echo "Откат VMID $target_vmid на сервере $server_ip выполнен успешно." # Ожидание завершения отката sleep 5 # Проверка, что VM не запущена перед попыткой запуска VM_STATUS=$(sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm status $target_vmid | grep 'status:' | awk '{print \$2}'") if [ "$VM_STATUS" == "running" ]; then echo "VMID $target_vmid уже запущена на сервере $server_ip." else echo "Запуск VMID $target_vmid на сервере $server_ip..." sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm start $target_vmid" local start_ret=$? if [ $start_ret -eq 0 ]; then echo "VMID $target_vmid запущена на сервере $server_ip успешно." else echo "Ошибка при запуске VMID $target_vmid на сервере $server_ip." return $start_ret fi fi else echo "Ошибка при откате VMID $target_vmid на сервере $server_ip." return $rollback_ret fi return 0 } # Обработка аргументов командной строки while getopts "t:" opt; do case "$opt" in t) # Сохраняем первый аргумент VMIDS=("$OPTARG") # Добавляем оставшиеся аргументы while [ "$#" -gt 1 ]; do shift if [[ "$1" != -* ]]; then VMIDS+=("$1") else break fi done ;; \?) echo "Неверный параметр: -$OPTARG" >&2 echo "Использование: $0 -t [ ...]" exit 1 ;; :) echo "Параметр -$OPTARG требует аргумент." >&2 echo "Использование: $0 -t [ ...]" exit 1 ;; esac done # Проверка наличия хотя бы одного VMID if [ ${#VMIDS[@]} -eq 0 ]; then echo "Ошибка: Не указан VMID. Используйте -t [ ...]" >&2 echo "Использование: $0 -t [ ...]" exit 1 fi # Обрабатываем каждый VMID по очереди for TARGET_VMID in "${VMIDS[@]}"; do echo "Обработка VMID: $TARGET_VMID" # Массив для хранения найденных экземпляров текущего VMID found_vmid_servers=() # Сканирование серверов for server_ip in "${SERVER_IPS[@]}"; do if check_vmid_on_server "$server_ip" "$TARGET_VMID"; then # Если нашли VMID, добавляем IP в массив found_vmid_servers+=("$server_ip") fi done # Выполняем откат и запуск только на серверах, где VMID был найден if [ ${#found_vmid_servers[@]} -gt 0 ]; then for server_ip in "${found_vmid_servers[@]}"; do rollback_and_start_vmid_on_server "$server_ip" "$TARGET_VMID" done else echo "VMID $TARGET_VMID не найден ни на одном сервере." fi echo "Завершена обработка VMID: $TARGET_VMID" echo "-----------------------------------------" done exit 0