Repte 2.3:Realització de backups

Primer hem de fer el script que permetrà fer un backup de les nostres màquines, farem que ho faci pel vagrant, així podem executar-ho des de la nostra màquina i ens fa una snapshot de la màquina que estigui encesa, no força res per evitar possibles errors i problemes.

#!/bin/bash
VAGRANT_DIR="$HOME/Documents/debian"

MAQUINAS_BACKUP=(
    "debianproxy"
    "router_2"
    "debiandns"
    "debianslave"
    "debianldap"
    "rockyFTP"
    "rockyNFS"
)

SNAPSHOT_PREFIX="backup"

LOG_DIR="$VAGRANT_DIR/logs"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color


log() {
    local level="$1"; shift
    local msg="$*"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')

    case "$level" in
        INFO)  echo -e "${BLUE}[INFO]${NC}  ${timestamp} — ${msg}" | tee -a "$LOG_FILE" ;;
        OK)    echo -e "${GREEN}[OK]${NC}    ${timestamp} — ${msg}" | tee -a "$LOG_FILE" ;;
        WARN)  echo -e "${YELLOW}[WARN]${NC}  ${timestamp} — ${msg}" | tee -a "$LOG_FILE" ;;
        ERROR) echo -e "${RED}[ERROR]${NC} ${timestamp} — ${msg}" | tee -a "$LOG_FILE" ;;
        TITLE) echo -e "\n${BOLD}${CYAN}$msg${NC}\n" | tee -a "$LOG_FILE" ;;
    esac
}

vm_esta_corriendo() {
    local nombre="$1"
    cd "$VAGRANT_DIR" && vagrant status "$nombre" --machine-readable | grep -q ",${nombre},state,running"
}

hacer_snapshot() {
    local nombre="$1"
    local etiqueta="$2"
    local snapshot_name="${SNAPSHOT_PREFIX}_${etiqueta}"

    log INFO "Creando snapshot de '${nombre}'..."

    if cd "$VAGRANT_DIR" && vagrant snapshot save "$nombre" "$snapshot_name" >> "$LOG_FILE" 2>&1; then
        log OK "Guardado con éxito: '${nombre}' -> '${snapshot_name}'"
        return 0
    else
        log ERROR "Error al procesar '${nombre}'. Revisa el log para más detalles."
        return 1
    fi
}


TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
FECHA_HUMANA=$(date '+%d/%m/%Y %H:%M:%S')

mkdir -p "$LOG_DIR"
LOG_FILE="${LOG_DIR}/backup_${TIMESTAMP}.log"

log TITLE "════════════════════════════════════════"
log TITLE "   SISTEMA DE BACKUP VAGRANT — ${FECHA_HUMANA}"
log TITLE "════════════════════════════════════════"

if [[ ! -f "$VAGRANT_DIR/Vagrantfile" ]]; then
    log ERROR "No se encontró el Vagrantfile en $VAGRANT_DIR"
    exit 1
fi

log INFO "Máquinas incluidas en este backup:"
for vm in "${MAQUINAS_BACKUP[@]}"; do
    echo -e "  ${CYAN}•${NC} ${vm}"
done
echo ""

read -rp "¿Confirmas el inicio del backup de estas máquinas? [s/N]: " confirma
if [[ ! "$confirma" =~ ^[sS]$ ]]; then
    log WARN "Backup cancelado por el usuario."
    exit 0
fi

EXITO=0
FALLO=0
SALTADAS=0


for vm in "${MAQUINAS_BACKUP[@]}"; do
    echo "--------------------------------------------------------"
    log INFO "Analizando: ${vm}"

    if vm_esta_corriendo "$vm"; then
        if hacer_snapshot "$vm" "$TIMESTAMP"; then
            ((EXITO++))
        else
            ((FALLO++))
        fi
    else
        log WARN "La máquina '${vm}' no está 'running'. Saltando..."
        ((SALTADAS++))
    fi
done


echo ""
log TITLE "════════════════ RESUMEN ════════════════"
log OK    "Finalizadas con éxito: ${EXITO}"
[[ $FALLO    -gt 0 ]] && log ERROR "Fallidas:              ${FALLO}"
[[ $SALTADAS -gt 0 ]] && log WARN  "Omitidas (apagadas):   ${SALTADAS}"
log INFO  "Archivo de log: ${LOG_FILE}"
log TITLE "═════════════════════════════════════════"

[[ $FALLO -gt 0 ]] && exit 1 || exit 0

Ho executem i dona aquest resultat: 

[11:02:28][debian][hbarbera@hbarbera]-$ ./backup_vms.sh

════════════════════════════════════════


   SISTEMA DE BACKUP VAGRANT — 10/04/2026 11:02:32


════════════════════════════════════════

[INFO]  2026-04-10 11:02:32 — Máquinas incluidas en este backup:
  • debianproxy
  • router_2
  • debiandns
  • debianslave
  • debianldap
  • rockyFTP
  • rockyNFS

¿Confirmas el inicio del backup de estas máquinas? [s/N]: s
--------------------------------------------------------
[INFO]  2026-04-10 11:02:43 — Analizando: debianproxy
[WARN]  2026-04-10 11:02:46 — La máquina 'debianproxy' no está 'running'. Saltando...
--------------------------------------------------------
[INFO]  2026-04-10 11:02:46 — Analizando: router_2
[INFO]  2026-04-10 11:02:50 — Creando snapshot de 'router_2'...
[OK]    2026-04-10 11:03:01 — Guardado con éxito: 'router_2' -> 'backup_20260410_110232'
--------------------------------------------------------
[INFO]  2026-04-10 11:03:01 — Analizando: debiandns
[INFO]  2026-04-10 11:03:05 — Creando snapshot de 'debiandns'...
[OK]    2026-04-10 11:03:14 — Guardado con éxito: 'debiandns' -> 'backup_20260410_110232'
--------------------------------------------------------
[INFO]  2026-04-10 11:03:14 — Analizando: debianslave
[WARN]  2026-04-10 11:03:17 — La máquina 'debianslave' no está 'running'. Saltando...
--------------------------------------------------------
[INFO]  2026-04-10 11:03:17 — Analizando: debianldap
[WARN]  2026-04-10 11:03:21 — La máquina 'debianldap' no está 'running'. Saltando...
--------------------------------------------------------
[INFO]  2026-04-10 11:03:21 — Analizando: rockyFTP
[INFO]  2026-04-10 11:03:25 — Creando snapshot de 'rockyFTP'...
[OK]    2026-04-10 11:03:36 — Guardado con éxito: 'rockyFTP' -> 'backup_20260410_110232'
--------------------------------------------------------
[INFO]  2026-04-10 11:03:36 — Analizando: rockyNFS
[WARN]  2026-04-10 11:03:39 — La máquina 'rockyNFS' no está 'running'. Saltando...


════════════════ RESUMEN ════════════════

[OK]    2026-04-10 11:03:39 — Finalizadas con éxito: 3
[WARN]  2026-04-10 11:03:39 — Omitidas (apagadas):   4
[INFO]  2026-04-10 11:03:39 — Archivo de log: /home/hbarbera/Documents/debian/logs/backup_20260410_110232.log

═════════════════════════════════════════

A més fa un log que ensenya el mateix que pots veure a la consola, per poder fer un seguiment del backups que has fet.

Cookie Consent with Real Cookie Banner