Un Nagios parlante con Festival !

nagios    festival

Nagios è universalmente considerato il tool di monitoraggio opensource numero uno sulla piazza. La sua duttilità lo rende uno strumento indispensabile per tutti gli amministratori di sistema che si trovano a controllare numeri elevati di macchine e che necessitano di notifiche tempestive a seguito di malfunzionamenti.
Generalmente le notifiche dei guasti avvengono via mail o via sms, ma possono esserci casi in cui questi tipi di notifiche non sortiscano l’effetto desiderato. La soluzione presentata in questo articolo prevede che Nagios attraverso il software opensource di sintesi vocale Festival comunichi a voce quali sono i malfunzionamenti in corso.

Installazione di Festival

Il sistema di riferimento su cui verranno effettuate le prove è Debian Etch. Partiremo dal presupposto che sul sistema utilizzato vi sia una scheda audio correttamente configurata.
Festival è disponibile nei repository ufficiali della distribuzione ed è pertanto installabile attraverso apt-get :

$ apt-get install festival festvox-italp16k festvox-itapc16k

I tre pacchetti installati contengono il programma Festival e le voci italiane (maschile e femminile) da esso utilizzabili.
Per verificare il corretto funzionamento del software (e di conseguenza della scheda audio) è sufficiente lanciare il seguente comando :

$ echo "Ciao mondo" | festival --tts --language italian

Se dagli altoparlanti si sente una voce (un poco metallica per la verità, ma comunque intonata) che recita la frase “Ciao mondo” allora Festival è perfettamente funzionante e si può procedere con la configurazione di Nagios.

Installazione di Nagios

Anche Nagios è presente nei repository della distribuzione Etch ed è installabile quindi con il consueto comando apt-get :

$ apt-get install nagios2 nagios-plugins nagios-images

L’installazione si occupa di creare una configurazione base che comprende i controlli relativi alla macchina locale ed al gateway utilizzato da questa. Per consultare le informazioni relative ai controlli è possibile utilizzare l’interfaccia web che Nagios rende disponibile all’indirizzo http://localhost/nagios2.
Questa interfaccia però richiede un’autenticazione. All’interno della configurazione base creata dal sistema è stato definito un utente denominato nagiosadmin che ha i privilegi di accesso ai controlli di default definiti. A questo utente è quindi sufficiente assegnare una password :

htpasswd -c /etc/nagios2/htpasswd.users nagiosadmin
New password: 
Re-type new password: 
Adding password for user nagiosadmin

attraverso la quale sarà possibile accedere all’interfaccia, che non dovrebbe scostarsi troppo da quella in Figura 1.

Figura 1
Figura 1

Iterazione Nagios – Festival

Il comportamento di Nagios a fronte di controlli, azioni e notifiche è sempre lo stesso, lanciare uno script.
Pertanto il primo passo sarà quello di creare uno script che possa essere utilizzato da Nagios per notificare i malfunzionamenti in una forma interpretabile da Festival.
La filosofia utilizzata in questo senso è la seguente : a fronte di un service o host in stato CRITICAL, verrà creato un file di testo contenente il messaggio che Festival dovrà leggere.
Tale script risiederà nella cartella dei plugin di Nagios, e verrà nominato check_festival_parse :

$ vi /usr/lib/nagios/plugins/check_festival_parse

Lo script sarà così definito :

#!/bin/bash

# RaSca (rasca@miamammausalinux.org) - 2009/02/04 :
# Script per l'interpretazione delle notifiche Nagios e l'eventuale creazione
# (o cancellazione) dei file di testo contenente i messaggi.

# Primo parametro : il tipo di notifica (host o servizio)
tipo=$1
# Secondo parametro : stato dell'host/servizio
stato=$2
# Terzo parametro : Nome dell'host/servizio
nome=$3
# Path dove depositare i file di testo contenenti le notifiche
file_path="/var/log/nagios2/festival"

