124 lines
4.4 KiB
Bash
124 lines
4.4 KiB
Bash
|
|
#!/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
|