From 24c0cb762536983e6ed2928459eadd7160d8befd Mon Sep 17 00:00:00 2001 From: js Date: Fri, 5 Sep 2025 13:04:41 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20incus-sync.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- incus-sync.sh | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 incus-sync.sh diff --git a/incus-sync.sh b/incus-sync.sh new file mode 100644 index 0000000..aaa370f --- /dev/null +++ b/incus-sync.sh @@ -0,0 +1,61 @@ +#!/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 +