Automatizando tareas con Bash: Verificación del Sistema

Rossana SuarezRossana Suarez
7 min read

En DevOps, uno de los pilares fundamentales es la automatización. Las tareas repetitivas pueden convertirse en cuellos de botella si no se gestionan adecuadamente, y aquí es donde Bash scripting juega un papel crucial. Con Bash, puedes crear scripts potentes para monitorear y gestionar sistemas de manera eficiente, especialmente en entornos Linux. En esta entrada, te mostraré un script que realiza una serie de chequeos del sistema: uso de CPU, procesos que consumen más recursos, espacio en disco, memoria disponible y verificación de conectividad a Internet. Además, te daré algunos tips útiles para aplicar Bash en tus flujos de trabajo DevOps.

¿Por qué usar Bash Scripting en DevOps?

  • Automatización: Te permite automatizar tareas repetitivas como la limpieza de logs, el monitoreo de sistemas y la implementación de aplicaciones.

  • Flexibilidad: Bash es excelente para manejar scripts ligeros, y es especialmente útil en sistemas donde no se pueden instalar herramientas adicionales.

  • Ahorro de tiempo: Un script de verificación del sistema puede ahorrar minutos o incluso horas a lo largo del tiempo, lo cual es invaluable cuando gestionas múltiples servidores.

  • Facilidad de uso: Una vez que dominas Bash, escribir y modificar scripts se vuelve intuitivo, incluso para tareas más complejas.

Ejemplo: Script de Verificación del Sistema

Este es un script básico que puedes personalizar para cubrir tus necesidades específicas en DevOps. Realiza una serie de chequeos de uso de CPU, procesos, disco, memoria, red y conectividad a Internet.

#!/bin/bash

# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Variables de configuración
LOG_FILE="/var/log/system-monitor.log"
METRICS_FILE="/var/log/system-metrics.log"
ALERT_CPU_THRESHOLD=80
ALERT_MEM_THRESHOLD=80
ALERT_DISK_THRESHOLD=85
MONITOR_INTERVAL=300  # 5 minutos en segundos

# Mejor manejo de errores
set -euo pipefail
trap 'echo -e "${RED}Error: Comando falló en la línea $LINENO${NC}" | tee -a $LOG_FILE' ERR

# Función de logging mejorada
log_message() {
    local level=$1
    local message=$2
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo -e "${timestamp} [$level] $message" | tee -a $LOG_FILE
}

# Función para verificar si se está ejecutando como root
check_root() {
    if [ "$EUID" -ne 0 ]; then 
        log_message "ERROR" "${RED}Este script necesita privilegios de root para instalar paquetes.${NC}"
        log_message "WARNING" "${YELLOW}Por favor, ejecute con sudo.${NC}"
        exit 1
    fi
}

# Función mejorada para instalar dependencias
install_dependencies() {
    local os_type=""

    if [ -f /etc/os-release ]; then
        . /etc/os-release
        os_type=$ID
    fi

    log_message "INFO" "${BLUE}Verificando e instalando dependencias necesarias...${NC}"

    case $os_type in
        "ubuntu"|"debian")
            apt-get update -qq
            packages=(sysstat lm-sensors net-tools)
            for package in "${packages[@]}"; do
                if ! dpkg -l | grep -q "^ii.*$package"; then
                    log_message "INFO" "${GREEN}Instalando $package...${NC}"
                    DEBIAN_FRONTEND=noninteractive apt-get install -y $package
                fi
            done
            ;;
        "centos"|"rhel"|"fedora")
            packages=(sysstat lm_sensors net-tools)
            for package in "${packages[@]}"; do
                if ! rpm -q $package &>/dev/null; then
                    log_message "INFO" "${GREEN}Instalando $package...${NC}"
                    dnf install -y $package
                fi
            done
            ;;
        *)
            log_message "ERROR" "${RED}Sistema operativo no soportado para instalación automática.${NC}"
            exit 1
            ;;
    esac
}

....

Revisa el Código en el Repositorio

Explicación del Script

1. Verificación de usuario root

La función check_root verifica si el script se está ejecutando con privilegios de root. Muchos comandos, como la instalación de paquetes o la modificación de configuraciones del sistema, requieren permisos elevados.

check_root() {
    if [ "$EUID" -ne 0 ]; then 
        echo "Este script necesita privilegios de root para instalar paquetes."
        echo "Por favor, ejecute con sudo."
        exit 1
    fi
}
💡
¿Por qué es importante? Si no tienes permisos de root, ciertas tareas como la instalación de paquetes fallarán, por lo que es fundamental verificar este paso antes de continuar.

2. Instalación de dependencias

La función install_dependencies detecta el tipo de sistema operativo y, según si es basado en Debian (como Ubuntu) o RedHat (como CentOS/Rocky o Fedora), instala herramientas necesarias como sysstat (para monitorear la CPU) y lm-sensors (para monitorear la temperatura del hardware).

install_dependencies() {
    # Detectar el sistema operativo y usar apt-get o dnf según sea necesario
    # ...
}
💡
Tip DevOps: Mantener las dependencias siempre actualizadas en todos tus entornos asegura que los scripts funcionen de manera uniforme en múltiples servidores.

