pbs-drill.sh — restore drill automatizado desde PBS¶
Last updated: 2026-08-01 (añadida lógica de reintento antes de alertar; ver "Qué hace" paso 2)
Script en proxmox-50:/usr/local/bin/pbs-drill.sh que valida automáticamente que los backups PBS son realmente restaurables, no solo presentes/verified. Fuente versionada: ansible/roles/observability_collector/files/pbs-drill.sh.
Por qué¶
PBS verify-jobs comprueban integridad de chunks (checksum), no que la restauración funcione end-to-end. Es posible que un backup verifique OK y aún así no arranque por config corrupta, FS inconsistente, o cambios en host (kernel/storage). El drill lo demuestra restaurando de verdad y arrancando.
Qué hace¶
- Selecciona random target del pool según tipo:
lxc: pool(100 123 155 200 251)— exclude 186 (PBS mismo). (Corregido 2026-07-12: antes apuntaba a 249/253 ya decomisionados.)vm: pool(171 208).- Busca el último backup PBS de ese guest (
pvesm list pbs). Nuevo (2026-08-01): si la lista viene vacía, el script no asume directamente "sin backup" — unpvesm list pbsvacío puede deberse a un hiccup transitorio de la API de PBS (p.ej. ocupado con GC), no solo a que falte el backup de verdad. Espera 30 segundos y reintenta una vez antes de alertar. Solo si sigue vacío tras el reintento, notifica❌ sin backup para $TYPE $TARGET (confirmado tras reintento)y sale con código 3. Esto evita falsos positivos de "sin backup". - Restaura a VMID
999(drill temporal). Sin USB pinning para VMs (HA), sin IP estática (sin colisión de red). - Arranca el guest.
- Verifica
runningstatus tras 8s (LXC) o 30s (VM). - Trap EXIT siempre destruye VMID 999 — sin importar el resultado.
- Notifica resultado a Telegram con duración y backup timestamp.
Cron¶
/etc/cron.d/pbs-drill en proxmox-50:
# LXC drill mensual día 1 a las 05:05
5 5 1 * * root /usr/local/bin/pbs-drill.sh lxc
# VM drill trimestral (Ene/Abr/Jul/Oct) día 15 a las 05:05
5 5 15 1,4,7,10 * root /usr/local/bin/pbs-drill.sh vm
= 12 LXC drills + 4 VM drills por año. ~30 min agregados de trabajo en background.
Logs¶
- Stdout/stderr:
/var/log/pbs-drill.log(no rota — pequeño, no preocupa). - Telegram: cada ejecución manda mensaje con resultado.
Test manual¶
ssh [email protected] /usr/local/bin/pbs-drill.sh lxc
# o vm para drill VM
Validación inicial¶
Ejecutado manualmente 2026-04-26 15:41: target lxc-253, backup 2026-04-25 23:00, ✅ OK en 249s.
Failure modes¶
- VMID 999 ya en uso al arrancar → script lo destruye antes (idempotente).
- Backup no encontrado → reintenta una vez tras 30s (ver arriba); si sigue sin aparecer, notify ❌ + exit 3.
- Restore falla → notify ❌ + cleanup vía trap.
- Start falla → notify ❌ + cleanup vía trap.
Tradeoffs¶
- No verifica integridad de datos dentro del guest (DB consistency, app state). Solo "el guest arranca". Para tests más profundos: drill manual con
pct exec 999 -- <verify-cmd>ad-hoc. - VMID 999 hardcoded — si añades en el futuro un guest que use 999, cambiar
DRILL_VMIDen script. - Ejecuta solo en proxmox-50. Si pmx-50 muere, el cron muere con él. Plan: tras failover documentado, recrear cron en pmx2-51 manualmente.