Automazione quotidiana: script utili per la risoluzione problemi

C’è un vecchio adagio tra i sistemisti: “Se devi fare un’operazione per la terza volta, scrivi uno script”.

L’automazione non serve solo a risparmiare tempo, ma a ridurre l’errore umano e a trasformare la gestione dell’infrastruttura da reattiva (intervengo quando qualcosa si rompe) a proattiva (il sistema si ripara da solo o mi avvisa prima di rompersi).

In questo articolo, esploreremo una serie di script “salvavita” pronti all’uso, testati sul campo per risolvere i problemi più comuni nell’amministrazione di server Linux e ambienti Windows.

1. Il “Watchdog” di Connettività (Bash)

Le interfacce di rete o i tunnel VPN (come WireGuard o OpenVPN) possono bloccarsi per micro-disconnessioni del provider. Invece di accorgerti del problema quando un utente non riesce a collegarsi, puoi usare un “cane da guardia” che verifica la connessione e riavvia il servizio autonomamente.

Questo script pinga un indirizzo affidabile (es. i DNS di Google). Se il ping fallisce per 3 volte di fila, riavvia l’interfaccia di rete e registra l’evento in un log.

#!/bin/bash
# Nome: vpn-watchdog.sh

TARGET="8.8.8.8"
LOGFILE="/var/log/network-watchdog.log"
SERVICE="wg-quick@wg0" # Sostituisci con il tuo servizio (es. networking, openvpn)

# Esegue 3 ping. Redirige l'output nel vuoto per non sporcare la shell
ping -c 3 $TARGET > /dev/null 2>&1

# $? legge il codice di uscita dell'ultimo comando. 0 = Successo, 1 = Fallito
if [ $? -ne 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Connessione a $TARGET fallita. Riavvio $SERVICE..." >> $LOGFILE
    systemctl restart $SERVICE
else
    # Opzionale: commenta questa riga in produzione per non riempire i log inutilmente
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Connessione OK." >> $LOGFILE
fi

Implementazione: Salvalo in /usr/local/bin/vpn-watchdog.sh, rendilo eseguibile (chmod +x) e aggiungilo al tuo crontab di root per girare ogni 5 minuti (*/5 * * * * /usr/local/bin/vpn-watchdog.sh).

2. Allarme Spazio Disco in Esaurimento (Bash)

Un server con la partizione di root (/) piena al 100% andrà inevitabilmente in kernel panic o corromperà i database in esecuzione. Questo script controlla l’utilizzo del disco e, se supera una soglia definita, invia una notifica (in questo caso tramite Webhook a Telegram, Slack o Make.com).

#!/bin/bash
# Nome: disk-alert.sh

THRESHOLD=90 # Soglia di allarme al 90%
PARTITION="/" # Partizione da monitorare
WEBHOOK_URL="https://tuo-webhook-url.com"

# Estrae la percentuale di utilizzo della partizione, rimuovendo il simbolo %
CURRENT_USAGE=$(df -h $PARTITION | awk 'NR==2 {print $5}' | sed 's/%//g')

if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
    MESSAGE="⚠️ ALLARME: Lo spazio sul server per la partizione $PARTITION ha raggiunto il $CURRENT_USAGE%!"
    
    # Invia la notifica via POST (formato JSON)
    curl -X POST -H "Content-Type: application/json" \
         -d "{\"text\": \"$MESSAGE\"}" $WEBHOOK_URL
fi

3. Pulizia Automatica dei File Temporanei (PowerShell)

In ambiente Windows Server (o sulle workstation dei dipendenti), le cartelle temporanee, le cache dei log applicativi o i vecchi backup di IIS tendono a saturare i dischi nel corso dei mesi.

Questo script PowerShell è letale ed efficiente: cerca in una directory specifica tutti i file più vecchi di “X” giorni e li elimina forzatamente.

# Nome: AutoCleanup.ps1

$TargetFolder = "C:\inetpub\logs\LogFiles"
$DaysToKeep = 30
$CurrentDate = Get-Date

# Calcola la data limite
$ExpirationDate = $CurrentDate.AddDays(-$DaysToKeep)

# Cerca e distruggi
Get-ChildItem -Path $TargetFolder -Recurse | 
    Where-Object { -not $_.PSIsContainer -and $_.LastWriteTime -lt $ExpirationDate } | 
    Remove-Item -Force

Write-Output "Pulizia completata. File più vecchi di $DaysToKeep giorni rimossi da $TargetFolder."

Implementazione: Esegui lo script tramite Utilità di pianificazione (Task Scheduler) impostando un trigger settimanale. Ricorda di eseguire il task con privilegi più elevati (“Esegui con i privilegi massimi”) e di impostare le policy di esecuzione correttemente (Set-ExecutionPolicy RemoteSigned).

4. Backup delle Configurazioni (Bash + Tar)

Se ti modifichi le configurazioni di un server (/etc/nginx, /etc/postfix, file del firewall) e commetti un errore, tornare indietro senza un backup può costarti ore. Questo mini-script crea un archivio compresso della cartella /etc e lo salva aggiungendo il timestamp al nome del file, ruotando i backup più vecchi di 7 giorni.

#!/bin/bash
# Nome: config-backup.sh

BACKUP_DIR="/opt/backups/etc"
SOURCE_DIR="/etc"
DATE=$(date +%Y-%m-%d_%H-%M)

# Crea la directory di backup se non esiste
mkdir -p $BACKUP_DIR

# Crea l'archivio tar.gz
tar -czf "$BACKUP_DIR/etc_backup_$DATE.tar.gz" $SOURCE_DIR > /dev/null 2>&1

# Elimina i backup più vecchi di 7 giorni per non saturare il disco
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +7 -exec rm {} \;

echo "Backup di $SOURCE_DIR completato: etc_backup_$DATE.tar.gz"

Conclusioni: L’Importanza dei Log

L’automazione è cieca. Uno script che esegue operazioni in background deve sempre lasciare una traccia scritta di ciò che fa. Un errore comune è creare automatismi brillanti ma “silenziosi”. Se uno script di pulizia cancella per sbaglio la directory sbagliata, senza un file di log (generato tramite >> /var/log/mio-script.log o Write-Output in Windows) non saprai mai cosa è successo, a che ora, e perché.

Tratta i tuoi script come veri e propri servizi di sistema: falli loggare, monitorali e testa sempre in un ambiente di staging prima di affidargli compiti di produzione.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Verificato da MonsterInsights