3. Verificación del estado del sistema

El script genera un reporte con la siguiente información del sistema:

  • Carga de CPU: Usa mpstat para obtener un resumen detallado de la carga de CPU. Si mpstat no está instalado, el script recurre a la salida de top para mostrar la utilización de la CPU.

  • Top procesos por CPU: Con ps aux, se muestra una lista de los procesos que más CPU consumen.

  • Espacio en disco: Muestra el uso del disco usando df -h, que lista los sistemas de archivos con el espacio utilizado y disponible.

  • Memoria RAM y SWAP: Usa free -h para mostrar el uso de la memoria y el espacio de intercambio (SWAP).

  • Estado de la red: Verifica la conexión a Internet con un simple ping a 8.8.8.8 y muestra las interfaces de red activas usando ip addr show.

  • Logs recientes: Muestra los últimos 5 registros de journalctl, que es útil para diagnosticar problemas recientes en el sistema.

Mejora y Personalización

Este script es solo un punto de partida, pero puedes ampliarlo para cubrir más escenarios según tus necesidades en DevOps:

  1. Agregar alertas: Puedes configurar el script para que envíe alertas por correo o Slack si alguna métrica del sistema está fuera de los límites aceptables.

     # Envío de alertas si el espacio en disco es bajo
     if [ "$(df / | awk 'NR==2 {print $5}' | sed 's/%//g')" -gt 90 ]; then
         echo "Advertencia: Espacio en disco bajo" | mail -s "Alerta del Sistema" admin@empresa.com
     fi
    
  2. Cron Jobs: Si este script es útil para ti, puedes configurarlo para que se ejecute automáticamente cada cierto tiempo usando cron.

     # Abre el crontab para edición
     crontab -e
    
     # Añade esta línea para ejecutar el script todos los días a las 8 AM
     0 8 * * * /ruta/a/tu/script.sh
    
  3. Exportar logs: Puede ser útil guardar los resultados en un archivo de log para un análisis posterior.

     # Guardar el resultado del script en un log
     ./script.sh > /var/log/system-check.log
    

Tips y Trucos para Bash Scripting en DevOps

  1. Usa variables con cuidado: Siempre es una buena práctica declarar variables al principio del script. Evita usar nombres de variables que podrían entrar en conflicto con comandos del sistema.

  2. Prueba tus scripts en entornos de prueba: Antes de usar cualquier script en producción, pruébalo en un entorno aislado para asegurarte de que no tenga errores graves.

  3. Manejo de errores: Agregar control de errores mejora la confiabilidad. Utiliza el comando set -e para asegurarte de que el script se detenga si ocurre un error grave.

  4. Usa comentarios: Aunque Bash es fácil de entender, comentar cada sección te ayudará a recordar lo que hace cada parte del script cuando vuelvas a verlo en el futuro.

  5. Convierte scripts en herramientas reutilizables: Si ves que un script te resulta útil en más de un proyecto, considera convertirlo en un comando personalizado o empaquetarlo en un archivo ejecutable más formal.

Funcionamiento

Para ejecutar el script check.sh, sigue estos pasos:

  1. Abre una terminal: Accede a tu terminal o consola de comandos.

  2. Navega a la ubicación del script: Utiliza el comando cd para cambiar al directorio donde se encuentra el archivo check.sh. Por ejemplo, si está en tu carpeta de usuario:

     cd /ruta/a/la/carpeta
    

    Reemplaza /ruta/a/la/carpeta con la ruta real.

  3. Dale permisos de ejecución: Asegúrate de que el script tenga permisos de ejecución. Puedes hacerlo con el siguiente comando:

     chmod +x check.sh
    
  4. Ejecuta el script: Ahora puedes ejecutar el script. Dado que el script requiere privilegios de root para algunas funciones, es recomendable usar sudo:

     sudo ./check.sh
    
  5. Proporciona tu contraseña: Si se te solicita, ingresa tu contraseña de usuario para continuar.

Notas Adicionales

  • Asegúrate de que el script está bien escrito y que no contiene errores. Si hay algún problema durante la ejecución, revisa los mensajes de error que aparecen en la consola.

  • Si deseas que el script se ejecute automáticamente en intervalos regulares, considera agregarlo a un cron job en Linux.

El script check.sh está diseñado para ser ejecutado en diferentes entornos de desarrollo, lo que te permite aprovechar la flexibilidad de herramientas como Vagrant, Killercoda, y máquinas locales.

¿Te Interesa Aprender sobre Vagrant?

Si quieres saber más sobre Vagrant y cómo utilizarlo de manera efectiva en tus proyectos, ¡déjame un comentario! Estoy aquí para armar un tutorial paso a paso que te guiará desde la instalación hasta la configuración de tus entornos de desarrollo. ¡No dudes en preguntar!

0
Subscribe to my newsletter

Read articles from Rossana Suarez directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Rossana Suarez
Rossana Suarez

Soy Roxs 👩‍💻| Software Developer | DevOps | DevSecOps | en @295DevOps 🖼 Content Creator. No se puede crecer si no estas dispuesto a saltar a la zona de peligro 🔥