systemadmin.es > Monitorización > Usar el event handler de Nagios para recuperar servicios

Usar el event handler de Nagios para recuperar servicios

Mediante Nagios podemos aplicar ciertos procedimientos para intentar recuperar automáticamente un servicio que esta fallando. Vamos a ver como el event handler combinado con el NRPE puede ayudarnos.

Mediante el event handler podemos ejecutar un comando cada vez que un servicio cambia de estado, para saber dónde estamos tenemos las siguientes tres variables:

  • $SERVICESTATE$: El estado del servicio puede ser: “OK“, “WARNING“, “UNKNOWN“, o “CRITICAL“.
  • $SERVICESTATETYPE$: Puede ser “HARD” (Ha llegado al número máximo de intentos) o “SOFT” (Aún no ha llegado al máximo de intentos, por lo tanto aún no se ha mandado la notificación)
  • $SERVICEATTEMPT$: El número de veces que se intentado el check en el estado actual

Por lo tanto el orden sería, en un check que tuviera configurados 4 intentos:

  • CRITICAL SOFT 1: Primer vez que falla
  • CRITICAL SOFT 2: Segunda vez consecutiva que falla
  • CRITICAL SOFT 3: Tercera vez consecutiva que falla
  • CRITICAL HARD 4: Cuarta vez consecutiva que falla y momento en el que se mandan las notificaciones

Existe también un event handler para host checks con unas variables diferentes
$HOSTSTATE$, $HOSTSTATETYPE$ y $HOSTATTEMPT$ pero no vamos a entrar en detalle porque es equivalente a los event handlers para servicios.

Para habilitar globalmente los event handlers deberemos editar el fichero genera de configuración (nagios.cfg) y añadir:

enable_event_handlers=1

A continuación ya podremos habilitar los event handlers.

Partiremos como base con el siguiente script que usa las tres variables que hemos hablado antes para decidir si tenemos que realizar alguna acción:

#!/bin/sh

echo "$1 $2 $3"

case "$1" in

OK)
	;;

WARNING)
	;;

UNKNOWN)
	;;

CRITICAL)
	case "$2" in
	SOFT)
		case "$3" in
		2)

			# antes de mandar la notificacion

			;;

			esac

		;;

	HARD)

		# aqui se manda la notificacion si se arregla con esto se manda igual

		;;

	esac

	;;


esac
exit 0

A continuación deberemos configurar el NRPE para que acepte parámetros en los comandos que tenga definidos, para ello deberemos añadir las siguientes opciones:

  • dont_blame_nrpe: Esta opción es bastante clara indicando que si los comandos permite parámetros se pueden usar para ejecutar comandos con los permisos del NRPE. Aunque se filtran algunos caracteres el riego esta allí
  • allowed_hosts: Permite limitar los comandos a los que provengan de un host o conjunto de hosts, es muy recomendable, especialmente si habilitamos los parámetros remotos

Para el comando deberemos indicar en que posición deben estar los argumentos. El fichero de configuración del NRPE quedaría:

allowed_hosts=10.1.1.2
dont_blame_nrpe=1
command[restart_bacula_fd]=/usr/local/nagios/libexec/restart_bacula_fd $ARG1$ $ARG2$ $ARG3$

A continuación y partiendo del script anterior añadimos el procedimiento que queramos en los reintentos que nos interesen, por ejemplo para un cliente de Bacula:

#!/bin/sh

baculafdprocediment()
{
	logger "NRPE recuperant bacula-fd"
	# wall "NRPE recuperant bacula-fd"
	
	svc -d /service/bacula-fd/ ; sleep 2
	pkill bacula-fd ; sleep 2
	pkill -9 bacula-fd
	svc -u /service/bacula-fd/
}

# wall "NRPE event handler: $1 $2 $3"

echo "$1 $2 $3"

case "$1" in

OK)
	;;

WARNING)
	;;

UNKNOWN)
	;;

CRITICAL)
	case "$2" in
	SOFT)
		case "$3" in
		2)

			# antes de mandar la notificacion
			
			baculafdprocediment

			;;

			esac

		;;

	HARD)

		# aqui se manda la notificacion si se arregla con esto se manda igual
		
		baculafdprocediment
		
		;;

	esac

	;;


esac
exit 0

Desde el host de monitorización podemos probar mediante comandos que funcione correctamente:

# /usr/local/libexec/check_nrpe -H 10.1.1.100 -c restart_bacula_fd -a 1 2 3
1 2 3

Con lo que a continuación sólo deberemos añadir el comando de reinicio del servicio por NRPE:

define command{
        command_name    nrpe_restart_bacula_fd
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c restart_bacula_fd -a $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$
}

En el servicio concreto que queramos habilitar el event handler deberemos añadir:

  • event_handler_enabled: Habilitamos explicitamente el event handler
  • event_handler: Indicamos el comando a ejecutar cuando ocurra algún evento

Con lo que la definición del servicio nos quedaría algo parecido a lo siguiente:

define service{
        use                             local-service         ; Name of service template to use
        host_name                       penny
        service_description             Bacula FD
        check_command                   check_nrpe!check_bacula_fd
        contact_groups                  admins,guardies
        notification_interval           3600
        event_handler_enabled           1
        event_handler                   nrpe_restart_bacula_fd
        }

7 comments to “Usar el event handler de Nagios para recuperar servicios”

  1. Util! habrá que probarlo.

  2. ¡muy bueno!

  3. Lo he configurado, en el log de nagios me dice que recibe y pone en marcha el eventhandler pero en mi caso en lugar de iniciar un servicio simplemente crea un fichero HARDSTATE o SOFSTATE en /tmp, lo unico que en la maquina cliente no se genera el fichero, si lanzo manualmente el eventhandler entonces si.

    Saludos,

    David

  4. Me resulta extraño, que versión de NRPE tienes instalada? El uso de argumentos cambió hace algún tiempo, quizá tienes instalada la versión antigua

  5. Gracias, de mucha ayuda!

  6. Buenas.

    Muy interesante el aporte, estoy tratando de poner en marcha la monitorización de un log en servidores Windows, por lo que estoy investigando como hacerlo con NRPE, ¿me podrías comentar si es posible hacerlo de esta misma manera o tengo que usar algún otro plugin?

    Saludos y gracias.

  7. Omar, para Windows deberías usar NSClient para hacer algo similar a NRPE.

    Saludos y suerte!

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>