Category Archives: Nagios

NAGIOS: Supervisando los test de disco

El sistema de ficheros por defecto en Linux viene siendo Extendida en sus versiones 2, 3 y ahora 4. A la hora de crear el sistema, cuando damos formato a la partición, se establecen un intervalo de tiempo y un número de veces que la partición se montará antes de ser revisada para comprobar la integridad del sistema. En Debian, estos valores son 180 días o 39 montajes. Es bueno comprobar periódicamente la salud de nuestros sistemas para evitar corrupciones y la consiguiente perdida de datos.

Sin embargo, tenemos la posibilidad de no definir ningún número de montajes máximo ni intervalo de fechas para que nunca se automaticen los test de disco, quedando bajo nuestra responsabilidad llevarlos a cabo cuando estimemos oportuno. Cuando ese momento llegue, reiniciaremos la máquina con este comando.

# shutdown -r -F now

Que reiniciará la máquina y pasará el test al arrancar el sistema.

Esta decisión implica una planificación de la acción, tener un calendario a mano y marcar los días que se va a lanzar el comando.

Para que los test no sean automáticos debemos configurar las particiones para que no cuenten los montajes o los intervalos de tiempo entre revisiones. Por ejemplo para /dev/sda1 haríamos:

# tune2fs -i 0 /dev/sda1 
# tune2fs -c -1 /dev/sda1

Y deshabilitamos las comprobaciones automáticas.

Si nos decidimos por dejar estos valores intactos o cambiarlos por un rango más amplio de tiempo o mayor número de montajes nos gustará saber cuando sucederá la siguiente comprobación, por ejemplo, en el caso de actualizar alguna máquina y tener que reiniciarla, si no podemos perder tiempo pasando el test, reiniciaremos con el siguiente comando.

# shutdown -r -f now

Que reiniciará y se saltará el test.

Para supervisar estos valores he escrito un script para Nagios que recibirá por parámetros los valores de aviso y critico y el dispositivo a supervisar.

Esta es la sintaxis.

# check_next_fsck -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE

Si queremos que nos avise 7 días o 10 montajes antes de que se cumplan los límites de aviso y entre en crítico cuando queden 4 días o 5 montajes pues pasaremos los siguiente parámetros al script

# check_next_fsck -w 7,10 -c 4,5 -d /dev/sda1

También cumple con la especificación POSIX de Nagios y el valor devuelto es el indicado para cada caso. Se comprueba si el dispositivo que le pasamos como parámetro está configurado para ser revisado periódicamente tanto en tiempo como en número de montajes. Si el usuario que corre Nagios es no privilegiado, necesitaras configurar sudo para que pueda ejecutar tune2fs

La principal motivación que me ha llevado a escribirlo es que no he encontrado en el directorio de plugins de Nagios ninguno que me gustara. Este es:

#!/bin/bash
# --
# Check the date and mount count of the device passed by parameter. It's able to
# manage devices not configurated to be checked by fsck (values -1 and none in
# max mount count and date interval).
#
# Needs sudo without passwd to run tune2fs
#
# Usage: check_next_fsck -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE
#
# @author: Fede Diaz nordri (at) gmail.com
# @version: 1.0.1
# @date: 2011/03/20
# Changelog
# 2011/07/12
# Fix a type.
# --

if [ "$#" -lt 6 ]; then
  echo "Usage: $0 -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE";
  exit 3;
fi

until [ -z "$1" ]  
do
  if [ $1 == "-w" ]; then
    VALUE=$2;
    WARNING_DAYS=$(echo $VALUE | cut -d, -f1);
    WARNING_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-c" ]; then
    VALUE=$2;
    CRITICAL_DAYS=$(echo $VALUE | cut -d, -f1);
    CRITICAL_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-d" ]; then
    DEVICE=$2;
  fi
  shift;
done

# Parsing tune2fs exits (Beware with sudo)
TARGET_DATE=$(sudo /sbin/tune2fs -l $DEVICE | grep "Next check after" | cut -d: -f2,3,4 );
CHECK_INTERVAL=$(sudo /sbin/tune2fs -l $DEVICE | grep "Check interval" | cut -d: -f2 );
INTERVAL=$(echo $CHECK_INTERVAL | cut -d" " -f1);
MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Mount count" | cut -d: -f2 );
MAX_MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Maximum mount count" | cut -d: -f2 );

# Calculating dates
TODAY=$(date +"%s");
EPOCH_TARGET_DATE=$(date +"%s" -d "$TARGET_DATE");

let SECONDS_LEFT="$EPOCH_TARGET_DATE - $TODAY";

CHECK_DATES="YES"; # Check interval = none means NO INTERVAL TIME BETWEEN MOUNTS
if [ $INTERVAL == 0 ]; then 
  CHECK_DATES="NO";
else
  let DAYS_LEFT="$SECONDS_LEFT/86400";
fi

CHECK_MOUNT_COUNT="YES"; # Maximum mount count = -1 means NO COUNT MOUNTS
if [ $MAX_MOUNT_COUNT == -1 ]; then
  CHECK_MOUNT_COUNT="NO";
else
  let MOUNT_LEFT="$MAX_MOUNT_COUNT - $MOUNT_COUNT";
fi

# Calculating WARNINGS and CRITICAL
if [ $CHECK_DATES == "YES" ]; then
  if [ $DAYS_LEFT -gt $WARNING_DAYS ]; then
    VALUE="0";
  elif [ $DAYS_LEFT -lt $CRITICAL_DAYS ]; then
    VALUE="2";
  else
    VALUE="1";
  fi
else
  VALUE="3";
fi

if [ $CHECK_MOUNT_COUNT == "YES" ]; then
  if [ $MOUNT_LEFT -gt $WARNING_MOUNTS ]; then
    VALUE=$VALUE"0";
  elif [ $MOUNT_LEFT -lt $CRITICAL_MOUNTS ]; then
    VALUE=$VALUE"2";
  else
    VALUE=$VALUE"1";
  fi
else
  VALUE=$VALUE"3";
fi

# Returning the results
case $VALUE in
  "00")
    echo "OK next check in $DAYS_LEFT days or $MOUNT_LEFT mounts";
    exit 0;
    ;;
  "01")
    echo "WARNING next check in $MOUNT_LEFT mounts";
    exit 1;
    ;;
  "02")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;; 
  "10")
    echo "WARNING next check in $DAYS_LEFT days";
    exit 1;
    ;;
  "11")
    echo "WARNING next check in $DAYS_LEFT days and $MOUNT_LEFT mounts";
    exit 1;
    ;;
  "12")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;;
  "20")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "21")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "22")
    echo "CRITICAL next check in $DAYS_LEFT days and $MOUNT_LEFT mounts";
    exit 2;
    ;;
  "33")
    echo "UNKNOWN Nothing to check";
    exit 3;
    ;;
esac

La salida cubre todos los estados posibles dando prioridad a crítico frente a los demás.

UpdateEl código también está disponible en el repositorio de extensiones de Nagios.