Costruirsi un sistema di monitoraggio “casalingo” con Nagios – parte 2
Leggi la prima parte della guida
In questa seconda parte della guida illustrerò alcune configurazioni di base per i check di Nagios e l’uso dell’addon NRPE per check locali su sistemi remoti.
La struttura
In questa guida prenderò in considerazione la struttura qui si seguito che permette di illustrare vari tipi di configurazione:

Una panoramica sugli host e i servizi:
- Host A, server Linux con:
- Server HTTP Apache
- VMWare Server con una macchina virtuale E con un server Zimbra
- Host B, server Linux con:
- Server HTTP Apache
- Server MySQL
Quindi E dipende da C che a sua volta dipende da A. Invece D dipende da B.
Entrambi i server Apache rispondono sulle porte 80 e 443, l’interfaccia di amministrazione di VMWare Server risponde sulla porta 8333 (con SSL).
La macchina virtuale Zimbra fornisce i servizi SMTP, POP3 e le interfaccie di webmail e amministrazione (porta 7071).
Infine nella macchina B il server MySQL risponde solo sull’interfaccia locale, non è quindi possibile accedervi dall’esterno.
Negli esempi successivi gli elementi A, C ed E saranno del cliente Company A (dominio company-a.com) e B e D saranno del cliente Company B con dominio company-b.com.
I nomi host saranno i seguenti:
- A => web.company-a.com
- C (macchina virtuale) => mail.company-a.com
- B => web.company-b.com
Per un maggior dettaglio nella spiegazione delle singole configurazioni tenete sempre sott’occhio la guida ufficiale alla pagina Object Definitions.
Organizzazione dei file
Una volta installato Nagios seguendo la prima parte della guida, troverete tutte le configurazioni in /usr/local/nagios/etc. Il file che comanda è nagios.cfg il quale poi richiama tutti gli altri. È quindi possibile, e consigliabile, creare una gerarchia di file che possa poi più facilmente permettere di gestire tutte le configurazioni (senza perdersi per strada i vari pezzi).
Nel file nagios.cfg ci sono due direttive inerenti questo aspetto e sono cfg_file e cfg_dir. La prima indica direttamente un file da cui leggere ulteriori configurazioni, la seconda indica intere directory da cui saranno inclusi tutti i file che terminano con .cfg. Io consiglio di intervenire usando questa seconda direttiva, le cartelle che ho creato sono:
cfg_dir=/usr/local/nagios/etc/personalized_objects cfg_dir=/usr/local/nagios/etc/servers cfg_dir=/usr/local/nagios/etc/groups
Oltre alle due cartelle con le configurazioni dei server e dei gruppi, ho aggiunto una cartella in cui inserirò i template personalizzati, ad esempio con timeperiods o contact groups diversi da quelli standard.
Gruppi di host e servizi
È possibile definire dei gruppi di host (ad esempio a seconda dell’azienda di appartenenza o del tipo di hardware) e dei gruppi di servizi (server di posta, server web, ecc.). Personalmente inserisco queste configurazioni nella cartella groups.
Esempi di configurazione sono i seguenti:
define hostgroup{
hostgroup_name companyA-servers
alias Company A Servers
members mail.company-a.com,web.company-a.com
}
define hostgroup{
hostgroup_name companyB-servers
alias Company B Servers
members web.company-b.com
}
define servicegroup{
servicegroup_name web-servers
alias Web Servers
members web.company-a.com,HTTP,web.company-b.com,HTTP
}
In entrambi i casi gli host indicati in members devono ricalcare il nome con cui quegli host sono definiti (attributo host_name). Nel caso dei servizi, oltre al nome dell’host, deve essere indicato il nome del servizio (anche in questo caso deve essere uguale a quello inserito in service_description).
Definizione degli host
Iniziamo con la configurazione dei server. I file web.company-a.com.cfg, web.company-b.com.cfg e mail.company-a.com.cfg verranno creati nella cartella servers. Non c’è molto da spiegare, inserisco dei commenti direttamente nelle configurazioni:
web.company-a.com.cfg
define host {
use linux-server ; Template da cui ereditare
host_name web.company-a.com ; L'host name è ciò che viene usato per identificare l'host negli altri file
alias CompanyA Web Server
address 1.2.3.4
hostgroups comapanyA-servers ; Come in hostgroup, tale configurazione può essere alternativa o in aggiunta
}
web.company-b.com.cfg
define host {
use linux-server
host_name web.company-b.com
alias CompanyB Web Server
address 1.2.3.5
hostgroups comapanyB-servers
}
mail.company-a.com.cfg
define host {
use linux-server
host_name mail.company-a.com
alias CompanyA Web Server
address 1.2.3.6
hostgroups comapanyA-servers
parents web.company-a.com ; L'host da cui questo host dipende
}
Definizione dei servizi
La definizione dei servizi è direttamente collegata ai plugin, ovvero usano questi ultimi per effettuare i check. In verità il valore dell’attributo check_command, anche se in genere ricalca il nome del plugin (i plugin sono nella cartella libexec), non lo indica direttamente ma ha una corrispondenza nel valore dell’attributo command_name nella definizione di un comando (file etc/objects/commands.cfg).
mail.company-a.com.cfg
define service {
use generic-service
host_name mail.company-a.com
service_description SMTP
check_command check_smtp!-t 5
}
define service {
use generic-service
host_name mail.company-a.com
service_description IMAP
check_command check_imap!-t 5
}
define service {
use generic-service
host_name mail.company-a.com
service_description POP3
check_command check_pop!-t 5
}
Nella direttiva check_command viene indicato il tipo di comando da eseguire. Dopo il punto esclamativo vengono indicati gli argomenti. Se date uno sguardo a etc/objects/commands.cfg vedrete che gli argomenti vengono passati al plugin con $ARG1$, $ARG2$, ecc. In alcuni è presente soltanto un argomento, quindi nella definizione del servizio, dopo il punto esclamativo, devono essere indicati tutti gli argomenti (tipo ./check_dummy -t pippo -x pluto) mentre in altri comandi sono presenti più argomenti, spesso associati ad una specifica opzione (tipo ./check_dummy -t $ARG1$ -x $ARG2$). Nella definizione del servizio, più argomenti possono essere indicati con più punti esclamativi (tipo check_dummy!pippo!pluto). Per avere più informazioni su un plugin lanciatelo con libexec/check_dummy –help.
Un esempio di check un po’ più complesso può essere, ad esempio, quello necessario per controllare se l’interfaccia di amministrazione di Zimbra sta girando correttamente (HTTPS sulla porta 7071):
mail.company-a.com.cfg
define service{
use generic-service
host_name mail.comapany-a.com
service_description ZimbraAdmin
check_command check_http!"-H mail.company-a.com -p 7071 -w 5 -c 15 --ssl"
}
Com’è facile intuire, con check_http è possibile quindi monitorare ogni singolo sito presente su un server web.
Ecco gli altri file necessari per la nostra configurazione:
web.company-a.com.cfg
define service{
use generic-service
host_name web.company-a.com
service_description HTTP
check_command check_http ; Semplice check sulla porta 80
}
define service{
use generic-service
host_name web.company-a.com
service_description VMWareAdmin
check_command check_http!"-H web.company-a.com -p 8333 -w 5 -c 15 --ssl"
}
web.company-b.com.cfg
define service{
use generic-service
host_name web.company-b.com
service_description HTTP
check_command check_http
}
NRPE
L’ultima cosa che rimane da controllare è lo stato del server MySQL. Dato che il servizio risponde soltanto sull’interfaccia locale non è possibile controllarne direttamente lo stato dal server Nagios. L’addon NRPE fa proprio questo: installato sulla macchina da controllare, esegue dei check locali quando interrogato da Nagios.Il plugin da usare sul server è check_nrpe e l’argomento da passargli è il nome del check definito nel client, il quale a sua volta dovrà associare questo nome ad un check locale (quindi sul client dobbiamo installare i plugin).
Su entrambe le macchine va compilato l’addon:
tar xzf nrpe-2.12.tar.gz cd nrpe-2.12/ ./configure --enable-ssl make all
A questo punto l’installazione tra host e client differisce. Per l’installazione nel client dei plugin seguite la prima parte della guida.
Host
make install-plugin
e quindi bisogna creare il template del comando:
commands.cfg
define command {
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
Client
Se non è installato, installate xinetd:
apt-get install xinetd
Installate quindi il demone
make install-daemon make install-daemon-config make install-xinetd
Aggiungete NRPE al file /etc/services:
nrpe 5666/tcp # NRPE
Aggiungete l’ip del server Nagios al file /etc/xinetd.d/nrpe (in questo caso un fittizio 4.3.2.1):
only_from = 127.0.0.1 4.3.2.1
Infine riavviate il server xinetd e controllate che NRPE sia in ascolto:
~# /etc/init.d/xinetd restart ~# netstat -at | grep nrpe tcp 0 0 *:nrpe *:* LISTEN
A questo punto si può testare il servizio in locale con:
~# /usr/local/nagios/libexec/check_nrpe -H localhost NRPE v2.12
Controllare MySQL
Arriviamo al nostro obiettivo: controllare che il server MySQL stia correttamente girando. Creiamo un utente MySQL non privilegiato:
mysql> CREATE USER 'nagiosCheck'@'localhost' IDENTIFIED BY 'some_pass';
Il check, lanciato da linea di comando, sarà il seguente:
~# /usr/local/nagios/libexec/check_mysql -u nagiosCheck -p some_pass Uptime: 1061012 Threads: 2 Questions: 192277 Slow queries: 0 Opens: 198 Flush tables: 1 Open tables: 64 Queries per second avg: 0.181
Inseriamo quindi tale check in /usr/local/nagios/etc/nrpe.cfg:
command[check_mysql]=/usr/local/nagios/libexec/check_mysql -u nagiosCheck -p some_pass
Da notare che nel server Nagios il nome dell’argomento da passare a check_nrpe sarà check_mysql come definito tra le parentesi quadre.
A questo punto dal server Nagios si può testare il check remoto:
~# /usr/local/nagios/libexec/check_nrpe -H tomcat.mydomain.com -c check_mysql Uptime: 1061534 Threads: 2 Questions: 192280 Slow queries: 0 Opens: 198 Flush tables: 1 Open tables: 64 Queries per second avg: 0.181
Se è tutto ok non resta che inserirlo tra i servizi dell’host B:
web.company-b.com.cfg
define service{
use generic-service
host_name web.company-b.com
service_description MySQL
check_command check_nrpe!check_mysql
}
E questo conclude la configurazione della nostra rete di test. Nella prossima puntata spiegherò come configurare dei server slave per effettuare check passivi, necessari, ad esempio, in configurazioni di rete complesse in cui il server master non può direttamente raggiungere gli host da controllare (se l’host da controllare è all’interno di una LAN, per dirne una).
Leggi la prima parte della guida

Pingback: Realizzare un sistema di monitoraggio con Icinga | TommyBlue.it