Accueil > Trucs & Astuces > Monitoring > Nagios & Cie.

Nagios & Cie.

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 ont des dysfonctionnements et quand ils repassent en fonctionnement normal. C'est un logiciel libre sous licence GPL.

C'est un programme modulaire qui se décompose en trois parties :

  1. Le moteur de l'application qui vient ordonnancer les tâches de supervision.
  2. L'interface web, qui permet d'avoir une vue d'ensemble du système d'information et des possibles anomalies.
  3. Les plugins, une centaine de mini programmes que l'on peut compléter en fonction des besoins de chacun pour superviser chaque service ou ressource disponible sur l'ensemble des ordinateurs ou éléments réseaux du SI.

(source Wikipedia)

NRPE

NRPE (Nagios Remote Plugin Executor) est un "Addons" pour Nagios qui permet d'exécuter des greffons (plugins) sur un serveur (Linux/Unix ou Windows) distant. Cela permet de surveiller des ressources locales (charge du processeur, utilisation de la mémoire, espace disque...) qui ne sont normalement pas disponibles depuis d'autres machines.

(source Wikipedia)

NSClient ++

C'est un logiciel libre (encore !!) pour Microsoft Windows. Vous trouverez tous les détails sur le site officiel du soft. Il existe pour les plates-formes 32 et 64 bits.

Pour ma part, je l'installe sur des Windows 2003 et 2008 Server. Je m'en sers pour superviser :

  • la RAM
  • le CPU
  • l'UPTIME de la machine 
  • les disques durs (C, D....)
  • les programmes qui tournent en tâche de fond (antivirus, sauvegarde ...)
  • les services (DHCP ...)
  • l'état des RAIDs

Le principe est assez simple, avec la commande check_nt de Nagios, j'envoie une requête vers la machine Windows sur laquelle est installé NSClient++. Par défaut le port d'écoute de NSClient++ est le 12489. Mais ce port peut être changé. 

Quelques exemples de commandes Nagios pour communiquer avec NSClient++ :

# /usr/lib/nagios/plugins/check_nt -H '$HOSTADDRESS$' 
                  -p '$ARG1$' -s '$PASSWORD$' -v MEMUSE -w 75 -c 90 -t 60

Cette commande demande à NSClient++ sur la machine spécifiée (-H '$HOSTADDRESS$') de vérifier l'utilisation de la RAM (-v MEMUSE), de renvoyer une alerte jaune (warning => -w 75) si l'utilisation dépasse 75%, une alerte cririque/rouge si l'utilisation dépasse 90% (-c 90). Cette requête se fait sur un port particulier (-p '$ARG1$') et à la condition de fournir le bon mot de passe (-s '$PASSWORD$'). Le dernier paramètre est le 'timeout' en seconde. 

# /usr/lib/nagios/plugins/check_nt -H '$HOSTADDRESS$' -p '$ARG1$' 
                 -s neptune? -v USEDDISKSPACE -l '$ARG2$' -w 80 -c 90 -t 60

Cette commande demande à NSClient++ sur la machine spécifiée (-H '$HOSTADDRESS$') de vérifier l'utilisation de l'espace disque utilisé (-v USEDDISKSPACE), de renvoyer une alerte jaune (warning => -w 80) si l'utilisation dépasse 80%, une alerte cririque/rouge si l'utilisation dépasse 90% (-c 90). Cette requête se fait sur un port particulier (-p '$ARG1$') et à la condition de fournir le bon mot de passe (-s '$PASSWORD$'). Le dernier paramètre est le 'timeout' en seconde. Le paramètre qui n'a pas été décrit (-l '$ARG2$') est la lettre du lecteur Windows (C, D, E....).

Il faut bien noter que la commande check_nt fait parti des plugins de Nagios et que les réponses à ces commandes sont codées en dure dans NSClient++. C'est là qu'intervient NRPE qui permet d'excuter un programme/script de notre cru via NSClient++ à la demande de Nagios. 

Je ne vais pas m'étendre sur le sujet, mais en gros, Nagios demande quelque chose via la commande check_nrpe sur le port 5666 (celui par défaut), par exemple "ShowSerialNumber". La partie NRPE de NSClient++ reçoit donc ce paramètre ("ShowSerialNumber") et dans la configuration de NSClient++, il y a une instruction qui dit que lorsqu'on reçoit cette instruction, on exécute un programme dont on renvoie le résultat de l'exécution à Nagios.

Pour un détail et une explication complète voir la page suivante : documentation en anglais sur NRPE dans NSClient++.

NSClient++ & Bug(s)

Pour l'instant, le seul bug de NSClient++ est : lorsqu'il est installé sous un serveur Windows (2008) avec Hyper-V (hyperviseur de machines virtuelles Microsoft) ainsi que sur les machines virtuelles qu'il "hypervise", la RAM vu par NSClient++ sur la machine Hyper-V suit la logique, le calcul suivant : 

RAM_VUE = RAM_MACHINE_HYPERV + (RAM_VM1 + RAM_VM2 + ... + RAM_VMx)

En gros si j'ai une machine physique/hôte avec 12 Go de RAM, 2 VM avec 3 Go de RAM et 1 VM avec 4 Go de RAM, j'obtiens le résultat suivant :

12 + 3 +3 +4 = 22 Go de RAM juste pour Hyper-V ! Où sont mes 12 Go de départ ? Sachant que d'un autre coté je vois bien les 3 Go des deux autres machines et les 4 Go de la dernière.

Vous comprendrez que ça fausse les résultats. J'avoue également, que je n'ai pas chercher à corriger ou régler ce bug. 

Pour l'instant c'est le seul bug que j'ai pu constater. Je complèterais cette liste si j'en relève d'autre. 

Dernière précision

Soulignons pour finir, que superviser beaucoup de serveurs à travers Internet peut s'avérer très lourd en utilisant uniquement NSClient++ du coté supervisé et Nagios du coté superviseur. Chaque requête de Nagios pour connaitre l'état d'un "objet" (RAM, CPU, Disque, service, programme...) est véhiculée sur Internet et induit presque obligatoirement une réponse. Donc, si un client à plusieurs serveurs sur lesquels on supervise plusieurs "objets", cela crée autant de requêtes qu'il y a d'objets au total pour ce client. ENORME ! 

Pour enfoncer le clou, pour chaque serveur il faut ouvrir au moins un port dans le firewall pour accéder à NSClient++ qui fonctionne sur le dit serveur. Si un client à 10 serveurs, il faut ouvrir 10 ports dans le firewall. ENORME ! Surtout quand on sait le risque de sécurité que ça peut impliquer derrière. 

J'ai pu palier à ce problème en faisant une chose tout simple. J'ai installé chez le client un serveur Nagios en gardant toujours les NSClient++ sur les serveurs Windows. De mon coté, Nagios demande le statut global du Nagios distant en une seule requête et reçoit une seule réponse. Je n'ouvre alors plus qu'un seul port dans le firewall pour transférer la requête. Voir le chapitre suivant.