case "$tipo" in
 host)
  messaggio="ATTENZIONE. ATTENZIONE. L'host $nome e' in stato $stato"
  ;;
 service)
  messaggio="ATTENZIONE. ATTENZIONE. Il servizio $nome e' in stato $stato"
  ;;
 *)
  echo "Errore. Impossibile interpretare i parametri di input."
  exit 1
  ;;
esac

if [ "$stato" == "CRITICAL" ]
 then
  echo "$messaggio" > $file_path/festival_$tipo_$nome
 else
  rm -f $file_path/festival_$tipo_$nome
fi

I commenti all’interno sono autoesplicativi, serve solo aggiungere che per funzionare correttamente lo script ha bisogno di tre parametri che sono il tipo di notifica (relativa ad un service o un host), lo stato del servizio o dell’host ed il nome di quest’ultimo.
Viene inoltre definita attraverso la variabile file_path la posizione dei file di testo contenenti le notifiche. Nostro caso, per coerenza, la scelta è quella di creare una directory denominata festival nella directory principale dei log di nagios, /var/log/nagios2/.
Per completare questa fase del progetto è necessario settare i permessi di esecuzione dello script, creare la cartella che ospiterà i file di testo ed assegnare questa all’utente nagios in modo che questo, attraverso il demone, possa scriverci :

$ chmod +x /usr/lib/nagios/plugins/check_festival_parse
$ mkdir /var/log/nagios2/festival
$ chown nagios /var/log/nagios2/festival

Completata la definizione delle notifiche è necessario configurare l’interpretazione delle stesse da parte del sistema. Verrà definito quindi uno script che ciclicamente controllerà l’esistenza di file all’interno della cartella /var/log/nagios2/festival.
Il file si chiamerà semplicemente check_festival e risiederà sempre nella cartella dei plugin di Nagios :

$ vi /usr/lib/nagios/plugins/check_festival

e questo sarà il contenuto :

#!/bin/bash

# RaSca (rasca@miamammausalinux.org) - 2009/02/04 :
# Script che legge via TTS le eventuali notifiche presenti nei
# file in $file_path con cicli di 4 volte a distanza di 10 secondi

# Path dove leggere i file di testo contenenti le notifiche
file_path="/var/log/nagios2/festival/"

for i in `seq 1 4`
do
 for j in `find $file_path -type f`
  do
   cat $j | festival --tts --language italian
  done
 sleep 10s
done

Lo script definisce un ciclo che per quattro volte, a distanza di dieci secondi, controlla l’elenco dei file presenti nella directory /var/log/nagios2/festival/ e legge il contenuto di ciascuno di questi.
Anche questo script necessita dei permessi di esecuzione :

chmod +x /usr/lib/nagios/plugins/check_festival

A completamento di questa fase del progetto è necessario configurare Nagios affinché vengano definite le notifiche. Tutte le configurazioni di Nagios sono presenti nella cartella /etc/nagios2/conf.d/. All’avvio il demone nagios controlla tutti i file contenuti in questo path e ne ricava la propria configurazione.
Creando quindi un nuovo file all’interno di quest’area :

$ vi /etc/nagios2/conf.d/commands_festival

Si potranno definire due nuovi comandi chiamati host-notify-by-festival e notify-by-festival che lanceranno lo script check_festival_parse con i parametri relativi :

define command{
        command_name    host-notify-by-festival
        command_line    /usr/lib/nagios/plugins/check_festival_parse host $HOSTSTATE$ $HOSTNAME$
}

define command{
        command_name    notify-by-festival
        command_line    /usr/lib/nagios/plugins/check_festival_parse service $SERVICESTATE$ $SERVICEDESC$
}

Prima di caricare nuovamente la configurazione di Nagios è necessario associare i nuovi comandi alle notifiche dei contatti. Tali informazioni sono contenute nel file /etc/nagios2/conf.d/contacts_nagios2.cfg, all’interno del quale sono presenti le seguenti righe :

        service_notification_commands   notify-by-email
        host_notification_commands      host-notify-by-email

che andranno modificate aggiungendo i comandi sopra definiti :

        service_notification_commands   notify-by-email,notify-by-festival
        host_notification_commands      host-notify-by-email, host-notify-by-festival

Nagios è quindi pronto a caricare nuovamente la configurazione :

$ /etc/init.d/nagios2 reload
Reloading nagios2 monitoring daemon configuration files: nagios2.

L’ultima operazione per il completamento della configurazione del sistema riguarda la definizione all’interno dello schedulatore cron di sistema dell’esecuzione dello script di lettura del contenuto della cartella delle notifiche. In questo caso la definizione è relativa ad ogni minuto, ma è possibile modificarla in base alle proprie necessità :

# Crontab per lettura messaggi Nagios via festival ogni minuto
* *     * * *   root    /usr/lib/nagios/plugins/check_festival

Test di funzionamento

Per effettuare dei test di funzionamento è necessario configurare dei controlli associati ad un host di test. In questo caso la scelta è caduta su di un host di rete denominato test-server all’interno del quale gira un servizio HTTP (un webserver apache).
L’host verrà definito nel file /etc/nagios2/conf.d/test_hosts.cfg :

define host {
        host_name   test-server
        alias       Test server
        address     10.175.88.191
        use         generic-host
        }

Mentre i servizi ad esso associati verranno definiti nel file /etc/nagios2/conf.d/test_services.cfg :

define service {
        host				test-server
        service_description             HTTP
 	check_command                   check_http
        use                             generic-service
	notification_interval           0
}

Chiaramente per far assimilare le modifiche a Nagios è necessario effettuare il reload del servizio :

$ /etc/init.d/nagios2 reload
Reloading nagios2 monitoring daemon configuration files: nagios2.

Una volta che l’host test-server ed il servizio HTTP appariranno nel resoconto web si potranno simulare i malfunzionamenti per i quali ci si aspetta che Nagios parli.
Ad esempio, sospendendo il servizio HTTP sul server di test, una volta che Nagios avrà effettuato i quattro tentativi, definiti Attempt, la notifica verrà inviata dal sistema attraverso il comando notify-by-festival che di conseguenza creerà un file di testo nominato “festival_service_HTTP” contenente il testo “Attenzione. Attenzione. Il servizio HTTP e’ in stato CRITICAL”.
Quanto effettuato dal sistema è visibile dal log di Nagios, /var/log/nagios2/nagios.log :

[1233758032] SERVICE ALERT: test-server;HTTP;CRITICAL;SOFT;1;CRITICAL - Socket timeout after 10 seconds
[1233758092] SERVICE ALERT: test-server;HTTP;CRITICAL;SOFT;2;CRITICAL - Socket timeout after 10 seconds
[1233758152] SERVICE ALERT: test-server;HTTP;CRITICAL;SOFT;3;CRITICAL - Socket timeout after 10 seconds
[1233758212] SERVICE ALERT: test-server;HTTP;CRITICAL;HARD;4;CRITICAL - Socket timeout after 10 seconds
[1233758212] SERVICE NOTIFICATION: root;test-server;HTTP;CRITICAL;notify-by-festival;CRITICAL - Socket timeout after 10 seconds

Tale file sarà letto dallo script definito nel crontab di sistema che darà il via alle letture attraverso Festival.
In conclusione, Nagios dovrebbe parlare.
Una volta ripristinato il servizio HTTP il file verrà automaticamente rimosso sempre dallo script notify-by-festival e di conseguenza Nagios verrà zittito (con soddisfazione).

Conclusioni

E’ evidente che tutto l’impianto può essere personalizzato in modo che l’integrazione con il sistema di controllo avvenga nella maniera più consona possibile. Le potenzialità di una simile implementazione di Nagios sono moltissime ed applicabili ad uno spettro di situazioni altrettanto numerose.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Una risposta a “Un Nagios parlante con Festival !”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *