Automatización de Recopilación de Datos de Switches mediante Scripts Shell

En escenarios de red donde los vecinos OSPF presentan caídas intermitentes, como en equipos Huawei con problemas de timeout en paquetes hello, la recopilación manual de información es ineficiente. Para solucionar esto, se desarrollaron scripts shell que automatizan la ejecución de comandos en switches vía SSH, utilizando expect para manejar las interacciones. La solución involucar bucles temporales para ejecuciones frecuentes y tareas programadas con cron.

El enfoque principal es: primero, un script que recorre una lista de direcciones IP para conectarse y ejecutar cmoandos; segundo, un script de bucle temporal para lograr intervalos de ejecución menores a un minuto; y tercero, tareas cron para programar la ejecución y la compresión de los archivos generados.

Script 1: Recopilación de Información de Dispositivos

Este script se conecta a cada switch listado en un archivo y ejecuta comandos específicos. Se modifica la estructura y variables para reducir similitud.

#!/bin/bash
# Script: recolectar_datos.sh
# Recopila información de configuración de switches mediante SSH

ARCHIVO_DISPOSITIVOS="/etc/red/equipos.txt"
USUARIO_RED="admin"
CLAVE_RED="clave_segura"
PUERTO_SSH=22

for dispositivo in $(cat "$ARCHIVO_DISPOSITIVOS"); do
    echo "Procesando dispositivo: $dispositivo"
    expect -c "
        set timeout 15;
        spawn ssh -p $PUERTO_SSH $USUARIO_RED@$dispositivo;
        expect {
            yes/no { send \"yes\r\"; exp_continue }
            *contraseña* { send \"$CLAVE_RED\r\" }
        };
        sleep 1;
        expect *> { send \"display current-configuration\r\" };
        expect *> { send \"display ospf neighbor\r\" };
        expect *> { send \"quit\r\" };
        expect eof;
    "
    echo "Finalizada recopilación para $dispositivo"
done

Script 2: Bucle Temporal para Ejecución Frecuente

Para ejecutar el script anterior con un intervalo de 8 segundos dentro de un minuto, se usa un bucle for con sleep. Los resultados se guardan en archivos con marcas de tiempo.

#!/bin/bash
# Script: ciclo_temporal.sh
# Ejecuta la recopilación en intervalos de 8 segundos

INTERVALO=8
RUTA_SALIDA="/var/registros/redes"
SCRIPT_RECOLECTOR="/opt/scripts/recolectar_datos.sh"

for (( contador = 0; contador < 60; contador += $INTERVALO )); do
    timestamp=$(date "+%Y%m%d_%H%M%S")
    bash "$SCRIPT_RECOLECTOR" > "$RUTA_SALIDA/datos_$timestamp.log"
    sleep $INTERVALO
done
exit 0

Script de Compresión

Para comprimir los archivos generados, se crea un script que empaqueta y elimina los archivos originales. Se cambia la ruta y lógica.

#!/bin/bash
# Script: comprimir_registros.sh
# Comprime los logs generados con bzip2

RUTA_LOGS="/var/registros/redes"
NOMBRE_ARCHIVO=$(date "+%Y%m%d_%H%M%S")
tar -cjvf "$RUTA_LOGS/archivo_$NOMBRE_ARCHIVO.tar.bz2" "$RUTA_LOGS/datos_2023*" --remove-files

Tareas Programadas con Cron

Se configuran dos entradas en crontab: una para ejecutar el bucle temporal cada minuto, y otra para comprimir los archivos diariamente.

# crontab -l
* * * * * /bin/bash /opt/scripts/ciclo_temporal.sh
0 2 * * * /bin/bash /opt/scripts/comprimir_registros.sh

Versión Optimizada: Script Unificado

Para simplificar, se combina el bucle temporal y la recopilación en un solo script. Se reestructura la lógica con variables descriptivas.

#!/bin/bash
# Script: monitoreo_unificado.sh
# Combina bucle temporal y recopilación de datos de switches

DIRECTORIO_BASE="/etc/red"
LISTA_EQUIPOS="$DIRECTORIO_BASE/equipos.txt"
CARPETA_RESULTADOS="/var/registros/redes"
INTERVALO_SEGUNDOS=7

for (( tiempo = 0; tiempo < 60; tiempo += $INTERVALO_SEGUNDOS )); do
    marca_temporal=$(date "+%s")
    for equipo in $(cat "$LISTA_EQUIPOS"); do
        expect -c "
            set timeout 10;
            spawn ssh -p 22 admin@$equipo;
            expect {
                yes/no { send \"yes\r\"; exp_continue }
                *contraseña* { send \"admin123\r\" }
            };
            sleep 0.7;
            expect *> { send \"display ip interface brief\r\" };
            expect *> { send \"display version\r\" };
            expect *> { send \"exit\r\" };
            expect eof;
        " >> "$CARPETA_RESULTADOS/salida_$marca_temporal.txt"
    done
    sleep $INTERVALO_SEGUNDOS
done
exit 0

Este enfoque automatiza la monitorización, reduciendo la carga operativa y permitiendo un análisis posterior de las interrupciones en la red.

Etiquetas: shell scripting SSH expect cron OSPF

Publicado el 6-5 00:57