Nagios (anciennement appelé Netsaint) est une application permettant la surveillance système et réseau. Elle surveille les hôtes et services spécifiés, alertant lorsque les systèmes vont mal et quand ils vont mieux. C'est un logiciel libre sous licence GPL.
Le programme fonctionne uniquement sous UNIX/Linux, mais peut également surveiller des machines Windowstm.
Pour surveiller les services d'un serveur distant (HTTP, SSH, IMAP, POP3, SMTP, etc.), il suffit d'installer Nagios sur l'ordinateur local. Par exemple, il est installé sur le portable qui sert à notre présentation.
Chaque manière et gestionnaire de paquets installe les fichiers de configuration à des endroits très différents :
Nous nous en tiendrons à la configuration de Gentoo étant donné que c'est la distribution sur laquelle fonctionne cet ordi.
Pour surveiller l'état de santé d'une machine Windows ou Linux, il faut installer un logiciel sur la machine distante.
INSTALLATION
Selon les distributions, il y a quelques paquets à installer. Sous Gentoo :
Portage, le gestionnaire de paquets de Gentoo, créera un utilisateur nagios appartenant au groupe nagios. Mais il faut créer soi-même un groupe nagioscmd et y ajouter les utilisateurs apache et nagios.
Le fichier de configuration /etc/apache2/modules.d/99_nagios3.conf sera ajouté par Portage qui modifiera également le fichier /etc/apache2/httpd.conf pour qu'il y fasse référence. La documentation insiste aussi pour que l'on crée un utilisateur, appelons-le nagiosadmin, ainsi qu'un mot de passe pour qu'il puisse accéder aux pages Web qui seront créées par nagios. La commande à exécuter (sous root) est la suivante :
htpasswd -c /etc/nagios/auth.users nagiosadmin
Il suffit ensuite de redémarrer apache pour qu'il tienne compte de ces changements.
FICHIERS DE CONFIGURATION
Les fichiers de configuration se trouvent sous /etc/nagios. Il y en a plusieurs et ils portent tous l'extension .cfg. Le premier fichier à modifier est nagios.cfg, dont voici un extrait :
# LOG FILE
# This is the main log file where service and host events are logged
# for historical purposes. This should be the first option specified
# in the config file!!!
log_file=/var/nagios/nagios.log
# OBJECT CONFIGURATION FILE(S)
# These are the object configuration files in which you define hosts,
# host groups, contacts, contact groups, services, etc.
# You can split your object definitions across several config files
# if you wish (as shown below), or keep them all in a single config file.
# You can specify individual object config files as shown below:
cfg_file=/etc/nagios/objects/commands.cfg
cfg_file=/etc/nagios/objects/contacts.cfg
cfg_file=/etc/nagios/objects/timeperiods.cfg
cfg_file=/etc/nagios/objects/templates.cfg
# Definitions for monitoring the local (Linux) host
#cfg_file=/etc/nagios/objects/localhost.cfg
# Definitions pour surveiller clo et le backup
cfg_file=/etc/nagios/objects/clo.cfg
cfg_file=/etc/nagios/objects/clo3.cfg
# Definitions for monitoring a Windows machine (Ordi Nat)
cfg_file=/etc/nagios/objects/windows.cfg
# Definitions for monitoring a router/switch
#cfg_file=/etc/nagios/objects/switch.cfg
# Definitions for monitoring a network printer
#cfg_file=/etc/nagios/objects/printer.cfg
Le fichier resources.cfg indique les chemins de divers modules. Dans le cas qui nous occupe, il n'y en a qu'un seul, soit celui des plugins, et c'est suffisant pour l'instant.
On voit que le fichier nagios.cfg fait référence à d'autres fichiers qui se trouvent dans le répertoire /etc/nagios/objects. Ces fichiers sont tout aussi importants que le premier :
ls /etc/nagios/objects
clo.cfg commands.cfg printer.cfg timeperiods.cfg
contacts.cfg switch.cfg windows.cfg
clo3.cfg localhost.cfg templates.cfg
Dans le fichier contact.cfg, il faut inscrire l'adresse de courriel de l'administrateur du réseau, car c'est lui qui sera averti s'il y a un problème. Le fichier templates.cfg contient les définitions du fonctionnement de toutes les vérifications génériques utilisées par les autres fichiers de configuration. Voci un extrait du fichier templates.cfg :
# Linux host definition template - This is NOT a real host, just a template!
define host{
name linux-server ; The name of this host template
use generic-host ; This template inherits other values from the generic-host template
check_period 24x7 ; By default, Linux hosts are checked round the clock
check_interval 5 ; Actively check the host every 5 minutes
retry_interval 1 ; Schedule host check retries at 1 minute intervals
max_check_attempts 10 ; Check each Linux host 10 times (max)
check_command check-host-alive ; Default command to check Linux hosts
notification_period workhours ; Linux admins hate to be woken up, so we only notify during the day
; Note that the notification_period variable is being overridden from
; the value that is inherited from the generic-host template!
notification_interval 120 ; Resend notifications every 2 hours
notification_options d,u,r ; Only send notifications for specific host states
contact_groups admins ; Notifications get sent to the admins by default
register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
}
Le fichier commands.cfg :
Il définit les commandes excutées. Un extrait :
################################################################################
#
# SAMPLE HOST CHECK COMMANDS
#
################################################################################
# This command checks to see if a host is "alive" by pinging it
# The check must result in a 100% packet loss or 5 second (5000ms) round trip
# average time to produce a critical error.
# Note: Five ICMP echo packets are sent (determined by the '-p 5' argument)
# 'check-host-alive' command definition
define command{
command_name check-host-alive
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
}
################################################################################
################################################################################
#
# SAMPLE SERVICE CHECK COMMANDS
#
# These are some example service check commands. They may or may not work on
# your system, as they must be modified for your plugins. See the HTML
# documentation on the plugins for examples of how to configure command definitions.
#
# NOTE: The following 'check_local_...' functions are designed to monitor
# various metrics on the host that Nagios is running on (i.e. this one).
################################################################################
# 'check_local_disk' command definition
define command{
command_name check_local_disk
command_line $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
}
# 'check_local_load' command definition
define command{
command_name check_local_load
command_line $USER1$/check_load -w $ARG1$ -c $ARG2$
}
# 'check_local_procs' command definition
define command{
command_name check_local_procs
command_line $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
}
# 'check_local_users' command definition
define command{
command_name check_local_users
command_line $USER1$/check_users -w $ARG1$ -c $ARG2$
}
# 'check_local_swap' command definition
define command{
command_name check_local_swap
command_line $USER1$/check_swap -w $ARG1$ -c $ARG2$
Toutes ces commandes se trouvent (sous Gentoo 64-bits) dans le répertoire /usr/lib64/nagios/plugins/
On passe ensuite aux fichiers de configuration des machines que l'on veut surveiller : la machine locale et les serveurs et autres machines Windows.
Voici un extrait du fichier clo.cfg (le serveur du club), à commencer par les services :
###############################################################################
###############################################################################
#
# HOST GROUP DEFINITION -- ON DÉFINIT D'ABORD LE GROUPE AUQUEL LE SERVEUR APPARTIENT
#
###############################################################################
###############################################################################
# Define an optional hostgroup for Linux machines
define hostgroup{
hostgroup_name linux-servers ; The name of the hostgroup
alias Linux Servers ; Long name of the group
members clo, clo3 ; Comma separated list of hosts that belong to this group
}
###############################################################################
###############################################################################
define host{
use generic-host ; Inherit default values from a template
host_name clo ; The name we're giving to this host
alias Linux-gatineau ; A longer name associated with the host
address 192.168.2.2 ; IP address of the host
hostgroups linux-servers ; Host groups this host is associated with
max_check_attempts 10
contacts nagiosadmin
}
define service{
use generic-service ; Inherit default values from a template
host_name clo
service_description HTTP
check_command check_http
}
define service{
use generic-service ; Inherit default values from a template
host_name clo
service_description FTP
check_command check_ftp
}
define service{
use generic-service ; Inherit default values from a template
host_name clo
service_description SSH
check_command check_ssh
}
define service{
use generic-service ; Inherit default values from a template
host_name clo
service_description SMTP
check_command check_smtp
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
define service{
use generic-service ; Inherit default values from a template
host_name clo
service_description POP3
check_command check_pop
}
Comme on peut le voir ce sont tous des services "publics", que l'on pourrait même vérifier avec telnet. En fait, dans notre exemple, on pourrait ajouter les services IMAP, DNS, NTP, etc.
Nous venons de voir la partie facile de la configuration
NRPE
Voyons maintenant la partie plus difficile, soit la surveillance de l'état de santé des serveurs, c'est-à-dire leurs ressources. Pour vérifier cet état de santé, il faut installer un paquet qui s'appelle NRPE sur la machine distante Linux et NSClient++ pour une machine Windows. Nous ne verrons pas NSClient++ dans cette présentation. Nous nous attarderons plutôt à NRPE. Sous Gentoo et Ubuntu, NRPE peut s'installer à l'aide du gestionnaire de paquets. Il porte le nom de nagios-nrpe sous Gentoo, qui installera aussi les plugins. Évidemment, un fois installé, il faut le configurer, tant sur la machine distante que sur le serveur nagios local.
NRPE est en réalité un module qui permet d'exécuter les modules locaux de la machine nagios sur la machine distante et un démon sur la machine distante, à l'écoute des demandes de connexion. En fait, il doit être installé sur les deux machines parce qu'il contient la commande "check_nrpe" qui, une fois exécutée, contacte le démon NRPE de la machine distante et lui demande d'exécuter les vérifications demandées.
Configuration
Le fichier de configuration de NRPE est le suivant : /etc/nagios/nrpe.cfg. Nous sommes sur la machine distante.
Au départ, on se contente d'y modifier une seule ligne, en y ajoutant l'adresse IP de l'ordi nagios :
allowed_hosts=127.0.0.1,192.168.1.20 par exemple.
Mais ce n'est pas tout. Il faut inscrire une entrée pour NRPE dans le fichier /etc/services :
nrpe 5666/tcp # NRPE
Il faut ensuite ouvrir le port 5666 sur le pare-feu pour que la communication se fasse entre les deux ordis. On peut maintenant faire démarrer le démon nrpe :
/etc/init.d/nrpe start
Et voir s'il est à l'écoute à l'aide de la commande netstat -at | grep nrpe, ce qui devrait donner :
tcp 0 0 *:nrpe *:* LISTEN
Sinon, il y a un problème à corriger. On peut ensuite lancer une commande directement pour voir si ça fonctionne. Il est à noter que le plugin check_nrpe se trouve dans le répertoire /usr/lib/nagios/plugins. La commande sera donc la suivante :
/usr/lib/nagios/plugins/check_nrpe -H localhost
On obtient en réponse la version de NRPE, soit NRPE v2.12 dans le cas qui nous occupe.
On pourra aussi essayer les commandes internes de la machine distante :
/usr/lib/nagios/plugins/check_nrpe -H localhost -c check_users
Ce qui devrait nous donner quelque chose comme ceci :
USERS OK - 1 users currently logged in |users=1;5;10;0
Si tout fonctionne, on peut retourner sur la machine locale pour une dernière séance de configuration. Mais auparavant, jetons un dernier coup d'œil sur le fichier nrpe.cfg de la machine distante. Vers la fin de celui-ci sont définies certaines commandes dont il faudra s'inspirer pour la configuration de la machine locale (nagios) :
# The following examples use hardcoded command arguments...
command[check_users]=/usr/nagios/libexec/check_users -w 5 -c 10
command[check_load]=/usr/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
command[check_hda1]=/usr/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1
command[check_hda3]=/usr/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda3
command[check_hda5]=/usr/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda5
command[check_hda7]=/usr/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda7
command[check_hda8]=/usr/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda8
command[check_zombie_procs]=/usr/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/nagios/libexec/check_procs -w 150 -c 200 RSZDT
command[check_swap]=/usr/nagios/libexec/check_swap -w 20% -c 10%
L'élément command[check_xxxxx] est important à retenir, car il sera utilisé sur l'ordi nagios (machine locale) où il y aura deux fichiers à modifier : commands.cfg et clo.cfg (encore). Après, ce sera terminé et il ne restera qu'à relaxer et à admirer le fonctionnement des deux machines.
Le fichier clo.cfg
# Partition home
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Partition home
check_command check_nrpe!check_hda3
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
# Partition racine
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Partition racine
check_command check_nrpe!check_hda5
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
# Partition /usr
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Partition usr
check_command check_nrpe!check_hda7
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
# Partition /var
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Partition var
check_command check_nrpe!check_hda8
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
# Nombre d'utilisateurs
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Current Users
check_command check_nrpe!check_users
}
# Processus zombies
define service{
use generic-service ; Name of service template to use
host_name clo
service_description Processus zombies
check_command check_nrpe!check_zombie_procs
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options w,c,r
}
Bref, on peut comprendre le principe. Il ne reste plus qu'à modifier commands.cfg.
Le fichier commands.cfg
La modification est relativement simple. Il suffit d'y ajouter les lignes suivantes :
# Verification de l'état de la machine distante
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ $ARG2$
}
et le tour est joué. On recharge la configuration de nagios :
/etc/init.d/nagios reload
Et voilà, maintenant on peut aller voir le résultat sur notre page Web en tapant "http://localhost/nagios/" dans le navigateur.