Old:Nagios: monitorare server e servizi
Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica. |
Introduzione
Nagios (Home Page) è uno strumento molto usato ed utilissimo per il monitoraggio di server e servizi. All'inizio, per molti utenti, è un po' complicato da configurare, ma dopo aver capito il funzionamento risulterà semplice, potente e versatile, attributi necessari per questo genere di strumenti.
ATTENZIONE Da Debian Lenny 5.0 in poi il pacchetto nagios2 non è più presente nei repository. Al suo posto è stato inserito il più aggiornato nagios3 .Per queste versioni si consiglia pertanto di far riferimento alla guida aggiornata. Nagios: monitoraggio infrastruttura IT |
Installazione
La macchina su cui verrà installato Nagios è una Debian Etch. Installeremo la versione 2 di Nagios, con i relativi pacchetti per avere un maggior numero di plugin e immagini (vedremo dopo come usarle).
Per installare nagios è sufficiente un:
# apt-get install nagios2 nagios2-common nagios-plugins nagios-images nagios-plugins-basic nagios-plugins-standard
Dopo aver scaricato (sono circa 3.5Mb) ed installato nagios provvediamo all'installazione di un web server (necessario per consultare la comoda web-interface); la mia scelta è ricaduta su apache2, anche perché il server in questione ospiterà applicazioni scritte in PHP. Procediamo ad installare apache2 con:
# apt-get install apache2 libapache2-mod-php5
Configurazione
Apache
Al momento dell'installazione viene creato in modo automatico il file /etc/apache2/conf.d/nagios2.conf
(il file è, a tutti gli effetti, un link simbolico al file /etc/nagios2/apache2.conf
) con il seguente contenuto:
# apache configuration for nagios 2.x # note to users of nagios 1.x: # throughout this file are commented out sections which preserve # backwards compatibility with bookmarks/config for nagios 1.x. simply # look for lines following "nagios 1.x:" comments. ScriptAlias /cgi-bin/nagios2 /usr/lib/cgi-bin/nagios2 ScriptAlias /nagios2/cgi-bin /usr/lib/cgi-bin/nagios2 # nagios 1.x: #ScriptAlias /cgi-bin/nagios /usr/lib/cgi-bin/nagios2 #ScriptAlias /nagios/cgi-bin /usr/lib/cgi-bin/nagios2 # Where the HTML pages live Alias /nagios2 /usr/share/nagios2/htdocs # nagios 1.x: #Alias /nagios /usr/share/nagios2/htdocs <DirectoryMatch (/usr/share/nagios2/htdocs|/usr/lib/cgi-bin/nagios2)> Options FollowSymLinks DirectoryIndex index.html AllowOverride AuthConfig Order Allow,Deny Allow From All AuthName "Nagios Access" AuthType Basic AuthUserFile /etc/nagios2/htpasswd.users # nagios 1.x: #AuthUserFile /etc/nagios/htpasswd.users require valid-user </DirectoryMatch> # Where the stylesheets (config files) reside #Alias /nagios2/stylesheets /etc/nagios2/stylesheets # nagios 1.x: #Alias /nagios/stylesheets /etc/nagios2/stylesheets # Enable this ScriptAlias if you want to enable the grouplist patch. # See http://apan.sourceforge.net/download.html for more info # It allows you to see a clickable list of all hostgroups in the # left pane of the Nagios web interface # XXX This is not tested for nagios 2.x use at your own peril #ScriptAlias /nagios2/side.html /usr/lib/cgi-bin/nagios2/grouplist.cgi # nagios 1.x: #ScriptAlias /nagios/side.html /usr/lib/cgi-bin/nagios2/grouplist.cgi
Il file contiene una bozza di configurazione per nagios che permette di raggiungere il servizio digitando, semplicemente http://IP/nagios2/. Questo sistema a me, personalmente, non piace, in quanto nagios sarebbe accessibile da qualsiasi sito ospitato sulla macchina, semplicemente digitando http://www.sito.it/nagios2/, non molto sicuro e pulito.
Creeremo, quindi, un sottodominio dedicato a nagios, modificando il file nel seguente modo:
<VirtualHost *:80> ServerAdmin root@knio.it # DocumentRoot /var/www/nagios/ ServerName nagios.knio.it ErrorLog /var/log/apache2/nagios.knio.it_error.log CustomLog /var/log/apache2/nagios.knio.it_access.log combined <Directory /> AllowOverride All Options +Multiviews Options Indexes Includes FollowSymLinks MultiViews DirectoryIndex index index.html </Directory> ScriptAlias /cgi-bin/nagios2 /usr/lib/cgi-bin/nagios2 ScriptAlias /nagios2/cgi-bin /usr/lib/cgi-bin/nagios2 #Alias /nagios2/stylesheets /etc/nagios2/stylesheets Alias /nagios2 /usr/share/nagios2/htdocs # Enable this ScriptAlias if you want to enable the grouplist patch. # See http://apan.sourceforge.net/download.html for more info # It allows you to see a clickable list of all hostgroups in the # left pane of the Nagios web interface # XXX This is not tested for nagios 2.x use at your own peril #ScriptAlias /nagios2/side.html /usr/lib/cgi-bin/nagios2/grouplist.cgi <DirectoryMatch (/usr/share/nagios2/htdocs|/usr/lib/cgi-bin/nagios2)> Options FollowSymLinks DirectoryIndex index.html AllowOverride AuthConfig Order Allow,Deny Allow From All AuthName "Nagios Access" AuthType Basic AuthUserFile /etc/nagios2/htpasswd.users require valid-user </DirectoryMatch> </VirtualHost>
Creiamo la Root Directory per questo sito con:
# mkdir /var/www/nagios # chown -R www-data:www-data /var/www/nagios/ # touch /var/www/nagios/index.html
la directory conterrà un file index.html
vuoto, in questo file potremmo mettere o una pagina di benvenuto oppure un redirect alla directory contenente l'applicativo, a piacere.
Ora manca solo una cosa da fare: aggiungere l'utente per l'accesso a nagios (operazione obbligatoria, pena un errore di tipo 500 quando si tenta di accedere all'applicazione).
Per aggiungere l'utente usiamo il comando htpasswd
:
# htpasswd -c /etc/nagios2/htpasswd.users nagiosadmin
alla richiesta di password, inseriamo una password a nostro piacimento.
Ora possiamo testare la configurazione, ma prima è necessario riavviare Apache per rendere effettive le modifiche che abbiamo effettuato:
# /etc/init.d/apache2 restart
Collegandosi alla pagina http://nagios.knio.it/nagios2/ ci verrà chiesto username/password per accedere a nagios, dopodiché ci verrà mostrata la schermata di default.
Nagios
Introduzione alla configurazione
La configurazione di nagios è situata, come da FHS in /etc/nagios2/
. All'interno di questa directory sono presenti i seguenti file (e directory):
- cgi.cfg
- il file contiene la configurazione dell'interfaccia web di nagios (quindi i percorsi dove trovare i file di configurazione ed alcuni comportamenti base; la configurazione dei permessi degli utenti e perfino i suoni da riprodurre in caso di problemi)
- commands.cfg
- contiene la configurazione dei comandi eseguibili da nagios: check, notifiche ed altri
- conf.d
- una directory che ha lo scopo di raccogliere i file di configurazione di tutti i vari host monitorati da nagios
- htpasswd.users
- contiene (come abbiamo visto prima) le chiavi di accesso di tutti gli utenti che possono accedere all'interfaccia web di nagios (i permessi, per questi utenti, sono definiti in
cgi.cfg
) - nagios.cfg
- contiene la configurazione vera e propria del demone di nagios, la configurazione di default è corretta nella maggior parte dei casi
- resource.cfg
- in questa guida non lo modificheremo
- stylesheets
- directory per inserire i fogli di stile personalizzati (in questa guida non li useremo)
Come gestire al meglio i file di configurazione
Anche se la struttura dei file di configurazione è semplice, ci vuole molto poco a renderla una vera e propria accozzaglia di file. Ci sono varie scuole di pensiero su come gestire i file.
La prima è quella di inserire, all'interno della directory conf.d/
un file per ogni host, raggruppando, poi, gli host tramite gli hostgroup. La tecnica è valida e funzionale, a meno che non ci si trovi a gestire un numero eccessivo di host.
La seconda tecnica, è quella di creare tante directory quanti sono i segmenti della rete, così da racchiudere i file di configurazione in directory meno popolate, così da rendere più facilmente individuabile un file.
Personalmente trovo più comodo gestire la prima, con la seguente convenzione:
- ogni file ha la forma
type-name.cfg
dove type rappresenta la tipologia del file di configurazione (host per un server, switch per uno switch di rete, router per un router, e così via...) e dove name è il nome univoco associato alla macchina (e usato anche all'interno di Nagios). - i file contenenti i gruppi, le definizioni dei periodi e simili hanno una struttura
type.cfg
dove type può essere:- contacts: per le definizioni dei contatti
- timeperiods: per le definizioni dei periodi
- extinfo: per le definizioni delle informazioni aggiuntive
- hostgroups: per la definizione dei gruppi di host
- services: per la definizione dei gruppi di servizi
Un'accortezza da adottare, inoltre, quando si modifica un file di configurazione è quella di effettuare un check di correttezza tramite il comando:
# nagios -v /etc/nagios2/nagios.conf
In questo modo si eviteranno downtime e si sarà sicuri che nagios ripartirà senza problemi (almeno legati alla sintassi dei file di configurazione...).
Gli Host
Tramite gli host è possibile definire i PC, server, switch e tutte le altre apparecchiature presenti nella rete da monitorare. Saranno poi i servizi a determinare cosa monitorare effettivamente.
La definizione classica e minimale di un host è la seguente:
define host{ use generic-host host_name serverino alias Server di Produzione address 192.168.0.15 }
I parametri della definizione sono i seguenti:
- use
- permette di specificare un template da utilizzare all'interno del nostro host. L'utilizzo di un template permette di minimizzare i parametri necessari da passare ad un host. Il template che usiamo, per ora, è generic-host che è quello fornito di default in Debian. In seguito provvederemo a creare dei template che permetteranno uan suddivisione degli host in modo semplice ed immediato.
- host_name
- l'hostname dell'host. Deve essere univoco, in quanto viene utilizzato all'interno di Nagios come nome univoco di un host. è buona pratica utilizzare l'hostname della macchina, in quanto permetterà, in seguito, di identificarla più facilmente. In caso di switch od altri componenti conviene identificarli nel seguente modo: switch-dmz, firewall-dmz, etc.
- alias
- rappresenta il nome comune dell'host.
- address
- l'indirizzo IP dell'host. Deve essere inserito solo l'indirizzo Primario, e non una lista di indirizzi! Se si vogliono monitorare più indirizzi IP o più servizi legati a più indirizzi IP, sarà opportuno o definire un altro host (non molto corretto) oppure aggiungere servizi in cui viene indicato, come parametro, l'indirizzo IP secondario.
Oltre a quelli specificati è possibile aggiungere questi parametri (per quelli utilizzati nel template rimando al sottocapitolo dedicato):
- parents <host_names>
- permette di indicare, tramite un elenco di host separati da virgola, i "parenti" di quell'host (ad esempio switch, gateway, ecc). Utile per la rappresentazione grafica della struttura della rete
- hostgroups <hostgroup_names>
- permette di specificare i gruppi, sempre separati da virgola, a cui appartiene l'host.
Come convenzione per la creazione di un host creeremo un file col formato /etc/nagios2/conf.d/hosts/hostname.cfg dove hostname va sostituito con l'hostname dell'host definito.
I Servizi
I servizi vengono utilizzati per definire un controllo su un servizio presente su un determinato host. Possono essere associati ad un determinato host (utile per controlli specifici) oppure ad un hostgroup (utile per controlli generici o comunque monitoraggio di servizi standard).
Un servizio ha, normalmente, la seguente struttura:
define service{ use generic-service host_name localhost service_description Disk Space check_command check_all_disks!20%!10% }
Dove vengono usati i seguenti parametri:
- use <service-template>
- indica il template da utilizzare. Il template contiene tutti i parametri necessari per la configurazione del servizio. In caso di necessità, comunque, è possibile sovrascrivere un parametro presente nel template semplicemente ridefinendolo all'interno del servizio.
- host_name <hostname>
- l'hostname specificato nella configurazione dell'host di cui si vuole monitorare il servizio
- service_description <description>
- la descrizione umana del servizio
- check_command <command>
- il comando da utilizzare per eseguire il controllo del servizio.
L'esempio sopra riportato associa il servizio ad un determinato host, ma è possibile associarlo ad un hostgroup, sostituendo la voce host_name
con hostgroup_name
.
Per i servizi verrà adottata la seguente convenzione:
- se il servizio è dedicato ad un singolo host, viene inserito all'interno del file di configurazione dell'host
- se il servizio è dedicato ad un hostgroup, invece, verrà inserito all'interno del file di definizione dell' hostgroup.
I Comandi
I comandi rappresentano i mattoni su cui costruire i check dei sistemi. Essi possono essere specifici (ad esempio il check di funzionamento di un server IMAP) o generici (come il test dell'apertura di una porta TCP).
I comandi base sono definiti in /etc/nagios2/commands.cfg
, mentre quelli installati tramite i plugin (i pacchetti nagios-plugins*) sono contenuti in /etc/nagios-plugins/config/
.
La sintassi per la definizione di un comando è la seguente:
define command{ template <templatename> name <objectname> command_name <commandname> command_line <commandline> }
Dove:
- template <templatename>
- permette di caricare un template (cioè un'altra definizione di comando da cui attingere i valori opzionali)
- command_name <commandname>
- il nome (univoco) del comando. Per convenzione, non potendo inserire spazi all'interno del nome, sostituiremo quest'ultimi con dei -.
- command_line <commandline>
- il percorso completo del comando (script o eseguibile) da lanciare, con gli eventuali parametri specificati.
Utilizzare quelli esistenti
Carpire il corretto utilizzo dei comandi può essere, a volte, un po' complesso. Per capire come utilizzare quelli definiti, possiamo adottare la seguente strategia:
- identifichiamo il percorso completo del comando da eseguire. In questo esempio ci riferiremo ai comandi contenuti in
/etc/nagios-plugins/config/http.cfg
. Il path del comando che viene richiamato è/usr/lib/nagios/plugins/check_http
. - visualizziamo l'output dell'help del comando:
# /usr/lib/nagios/plugins/check_http -h check_http (nagios-plugins 1.4.5) 1.96 Copyright (c) 1999 Ethan Galstad <nagios@nagios.org> Copyright (c) 1999-2006 Nagios Plugin Development Team <nagiosplug-devel@lists.sourceforge.net> This plugin tests the HTTP service on the specified host. It can test normal (http) and secure (https) servers, follow redirects, search for strings and regular expressions, check connection times, and report on certificate expiration times. Usage: check_http -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>] [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth] [-f <ok | warn | critical | follow>] [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>] [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>] [-A string] [-k string] NOTE: One or both of -H and -I must be specified Options: -h, --help Print detailed help screen -V, --version Print version information -H, --hostname=ADDRESS Host name argument for servers using host headers (virtual host) Append a port to include it in the header (eg: example.com:5000) -I, --IP-address=ADDRESS IP address or name (use numeric address if possible to bypass DNS lookup). -p, --port=INTEGER Port number (default: 80) -4, --use-ipv4 Use IPv4 connection -6, --use-ipv6 Use IPv6 connection -S, --ssl Connect via SSL -C, --certificate=INTEGER Minimum number of days a certificate has to be valid. (when this option is used the url is not checked.) -e, --expect=STRING String to expect in first (status) line of server response (default: HTTP/1. If specified skips all other status line logic (ex: 3xx, 4xx, 5xx processing) -s, --string=STRING String to expect in the content -u, --url=PATH URL to GET or POST (default: /) URL to GET or POST (default: /) ,-P, --post=STRING URL encoded http POST data -N, --no-body Don't wait for document body: stop reading after headers. (Note that this still does an HTTP GET or POST, not a HEAD.) -M, --max-age=SECONDS Warn if document is more than SECONDS old. the number can also be of the form "10m" for minutes, "10h" for hours, or "10d" for days. -T, --content-type=STRING specify Content-Type header media type when POSTing -l, --linespan Allow regex to span newlines (must precede -r or -R) -r, --regex, --ereg=STRING Search page for regex STRING -R, --eregi=STRING Search page for case-insensitive regex STRING --invert-regex Return CRITICAL if found, OK if not -a, --authorization=AUTH_PAIR Username:password on sites with basic authentication -A, --useragent=STRING String to be sent in http header as "User Agent" -k, --header=STRING Any other tags to be sent in http header. Use multiple times for additional headers -L, --link=URL Wrap output in HTML link (obsoleted by urlize) -f, --onredirect=<ok|warning|critical|follow> How to handle redirected pages -m, --pagesize=INTEGER<:INTEGER> Minimum page size required (bytes) : Maximum page size required (bytes) -w, --warning=DOUBLE Response time to result in warning status (seconds) -c, --critical=DOUBLE Response time to result in critical status (seconds) -t, --timeout=INTEGER Seconds before connection times out (default: 10) -v, --verbose Show details for command-line debugging (Nagios may truncate output) Notes: This plugin will attempt to open an HTTP connection with the host. Successful connects return STATE_OK, refusals and timeouts return STATE_CRITICAL other errors return STATE_UNKNOWN. Successful connects, but incorrect reponse messages from the host result in STATE_WARNING return values. If you are checking a virtual server that uses 'host headers' you must supply the FQDN (fully qualified domain name) as the [host_name] argument. This plugin can also check whether an SSL enabled web server is able to serve content (optionally within a specified time) or whether the X509 certificate is still valid for the specified number of days. Examples: CHECK CONTENT: check_http -w 5 -c 10 --ssl www.verisign.com When the 'www.verisign.com' server returns its content within 5 seconds, a STATE_OK will be returned. When the server returns its content but exceeds the 5-second threshold, a STATE_WARNING will be returned. When an error occurs, a STATE_CRITICAL will be returned. CHECK CERTIFICATE: check_http www.verisign.com -C 14 When the certificate of 'www.verisign.com' is valid for more than 14 days, a STATE_OK is returned. When the certificate is still valid, but for less than 14 days, a STATE_WARNING is returned. A STATE_CRITICAL will be returned when the certificate is expired. Send email to nagios-users@lists.sourceforge.net if you have questions regarding use of this software. To submit patches or suggest improvements, send email to nagiosplug-devel@lists.sourceforge.net
- confrontiamo la definizione del comando con l'help appena ottenuto:
define command{ command_name check_http command_line /usr/lib/nagios/plugins/check_http -H $HOSTADDRESS$ -I $HOSTADDRESS$ }
in questo caso, si occuperà di controllare che ci sia un webserver funzionante sulla porta 80 dell'host di cui stiamo eseguendo il check ($HOSTADDRESS$
e $HOSTADDRESS$
sono delle Macro. Per approfondimenti consultare il paragrafo Le Macro).
Un altro esempio potrebbe essere il comando check_disk
, che ha la seguente definizione:
define command{ command_name check_disk command_line /usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ - p $ARG3$ }
In questo caso si tratta di un controllo locale (quindi viene effettuato sulla macchina su è installato Nagios), infatti non sono presenti le macro viste prima, ma al loro posto sono presenti $ARG1$
$ARG2$
e $ARG3$
, che rappresentano i parametri passati, all'interno della configurazione dei servizi. In questo caso, la prima opzione (-w
) imposta il livello di warning, la seconda (-c
) imposta la soglia critica e il terzo (-p
) indica la partizione su cui effettuare il controllo.
Quando andremo a richiamare il comando all'interno della definizione del servizio, lo faremo in questo modo:
define service{ use generic-service host_name localhost service_description Disk Space on /dev/hda1 check_command check_all_disks!20%!10%!"/dev/hda1" }
Com'è facilmente intuibile, il servizio controllerà la partizione /dev/hda1 ed andrà in stato di warning quando ci sarà meno del 20% di spazio disponibile, ed in stato di errore critico quando ce ne sarà meno del 10%.
I parametri sono separati da un ! e vanno indicati nell'ordine corretto ($ARG1$
indica il primo parametri, e così via...)!
Creare nuovi comandi
Per semplicità (e convenzione di questa guida) i comandi personalizzati verranno salvati in /etc/nagios2/conf.d/commands.cfg
in modo da non modificare il file di configurazione di default di Nagios (cosa che tornerà utile in caso di aggiornamenti e/o migrazioni).
I Gruppi di Host (hostgroup)
Un hostgroup è semplicemente un sistema per raggruppare più host in base a delle caratteristiche comuni (che spaziano dall'appartenenza ad una stessa sottorete all'erogazione di uno stesso tipo di servizio, ...).
Una definizione standard di hostgroup è la seguente:
define hostgroup { hostgroup_name http-servers alias HTTP servers members hostname1, hostname2 }
Con i seguenti parametri:
- hostgroup_name <hostgroupname>
- il nome (univoco e senza spazi) dell'hostgroup. Verrà utilizzato all'interno dei file di configurazione di nagios per fare riferimento a questo gruppo di host
- alias <alias>
- un nome comprensibile (una breve descrizione) del gruppo
- members <hostname1, hostname2>
- i membri (
members
) appartenenti al gruppo.members
ehostgroups
(visto in precedenza all'interno della sezione Gli Host hanno la stessa funzione, ma in più permettono di decidere come gestire l'assegnazione: tramitemembers
viene inserita la lista degli host che fanno parte del gruppo, quindi l'associazione avviene all'interno del file che definisce l'hostgroup; tramitehostgroups
l'associazione avviene all'interno del file di configurazione dell'host, in cui vengono indicati tutti i gruppi a cui appartiene. Personalmente ritengo più comodo il secondo metodo in quanto, in caso di rimozione di un host, col primo metodo bisognerebbe modificare tutti i file dei gruppi di cui l'host era membro, pena l'impossibilità di far ripartire nagios; inoltre, specificando tutti i gruppi a cui appartiene un host all'interno del proprio file di configurazione permette di avere sotto controllo l'appartenenza di uno specifico host ad un gruppo.
Per gli hostgroup si adotta la convenzione di inserirli nella directory /etc/nagios2/conf.d/hostgroups/
, specificando per ogni gruppo un file con la sintassi hostgroupname.cfg
.
I servizi dedicati a quell'hostgroup andranno, a loro volta, inseriti nel file di configurazione del gruppo di host, così come si è fatto per i servizi di un singolo host.
I Gruppi di Servizi
I Contatti
I Timeperiod
Le notifiche
Notifiche via e-mail
Notifiche via SMS (vodafone)
Notifiche via SMS (gateway)
Varie
Nagios Checker
Nagios Checker (Home Page) è una comoda estensione per Firefox che permette di monitorare, direttamente dal browser, lo stato delle nostre macchine. In caso di problemi verrà mostrato un avviso (in rosso) e verrà riprodotto un suono di allarme. Tramite l'estensione sarà possibile, inoltre, accedere direttamente alla pagina dell'host (o del servizio) che danno problemi per approfondire. Un must!
FAQ
Come posso aggiungere un altro utente a Nagios?
Per aggiungere un nuovo utente è necessario effettuare due passi:
1) creazione dell'account all'interno del file /etc/nagios2/htpasswd.users
# htpasswd /etc/nagios2/htpasswd.users nomeutente
2) Inserire l'utente appena creato all'interno della configurazione di Nagios. Per fare questo bisogna modificare il file /etc/nagios2/cgi.cfg
aggiungendo l'utente appena creato alle seguenti direttive (in base ai permessi che si vogliono dare al nuovo utente):
authorized_for_system_information=nagiosadmin authorized_for_configuration_information=nagiosadmin authorized_for_system_commands=nagiosadmin authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin #authorized_for_all_services=nagiosadmin,guest #authorized_for_all_hosts=nagiosadmin,guest authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin
Dopo le varie modifiche è necessario ricaricare la configurazione di nagios con un:
# /etc/init.d/nagios2 reload
Guida scritta da: MaXeR | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |