Monitoraggio distribuito con Nagios/Icinga e NSCA
Sebbene Icinga/Nagios e NRPE siano un’ottima coppia per monitorare le macchine (sia via socket che internamente), a volte possono non bastare. Potrebbe infatti essere utile distribuire i check su più macchine, sia per un fattore di carico sia per aggirare eventuali firewall.
Partendo quindi da una macchina con un server Icinga o Nagios funzionante, come descritto qui, mostrerò come configurare un secondo server remoto che comunica via NSCA il risultato dei check al server principale.
Configurazione del server distribuito (client)
Sulla macchina client (Ubuntu server 12.04 LTS) si installano i seguenti pacchetti:
sudo apt-get install icinga-core nsca nagios-plugins-extra
Bisogna configurare /etc/send_nsca.cfg inserendo la password e la scelta di cifratura. Entrambi i dati andranno fedelmente riprodotti nel server NSCA.
Adesso si edita il file /etc/icinga/commands.cfg aggiungendo il comando che invierà i dati al server NSCA:
define command{
command_name submit_check_result
command_line /usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca $HOSTNAME$ '$SERVICEDESC$' $SERVICESTATEID$ '$SERVICEOUTPUT$'
}
Nel file /usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca bisogna editare la variabile IcingaHost con l’hostname del server Icinga principale.
Il concetto di funzionamento del monitoraggio distribuito è che i server secondari inviano al master i risultati dei check. Per farlo bisogna attivare il servizio OCSP (obsessive compulsive service processor) in /etc/icinga/icinga.cfg dicendogli di usare il comando precedentemente definito per comunicare al server NSCA i risultati dei check:
obsess_over_services=1
ocsp_command=submit_check_result
ocsp_timeout=5
Dato che il server slave deve soltanto comunicare i risultati dei check, si disabilitano le notifiche dei servizi in objects/generic-service_icinga.cfg impostando:
notifications_enabled 0
In questo modo eventuali allarmi partiranno soltanto dal server principale.
Per finire si può definire un check base:
define host{
use generic-host
host_name base-icinga
alias Icinga server
address 127.0.0.1
}
define service{
use generic-service
host_name base-icinga
service_description Disk Space
check_command check_all_disks!20%!10%
}
Integrazione di NSCA nel server principale e ricezione dei check passivi
Passiamo al server principale e per prima cosa definiamo un servizio passivo:
define service{
use generic-service ; template to inherit from
name passive-service ; name of this template
active_checks_enabled 0 ; no active checks
passive_checks_enabled 1 ; allow passive checks
check_command check_dummy!0 ; use "check_dummy", RC=0 (OK)
check_period 24x7 ; check active all the time
check_freshness 0 ; don't check if check result is "stale"
register 0 ; this is a template, not a real service
}
Tale template verrà usato per ogni servizio passivo.
Per abilitare la ricezione di check passivi in icinga.cfg devono essere presenti:
check_external_commands=1
command_check_interval=<n>[s]
log_passive_checks=1
Si faccia attenzione: i check passivi non arriveranno dal server slave, ma dal server NSCA che sarà installato su questa stessa macchina e che li passa a Icinga. Si installa quindi il pacchetto nsca e si configura /etc/nsca.cfg, ricordandosi di settare la password e la cifratura inseriti nel client. Si dia un occhio anche ad altre configurazioni, ad esempio il percorso al file che accetta i check passivi, nel mio caso:
command_file=/usr/local/icinga/var/rw/icinga.cmd
Una volta avviato il server NSCA (standalone o via xinetd) se dal client si lancia una connessione questo dovrebbe essere il risultato:
echo -e "A\tB\tC\tD\n" | /usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca
0 data packet(s) sent to host successfully.
Adesso si può definire l’host e il check passivo:
define host {
use drwolf-server
host_name base-icinga
alias Icinga@base
address 127.0.0.1
}
define service{
use passive-service
host_name base-icinga
service_description Current Users
}
Al termine si può riavviare Icinga e tutto dovrebbe essere a posto. Attenzione che il nome dell’host (host_name) e il nome del servizio (service_description) siano esattamente gli stessi definiti nello slave, altrimenti nel file /var/log/icinga/icinga.log troverete messaggi come questo:
[1339598868] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;localhost;HTTP;0;HTTP OK: HTTP/1.1 200 OK - 453 bytes in 0,001 second response time
[1339598868] Warning: Passive check result was received for service 'HTTP' on host 'localhost', but the host could not be found!
Se invece va tutto bene troverete nel log questi messaggi:
[1339599272] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;base-icinga;Current Users;0;USERS OK - 1 users currently logged in
[1339599277] PASSIVE SERVICE CHECK: base-icinga;Current Users;0;USERS OK - 1 users currently logged in
e dall’interfaccia di Icinga vedrete cambiare lo stato dei vari servizi remoti :)