Nagios

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.

  • Permet de surveiller les services de l'ordinateur hôte et/ou d'un serveur distant
  • Permet de surveiller l'état de santé de l'ordinateur hôte et/ou d'un serveur ou ordinateur distant
  • Affiche  les résultats dans une page Web

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.

  • Peut s'installer à partir des sources (tarball)
  • Peut s'installer avec un gestionnaire de paquets (Synaptic pour Ubuntu, Portage pour Gentoo, etc.)

 

Chaque manière et gestionnaire de paquets installe les fichiers de configuration à des endroits très différents :

  • /usr/local/nagios/etc/   à partir des sources
  • /etc/nagios3/ (dernière version en date de cette présentation) sous Ubuntu
  • /etc/nagios/   sous Gentoo

 

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 :

  • nagios-core (le cœur du programme, démon de surveillance, fichiers CGI, doc)
  • nagios-imagepack (icones et images pour les pages Web de Nagios)
  • nagios-plugins (série de modules pour faire fonctionner nagios correctement)
  • nagios (métapaquet qui ira chercher les trois autres au moment de l'installation)

 

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.

Serveur en marche depuis 19 jours, 14 heures et 30 minutes