incus-sync/incus-sync.sh

60 lines
2.6 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/sh
LOGFILE="/var/log/incus-sync.log"
NODES="node1 node2 node3"
echo "📡 [$0] Запуск службы Incus Sync..." >> "$LOGFILE"
while true; do
echo "[$(date)] 🔄 Синхронизация запускается" >> "$LOGFILE"
for NODE in $NODES; do
echo "=== Обработка $NODE ===" >> "$LOGFILE"
if ! incus list ${NODE}: --format=json >/dev/null 2>&1; then
echo "$NODE недоступен, включаем контейнеры на storage1" >> "$LOGFILE"
for c in $(incus list --format=json | jq -r --arg NODE "$NODE" '.[] | select(.config["user.server"] == $NODE) | .name'); do
echo "Пробуем запустить $c на storage1" >> "$LOGFILE"
status=$(incus list "$c" --format=json | jq -r '.[0].status')
if [ "$status" = "Running" ]; then
echo "$c уже запущен — пропускаем" >> "$LOGFILE"
else
incus start "$c" >> "$LOGFILE" 2>&1 || echo "Не удалось запустить $c" >> "$LOGFILE"
fi
done
continue
fi
for c in $(incus list ${NODE}: --format=json | jq -r '.[] | select(.state.status == "Running") | .name'); do
echo "Копирую $c с $NODE" >> "$LOGFILE"
incus config set ${NODE}:$c user.server $NODE >> "$LOGFILE" 2>&1
if incus list --format=json | jq -r --arg c "$c" --arg NODE "$NODE" '.[] | select(.name == $c and .status == "Running" and .config["user.server"] == $NODE) | .name' | grep -q "$c"; then
echo "Контейнер $c работает на storage1 — переносим обратно на $NODE" >> "$LOGFILE"
echo "Останавливаем $c на storage1" >> "$LOGFILE"
incus stop $c >> "$LOGFILE" 2>&1 || true
if incus info ${NODE}:$c >/dev/null 2>&1; then
echo "Удаляем $c на $NODE" >> "$LOGFILE"
incus stop ${NODE}:$c --force >> "$LOGFILE" 2>&1 || true
incus delete ${NODE}:$c --force >> "$LOGFILE" 2>&1 || true
fi
echo "Копируем $c -> $NODE" >> "$LOGFILE"
incus copy $c ${NODE}: >> "$LOGFILE" 2>&1 || echo "Ошибка при копировании $c обратно" >> "$LOGFILE"
echo "Запускаем $c на $NODE" >> "$LOGFILE"
incus start ${NODE}:$c >> "$LOGFILE" 2>&1 || echo "Не удалось запустить $c на $NODE" >> "$LOGFILE"
else
incus copy ${NODE}:$c local: --refresh >> "$LOGFILE" 2>&1
fi
done
done
echo "[$(date)] ✅ Синхронизация завершена" >> "$LOGFILE"
sleep 2
done