Come già affermato in più occasioni, Nagios è sicuramente uno dei migliori NMS open source in circolazione. Esso mette a disposizione del sysadmin tutta una serie di funzioni utilissime per verificare lo stato di salute relativo agli host monitorati e consente, in alcune circostanze, di gestire i downtime in modo automatico (ad esempio riavviando il servizio che ha generato lo status di tipo CRITICAL).
Tale gestione automatica dei downtime viene realizzata attraverso i cosiddetti event handlers. Vediamo come configurarli.
Per prima cosa è necessario creare un comando simile al seguente, editando il file /etc/nagios/object/commands.cfg
define command { command_name flushcache command_line /usr/lib/nagios/plugins/eventhandlers/flushcache $HOSTADDRESS$ $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ }
Nella fattispecie, il suddetto comando utulizza l’eseguibile flushcache, il cui compito è quello connettersi alla macchina target e di cancellare la cache del sistema operativo in caso di memory leak.
Occorre ora configurare l’event handler all’interno del servizio che si occupa del monitoraggio della RAM:
define service{ use local-service host_name vostrohost.vostrodominio.it service_description FREE RAM check_command check_remote_ram!10!5 event_handler flushcache notifications_enabled 0 }
A questo punto la configurazione di Nagios può ritenersi ultimata. Non ci rimane che creare l’eseguibile flushcache all’interno della directory /usr/lib/nagios/plugins/eventhandlers/:
[root@NMS eventhandlers]# nano flushcache
il cui contenuto dovrà essere il seguente:
#!/bin/bash if [ -n "$1" ];then case "$2" in OK) ;; WARNING) ;; UNKNOWN) ;; CRITICAL) case "$3" in SOFT) case "$4" in 3) echo -n "Flushing cache memory (3rd soft critical state)..." /usr/lib/nagios/plugins/eventhandlers/connect_server.sh $1 ;; esac ;; HARD) echo -n "Flushing cache memory..." /usr/lib/nagios/plugins/eventhandlers/connect_server.sh $1 ;; esac ;; esac else echo "Usage: flushcache <hostname>" fi exit 0
Dove $1 è la variabile $HOSTADDRESS$, $2 è il $SERVICESTATE$, $3 è il $SERVICESTATETYPE$ e $4 è il $SERVICEATTEMPT$ (sono semplicemente le variabili utilizzate nella definizione del comando flushcache in command.cfg).
Premesso che per il tipo di servizio local-service il max_check_attempts è impostato a 4 (nel file template.cfg), il suddetto codice bash non fa altro che interrogare la macchina target ($HOSTADDRESS), ricavando il $SERVICESTATE$ (OK, WARNING, UNKNOWN o CRITICAL), il $SERVICESTATETYPE$ (SOFT oppure HARD) ed il $SERVICEATTEMPT$ (ovvero il numero di check già eseguiti da Nagios nel caso in cui il $SERVICESTATE$ sia diverso da OK).
Il suddetto eseguibile prevede delle operazioni solo se il $SERVICESTATE$ è di tipo CRITICAL: in tal caso, al terzo check consecutivo (siamo ancora in SOFT state – parliamo di HARD state solo se il $SERVICESTATE$ è ancora CRITICAL dopo il quarto check), verrà lanciato l’eseguibile connect_server.sh (expect) che si occuperà di svuotare la cache della macchina monitorata. La suddetta operazione verrà eseguita nuovamente appena il $SERVICESTATETYPE$ passerà da SOFT a HARD.
Inoltre, tale eseguibile prevede come unico parametro in ingresso l’IP dell’host, ovvero $HOSTADDRESS$ (connect_server.sh $1).
Di seguito il sorgente relativo a connect_server.sh:
#!/usr/bin/expect set hostname [lindex $argv 0] set password "vostrapass" spawn ssh -l root $hostname expect "*assword:" send "$password\n" expect "#" send "sync && echo 3 > /proc/sys/vm/drop_caches\n" expect "#" send "exit\n" expect eof
Nella fattispecie, il comando vero e proprio che si occupa dello svuotamento della cache sulla macchina target è:
sync && echo 3 > /proc/sys/vm/drop_caches
A questo punto possiamo ricaricare la configurazione di Nagios per rendere effettive le suddette modifiche:
[root@NMS eventhandlers]# service nagios reload
ed abbiamo finito.
A presto.