Files
ProxmoxVE_Scripts/BOT_FAZANA/new/rollback.sh

124 lines
4.4 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 <vmid1> [<vmid2> ...]"
exit 1
;;
:)
echo "Параметр -$OPTARG требует аргумент." >&2
echo "Использование: $0 -t <vmid1> [<vmid2> ...]"
exit 1
;;
esac
done
# Проверка наличия хотя бы одного VMID
if [ ${#VMIDS[@]} -eq 0 ]; then
echo "Ошибка: Не указан VMID. Используйте -t <vmid1> [<vmid2> ...]" >&2
echo "Использование: $0 -t <vmid1> [<vmid2> ...]"
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