Nagios
Nagios
Nagios
4 Janvier 2019
Ressources documentaires :
1 La supervision : ....................................................................................................................................................... 1
2 Nagios : Les notions de base : ................................................................................................................................. 6
2.1 Historique : ..................................................................................................................................................... 6
2.2 Architecture : .................................................................................................................................................. 7
2.3 Les modes de supervision : ............................................................................................................................. 9
2.3.1 Les contrôles actifs : ................................................................................................................................ 9
2.3.2 Les contrôles passifs :............................................................................................................................ 10
2.4 Rôle des agents : ........................................................................................................................................... 10
2.4.1 NRPE :.................................................................................................................................................... 11
2.4.2 SSH : ...................................................................................................................................................... 14
2.4.3 SNMP : .................................................................................................................................................. 15
2.4.4 NSClient++ : ........................................................................................................................................... 17
2.5 Types d’état SOFT et HARD : ......................................................................................................................... 18
2.6 Données à définir dans Nagios : .................................................................................................................... 22
2.6.1 Arguments, macros et variables d’environnement : ............................................................................. 23
2.6.2 Commande de vérification : .................................................................................................................. 24
2.6.3 Commande de notification : .................................................................................................................. 25
2.6.4 Hôtes : ................................................................................................................................................... 25
2.6.5 Les services : ......................................................................................................................................... 26
2.6.6 Les contacts : ......................................................................................................................................... 27
2.6.7 Groupe de contacts : ............................................................................................................................. 29
2.6.8 Durée et fréquence des checks : ........................................................................................................... 29
2.6.9 Relation parent/enfant : ....................................................................................................................... 32
2.7 Les périodes de temps : ................................................................................................................................ 35
2.8 NSClient++ .................................................................................................................................................... 37
3 Nagios : Configuration .......................................................................................................................................... 47
3.1 Installation : .................................................................................................................................................. 47
3.2 Les fichiers de configuration : ....................................................................................................................... 48
3.2.1 Configuration de Nagios: nagios.cfg ...................................................................................................... 48
3.2.2 Configuration des CGI: cgi.cfg ............................................................................................................... 49
3.2.3 Ressources : .......................................................................................................................................... 49
3.2.4 Commandes : ........................................................................................................................................ 50
3.2.5 Hôtes : ................................................................................................................................................... 67
3.2.6 Services : ............................................................................................................................................... 68
3.2.7 Contacts : .............................................................................................................................................. 69
3.2.8 Groupe de contacts : ............................................................................................................................. 69
3.3 Diagramme des objets Nagios :..................................................................................................................... 70
4 Etude de cas : ........................................................................................................................................................ 71
1 La supervision :
Les objectifs de la supervision, les techniques disponibles :
Les systèmes informatiques d'entreprises associent une diversité de services (routage,
messagerie, proxy, serveur Web, services de fichiers et d'impressions, ...) à plusieurs types
de réseaux (LAN, Intranet, DMZ, Internet, ...). La disponibilité et le bon fonctionnement de
chaque machine et logiciel participant à cet ensemble ont besoin d'être vérifiés
régulièrement.
Des logiciels, les moniteurs, existent afin d'automatiser la vérification des systèmes
informatiques. Ces outils ne fonctionnent pas tous sur le même principe (par exemple tester
les services, interroger ces services sur leurs états, ou attendre une éventuelle alerte émise
par le service). Par ailleurs, l'outil de supervision ne doit pas remettre en cause
l'architecture: il supervise dans les meilleures conditions toutes les machines du réseau sans
l'affaiblir, c’est-à-dire qu'il assure la sécurité tout en absorbant la montée en charge.
Le cycle d'intervention peut être grandement réduit par le biais de la supervision: dans le
cas d'une panne avérée, le système prévient automatiquement l'équipe concernée, la
réparation s'effectue alors avant même que l'utilisateur ne se soit aperçu du problème;
d'autre part dans le cas d'une fausse alerte (erreur de manipulation de l'utilisateur), le
système de supervision s'assure du bon fonctionnement de tous les équipements d'un coup
d’œil. Enfin, l'archivage des informations sur l'état des systèmes au cours du temps est une
source d'information pour l'analyse "post mortem" d'un incident.
Fonctionnement :
o Les agents :
Sur une machine à superviser, pour que SNMP envoie les informations que l'on
souhaite il faut qu'un agent soit installé sur celle-ci. Cet agent écoute sur le port 161
et attend que le serveur lui envoie des requêtes pour lui répondre.
L'agent pourra aussi envoyer des alertes lui-même si l'administrateur l'a configuré. Par
exemple pour surveiller l'occupation CPU l'administrateur définira une valeur critique
pour laquelle une alerte doit lui être émise.
Pour finir l'agent pourra aussi agir sur l'environnement local. C'est pourquoi ce
protocole est critique car il peut servir a d'autres personnes mal intentionnées pour
prendre le contrôle a distance de certains équipements sur le réseau.
o Structure de la MIB :
La structure de la MIB est hiérarchique : les informations sont regroupées en arbre.
Chaque information a un OID (Object identifier), une suite de chiffres séparés par des
points, qui l'identifie de façon unique et un nom, indiqué dans le document qui décrit
la MIB.
Par exemple, 1.3.6.1.2.1.2.2.1.2 est l'OID ifDescr qui est la chaîne de caractères
décrivant une interface réseau (comme eth0 sur Linux ou Ethernet0 sur un routeur
Cisco).
Echange de message
Le protocole SNMP est principalement utilisé avec UDP/IP. (Il peut aussi utiliser TCP).
L’utilisation d’UDP permet un échange de message plus rapide que l’utilisation de TCP.
L’inconvénient est qu’il est possible de perdre des trames lors de l’échange de
messages (mode non connecté). Les ports UDP sont donc le 162 pour le manager et le
161 pour les agents.
Solutions applicatives :
Pour simplifier le travail de supervision et ne pas être dépendant du protocole SNMP, les
logiciels de supervisions développent souvent un protocole ou un agent particulier pour
leur solution (NRPE pour Nagios, agent zabbix, etc.).
2.1 Historique :
L’histoire d’un outil peut nous en apprendre beaucoup sur lui.
Nagios est développé par Ethan Galstad et débute son histoire en 1999 sous le nom de
NetSaint. Quelque temps plus tard, à cause d’un problème de propriété intellectuelle sur le
nom, il devient Nagios. Actuellement en version 4.1.1, il a plus de dix-sept ans d’existence.
Il a évolué depuis ses tous débuts afin de s’adapter à des parcs de plus en plus importants,
tout en améliorant ses performances et ses capacités de gestion de configuration.
2.2 Architecture :
Nagios est un simple programme écrit en langage C. Si on exclut la partie interface web de
visualisation, il ne fait pas plus de 60 000 lignes de code, ce qui est assez faible pour un outil
d’une telle renommée.
Le Cœur :
Le cœur de Nagios consiste avant tout en un moteur d'ordonnancement. Cet ordonnanceur
gère le séquencement des vérifications, ainsi que des événements, tels que les alertes, les
escalades (notifications progressives en fonction du temps) et les actions correctives. Il est
important d’étaler au maximum les vérifications pour lisser la charge qui risque d’être trop
importante pour que les sondes aillent au bout de leurs tâches. (cf. annexe : pour plus
d’information sur l’étalement des vérifications)
Base de données :
Permet d’enregistrer des événements, les données de performances relatives aux contrôles
et aux plugins. Dans le cas d’instances multiples de Nagios, cette base de données permet
de centraliser leurs informations.
L’Interface Web :
C’est une interface graphique qui permet d’avoir une visualisation complète des hôtes et
ressources supervisés. De plus, il est possible de gérer une partie de la configuration via cette
interface.
Pour lancer cette vérification, Nagios se dédouble et l’un des deux Nagios résultant lance la
commande demandée. Il peut fournir à la commande des arguments particuliers, afin que
celle-ci interroge le bon hôte distant. Une fois que le plug-in a l’information, il la traite et
décide si elle est correcte ou non. Il renvoie enfin le résultat au premier Nagios.
2.4.1 NRPE :
NRPE est l’agent déployé classiquement sur les serveurs de type Unix. Il signifie « Nagios
Remote Process Executor » (exécuteur distant de processus Nagios). Il permet à Nagios
d’exécuter à distance des plug-ins déposés par l’administrateur.
Comme Nagios, NRPE ne sait lui-même rien faire. Les plug-ins déposés sont identiques à ceux
présents sur le serveur de supervision. NRPE sert d’intermédiaire entre Nagios et ces sondes.
Nagios lance comme plug-in, sur son serveur, l’exécutable check_nrpe. Celui-ci envoie une
requête de supervision à l’agent NRPE. Elle correspond à une entrée dans la configuration de
l’agent. Cette entrée contient un script à lancer, avec ses arguments. Le démon lance le plug-
in et retourne le résultat à check_nrpe. Ce résultat est composé du code retour du plug-in et
des lignes de sortie, comme n’importe quelle sonde Nagios. L’exécutable check_nrpe
transmet tout simplement ces informations à Nagios.
Nous pouvons également noter que la communication entre check_nrpe et le démon
NRPE se fait à travers un flux SSL. Il n’y a donc pas de risque qu’un pirate récupère des
données sensibles. Le diagramme suivant résume ce fonctionnement.
Définition standard
command[load]=/usr/local/nagios/libexec/check_load -w 1,1,1 -c 2,2,2
Lancement de NRPE
/usr/local/nagios/bin/nrpe -d -c /usr/local/nagios/etc/nrpe.cfg
NRPE s’exécute sous l’identité de l’utilisateur spécifié dans son fichier de configuration, à
condition que celui-ci ne soit pas root. En effet, dans ce cas, il ne se lance pas.
On utilise généralement un compte non privilégié nommé nagios.
Exemple d’interrogation
Depuis le serveur Nagios, on lance la commande check_nrpe avec comme paramètres l’hôte
sur lequel est lancé NRPE, ainsi que la commande désirée (en l’occurrence, la commande
référencée par check_load). Plaçons-nous tout d’abord dans la situation où l’utilisateur ne
peut pas fournir d’arguments à la commande :
Interrogation de l’agent NRPE
check_nrpe -H srv-web1 -c load
OK - Charge moyenne: 0.51, 0.28, 0.28|load1=0.510;1.000;2.000;0;
load5=0.280;1.000;2.000;0; load15=0.280;1.000;2.000;0;
echo $?
0
Dans le cas où l’on peut fournir des arguments, nous avons :
Interrogation avec arguments
check_nrpe -H srv-web1 -c load -a 1,1,1 2,2,2
OK - Charge moyenne: 0.29, 0.36, 0.31|load1=0.290;1.000;2.000;0;
load5=0.360;1.000;2.000;0; load15=0.310;1.000;2.000;0;
echo $?
0
2.4.2 SSH :
Lancement de commandes à travers SSH
NRPE permet de lancer des commandes à distance, ce qui peut également être réalisé grâce
à SSH. Ce protocole permet de lancer une commande sur un serveur distant.
De plus, le code retour et les messages de sortie sont conservés à travers l’utilisation de SSH.
Si nous reprenons notre exemple précédent en utilisant SSH, nous obtenons :
Résultat
OK - Charge moyenne: 0.25, 0.35, 0.35|load1=0.250;1.000;2.000;0;
load5=0.350;1.000;2.000;0; load15=0.350;1.000;2.000;0;
echo $?
0
Nous obtenons le même résultat que si nous l’avions lancé à travers NRPE.
Problème de l’authentification
Cette méthode présente un problème : le serveur distant demande une identification.
Lorsqu’on fait des des tests, on peut saisir un mot de passe ; ce n’est pas le cas si la commande
est lancée par Nagios. Là encore, le protocole SSH propose une solution.
Il est possible d’utiliser une méthode d’authentification par chiffrement asymétrique.
Sans entrer dans le détail, l’utilisateur crée deux clés liées :
• une publique, qu’il peut fournir à volonté ;
• une privée, qu’il doit garder jalousement.
La clé privée peut déchiffrer des messages codés avec la clé publique de l’utilisateur.
Si un serveur envoie un message aléatoire chiffré avec la clé publique d’un utilisateur, seul ce
dernier peut retrouver le message original grâce à sa clé privée. Cela permet d’authentifier
formellement un utilisateur.
Pour générer les clés, on utilise la commande ssh-keygen :
Génération de clés pour SSH
ssh-keygen -t rsa
Lorsque le programme demande une passphrase, il faut la laisser vide. Il s’agit d’un mot de
passe chiffrant la clé privée. Nous ne pouvons pas l’utiliser ici car il faudrait la saisir à chaque
fois que l’on utilise la clé, ce qui n’est pas possible au sein de Nagios.
M. T. Ait Messaoud| Administration et supervision sous Nagios Page 14
Cette commande génère les deux clés. La clé privée est ~/.ssh/id_rsa, la publique
~/.ssh/id_rsa.pub.
Il faut déployer la clé publique sur le serveur distant. Nous utilisons pour cela le programme
ssh-copy-id qui facilite grandement la tâche :
2.4.3 SNMP :
Il est presque impossible de trouver un élément réseau sur lequel on peut installer les
applications que l’on souhaite. Ce sont de véritables boîtes noires. La mise en place de NRPE
étant impossible, voyons comment les superviser.
2.4.4 NSClient++ :
Un client un peu particulier est disponible sur les environnements Windows. Il regroupe en
son sein un agent NRPE et des informations déjà exportées, comme le fait SNMP.
Il est basé sur des modules sous forme de DLL. L’un d’entre eux porte le nom NRPE. Il est
utilisé comme agent du même nom au sein de NSClient++. Tout comme pour son pendant
Unix, il ne dispose pas, par défaut, de sonde. L’administrateur doit lui en fournir.
D’autres modules exportent nativement des données. On peut dresser la liste des principales,
qui permettent de faire un rapide tour de l’état du système.
• espace disque ;
• utilisation des processeurs ;
• utilisation de la mémoire ;
• état des services.
Deux clients sont utilisés :
• check_nrpe pour les exécutables lancés par l’agent ;
• check_nt pour les interrogations des autres modules.
Mise en place
L’agent possède un exécutable d’installation. Il s’installe par défaut dans le répertoire
C:\Program Files\NSClient++. Pour ceux qui souhaitent automatiser l’installation, il suffit de
déposer les fichiers de l’agent dans un répertoire et de lancer la commande suivante :
Installation de NSClient++
NSClient++ /install
Pour le démarrer, il suffit de lancer le service du même nom.
Le module NRPE écoute sur le port classique 5666/TCP. Les autres modules sont sur le port
12489/TCP.
Paramètres de sécurité
[Settings]
password=superpassword
allowed_hosts=192.168.0.2
use_file=1
Le paramètre use_file permet de signaler à NSClient++ de prendre ses paramètres dans le
fichier de configuration plutôt que dans la base de registre. Cette dernière utilisation est à
éviter, à la fois du point de vue de la facilité d’administration et pour unifier l’administration
des différents agents sous Windows et sous Unix.
Notifications de problèmes
Continuons notre étude avec les notifications.
Renvoi de notifications
Une fois que l’état est validé, en phase HARD, Nagios notifie les contacts s’ils le souhaitent.
Cette notification intervient dès le passage en état HARD. L’utilisateur peut, avec le paramètre
notification_interval, spécifier à Nagios l’intervalle de temps entre deux notifications. La
notification est relancée tant que l’état n’est pas redevenu UP ou OK.
Lorsque l’état revient à la normale et si l’utilisateur l’a décidé dans le paramètre
notification_options, Nagios envoie une alerte de recovery pour les services, d’UP pour les
hôtes. Ce paramètre doit être supérieur à la valeur check_interval. Si cette valeur était
inférieure, Nagios enverrait une notification alors qu’il n’a pas re-vérifié l’état de l’élément,
ce qui n’est pas logique. La seule exception est la valeur 0 : elle signifie de n’envoyer qu’une
seule notification pour le problème.
Exemple d’ordonnancement des notifications
Si nous positionnons les paramètres comme ceci, nous obtenons le comportement du
diagramme suivant.
notification_interval 8
notification_options w,c,r
Nous remarquons qu’à t = 19 min une notification d’alerte critique est envoyée. Elle
correspond au passage en état HARD. 8 minutes après, à t = 27 min, vu que le service est
toujours en état CRITICAL, une autre notification est levée. Pour finir, une dernière
notification est envoyée à t = 29 min. C’est une notification recovery de service.
Nous remarquons dans le paramètre notification_options le champ r : l’administrateur
souhaite donc qu’une telle notification soit envoyée.
lors de la levée de la notification de recovery (option r), le contact ne reçoit pas l’information.
De même, si c’est l’inverse qui est configuré :
notification_options w,c
sur le service et :
notification_options w,c,r
sur le contact, la notification de recovery n’étant pas levée par le service, le contact ne la
reçoit pas.
define type{
parametre1 valeur1 ;commentaire
parametre2 valeur2
}
Nous avons vu que nous pouvons passer des arguments aux commandes. Ces arguments
peuvent être utilisés avec les macros $ARGn$ définies dans les commandes, qu’il s’agisse de
commandes de vérification ou de notification. Si l’on souhaite utiliser des arguments, on doit
appeler la commande de la manière suivante :
check_command check_tcp!80!5
Il n’est cependant pas souhaitable de tout faire passer par des arguments. Si l’on souhaite
donner à la commande, par l’intermédiaire d’une variable, l’adresse réseau de l’élément
surveillé, il faut réécrire l’adresse de l’hôte à tester dans l’appel de la commande par le
service. C’est dommage car l’information est déjà définie dans l’élément host auquel on
rattache le service. Nagios permet à la commande de prendre directement l’information
qu’elle souhaite à la source.
Macros :
Nous remarquons que la macro $USER1$ est utilisée. Elle est définie dans le fichier
ressources.cfg. L’utilisateur peut définir 32 macros $USERn$. La plus commune est $USER1$,
qui représente en fait le répertoire dans lequel sont placés les scripts de supervision,
généralement /usr/local/nagios/libexec/. Ceci évite de saisir le répertoire à chaque définition
de commande.
À l’appel de la commande avec le paramètre !80, sur un hôte ayant comme adresse
192.168.0.1, Nagios lance en fait la commande :
Variables d’environnement :
Il y a une différence entre une commande lancée directement depuis un shell et la même
commande lancée depuis Nagios : l’environnement. Sur le serveur de supervision, Nagios est
exécuté par un utilisateur non privilégié, généralement nommé nagios. Lorsqu’il lance une
commande, Nagios retire les variables d’environnement de l’utilisateur et positionne les
siennes : les macros. Il n’est pas nécessaire de passer une macro en argument si le programme
lancé est capable de la récupérer dans ses variables d’environnement.
Il n’est pas conseillé de fonctionner de cette manière, ne serait-ce que par souci de lisibilité
des commandes lancées. De plus, ces commandes sont plus compliquées à tester
directement depuis un shell, car il faut positionner correctement les variables
d’environnement avant de les lancer.
La variable PATH du shell n’est pas positionnée. Les sondes doivent utiliser des chemins
absolus si elles souhaitent lancer des programmes. Ceci est une cause fréquente de
problèmes lors des tests. Un programme de vérification peut très bien fonctionner en ligne
de commande et beaucoup moins bien dans Nagios, tout simplement car il souhaite utiliser
la variable PATH qui n’est pas positionnée.
2.6.4 Hôtes :
Également nommés hosts, nœuds ou ressources, ce sont les éléments que Nagios supervise.
Dans le cadre de la supervision système, c’est le serveur à surveiller ; pour la supervision
réseau, il peut s’agir d’un switch. En cas de problème, il alerte un ou plusieurs contacts. Ces
derniers seront étudiés un peu plus loin dans ce chapitre.
Cet élément est la base de la supervision dans Nagios.
define timeperiod {
timeperiod_name misc-single-days
alias Misc Single Days
1999-01-28 00:00-24:00 ; January 28th, 1999
monday 3 00:00-24:00 ; 3rd Monday of every month
day 2 00:00-24:00 ; 2nd day of every month
february 10 00:00-24:00 ; February 10th of every year
february -1 00:00-24:00 ; Last day in February of every year
friday -2 00:00-24:00 ; 2nd to last Friday of every month
thursday -1 november 00:00-24:00 ; Last Thursday in November of every year
}
define timeperiod {
timeperiod_name misc-date-ranges
alias Misc Date Ranges
2007-01-01 - 2008-02-01 00:00-24:00 ; January 1st, 2007 to February 1st, 2008
monday 3 - thursday 4 00:00-24:00 ; 3rd Monday to 4th Thursday of every month
day 1 - 15 00:00-24:00 ; 1st to 15th day of every month
day 20 - -1 00:00-24:00 ; 20th to the last day of every month
july 10 - 15 00:00-24:00 ; July 10th to July 15th of every year
april 10 - may 15 00:00-24:00 ; April 10th to May 15th of every year
tuesday 1 april - friday 2 may 00:00-24:00 ; 1st Tuesday in April to 2nd Friday in -
May of every year
}
define timeperiod {
timeperiod_name misc-skip-ranges
Exemple de configuration :
define host {
host_name Imprimante
parents Switch
}
define host {
host_name Switch
parents Routeur
}
define host {
host_name Routeur
parents Serveur Nagios
}
define host {
host_name Serveur DNS
parents Routeur 2, Routeur 3
}
define host {
host_name Serveur HTTP
parents Routeur 2, Routeur 3
}
define host {
host_name Routeur 2
parents Routeur 1
}
Exemples de réseaux :
define host {
host_name Nagios ; <-- The local host has no parent - it is the topmost host
}
define host {
host_name Switch1
parents Nagios
}
define host {
host_name Web
parents Switch1
}
define host {
host_name FTP
parents Switch1
}
define host {
host_name Router1
parents Switch1
}
define host {
host_name Switch2
parents Router1
Réseau 2 :
Comment les périodes de temps fonctionnent avec les contrôles des hôtes et des services :
Les définitions des hôtes et des services ont un paramètre optionnel check_period qui vous
permet de spécifier la période qui sera utilisée pour restreindre les moments où les contrôles
actifs des hôtes ou des services devront être effectués.
Si vous n'utilisez pas le paramètre check_period pour spécifier une période, Nagios sera
capable de planifier les contrôles actifs des hôtes et services aussi souvent qu'il en aura
besoin. Il s'agit essentiellement d'une période de surveillance de type 24x7.
Spécifier une plage horaire dans le paramètre check_period vous permet de restreindre
Nagios à planifier les contrôles actifs réguliers des hôtes ou des services. Quand Nagios va
tenter de replanifier un contrôle d'hôte ou de service, il va s'assurer que le prochain contrôle
tombe bien dans la plage horaire définie. Si ce n'est pas le cas, Nagios va ajuster l'heure du
prochain contrôle pour qu'elle coïncide avec la prochaine heure valide dans la plage horaire
spécifiée. Ce qui signifie que l'hôte ou le service ne sera contrôlé à nouveau que dans
plusieurs heures, jours, semaines, etc.
Note
Les contrôles à la demande et les contrôles passifs ne sont pas restreints par la plage horaire
spécifiée dans le paramètre check_period. Seuls des contrôles réguliers actifs sont
concernés.
Sauf si vous avez une bonne raison de ne pas le faire, je vous conseille de surveiller tous les
hôtes et les services en utilisant des plages horaires qui couvrent une période de temps 24x7.
Si vous ne le faites pas, vous pouvez rencontrer certains problèmes au cours de ces périodes
de non-contrôle (lorsque l'on ne se trouve pas dans la plage horaire définie) :
1. Le statut de l'hôte ou du service apparaîtra inchangé tout au long de la période de non-
contrôle.
2. Les contacts ne seront pas re-notifiés des problèmes avec un hôte ou un service durant
une période de non-contrôle.
3. Si un hôte ou un service redevient OK pendant une période de non-contrôle, les contacts
ne seront pas immédiatement notifiés du retour à normale.
Les escalades de notification des hôtes et services ont un paramètre optionnel nommé
escalation_period qui vous permet de spécifier une plage horaire où l'escalade sera valide et
pourra être utilisée.
Si vous n'utilisez pas le paramètre escalation_period dans la définition de l'escalalde,
l'escalade sera considérée comme valide tout le temps. Si vous spécifiez une plage horaire
pour le paramètre escalation_period, Nagios utilisera définition de l'escalade seulement
pendant cette plage horaire.
2.8 NSClient++
NSClient++ est un service pour toutes versions de Windows (NT, 2000, 2003, XP et Vista) qui
combine les fonctionnalités d’un agent de supervision dédié à l’environnement Windows
ainsi que les fonctions de transport NRPE et NSCA pour cet environnement. Il est disponible
en version 32 et 64 bits. Du fait de ces triples fonctions, le fichier de configuration de
NSClient++ est assez long mais également assez simple. Il est aujourd’hui considéré comme
l’agent de supervision standard Nagios pour plateformes Windows.
L’installation de NSClient++ ne pose pas de problème grâce au format d’installation .msi
fourni. Il suffit de valider par le bouton next chacun des écrans présentés. Le logiciel est
installé par défaut dans le répertoire C:\Program Files\NSClient++. Il contient le fichier
exécutable de service nsclient++, le répertoire modules contenant les extensions de
NSClient++ et le fichier de configuration NSC.ini. Une entrée dans le menu Démarrer est
COUNTER
Permet d’interroger n’importe quel compteur de performance sur Windows
NT/2000. Requiert le paramètre l avec la syntaxe suivante
-l ”<objet performance>counter”,”<description>.
La logique d’utilisation est toujours la même avec l’utilisation du paramètre -l qui permet de
préciser les valeurs à interroger. Voici quelques exemples permettant de contrôler les
aspects système habituels d’une machine Windows.
define command{
command_name check_nt
command_line $USER1$/check_nt -H $HOSTADDRESS$ -s giosna -p 12489 -v $ARG1$
$ARG2$
}
Cette commande est générique puisqu’elle permet d’appeler tout type de contrôle check_nt
avec l’inconvénient de devoir préciser l’argument -l et -d SHOWALL au niveau du service
comme ceci.
define service{
use generic-service
host_name winserver
service_description CPU Load
check_command check_nt!CPULOAD!-l 1,90,95,5,90,95,15,90,95
}
En spécialisant la commande comme ceci,
define command{
command_name check_nt_load
command_line $USER1$/check_nt -H $HOSTADDRESS$ -s giosna -p 12489 -v CPULOAD
-l 1,$ARG1$,5,$ARG1$,15,$ARG1$
}
Alors la définition de service devient plus évidente.
define service{
use generic-service
host_name winserver
service_description CPU Load
check_command check_nt_load!90,95
}
[NRPE]
port=5666
command_timeout=60
allow_arguments=0
allow_nasty_meta_chars=0
use_ssl=1
bind_to_address=
allowed_hosts=
socket_timeout=30
Plus intéressante est la section Check System. Elle permet de fixer la taille du tampon utilisé
pour le contrôle de la CPU et la fréquence de celui-ci avec les directives CPUBufferSize et
CheckResolution. Il est conseillé d’utiliser un tampon bien dimensionné par rapport aux
valeurs souhaitées. Ainsi, pour nos exemples, nous avons utilisé les compteurs 1,5 et 15
minutes. Une valeur de 20m est donc largement suffisante. La résolution est exprimée en
dixième de sonde, une valeur de 10 prélève donc une valeur toutes les secondes. Les cinq
lignes suivantes servent à régler le comportement du contrôle de service quand l’option
ShowAll est précisée. C’est le cas de la commande alias_service qui est décrite dans la section
External Alias du fichier de configuration.
[Check System]
CPUBufferSize=20m
CheckResolution=10
check_all_services[SERVICE_BOOT_START]=ignored
check_all_services[SERVICE_SYSTEM_START]=ignored
check_all_services[SERVICE_AUTO_START]=started
Le bloc External Script règle le comportement de NSClient++ quand il s’agit d’exécuter des
scripts extérieurs à celui-ci.Il faut que le module CheckExternalScripts soit activé en début de
fichier de configuration pour que ce bloc et le bloc External Alias soient fonctionnels. Les
options sont les mêmes que le bloc NRPE.
[External Script]
command_timeout=60
allow_arguments=0
allow_nasty_meta_chars=0
script_dir=c:\my\script\dir
Le bloc External Scripts permet de spécifier le couple nom de commande NRPE et script à
exécuter.
[External Scripts]
check_es_ok=scripts\ok.bat
check_vbs_sample=cscript.exe //T:30 //NoLogo scripts\check_vb.vbs
Le bloc External Alias permet de définir des commandes accessibles via les modules
internes de NSClient++ sous forme nom de commande NRPE et injection Nclient++.
[External Alias]
alias_cpu=checkCPU warn=90 crit=95 time=1m time=5m time=15m
alias_disk=CheckDriveSize MinWarn=10% MinCrit=5% CheckAll
FilterType=FIXED
alias_service=checkServiceState CheckAll
alias_mem=checkMem MaxWarn=80% MaxCrit=90% ShowAll type=physical
Le bloc includes permet comme son nom l’indique d’inclure des fichiers de configuration
secondaires à celui-ci. Ces directives sont intéressantes quand il existe beaucoup de
définitions de commandes NRPE. Elles sont alors déportées dans l’un de ces fichiers de
configuration secondaires afin d’alléger la lecture du fichier principal.
[includes]
myotherfile.ini
real.ini
Le bloc NRPE Handlers est une reprise des blocs External Scripts et External Alias mais au
format traditionnel NRPE. L’écriture peut être faite dans le format tel que connu sur
Linux/Unix ou sous forme simplifiée propre à NSClient++. Les deux premières définitions sont
ainsi identiques.
[NSCA Agent]
interval=300
encryption_method=14
password=
bind_to_address=
hostname=
nsca_host=192.168.0.1
nsca_port=5667
[NSCA Commands]
my_cpu_check=checkCPU warn=80 crit=90 time=20m time=10s time=4
my_mem_check=checkMem MaxWarn=80% MaxCrit=90% ShowAll type=page
my_svc_check=checkServiceState CheckAll exclude=wampmysqld
exclude=MpfService
host_check=check_ok
3.1 Installation :
Configuration requise :
apt-get update
apt-get upgrade
Installation Nagios :
//Récupération des sources et compilation:
cd /opt/
wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.1.1.tar.gz
tar xzvf nagios-4.1.1.tar.gz
cd nagios-4.1.1
./configure --with-nagios-group=nagios --with-command-group=nagcmd --with-httpd-
conf=/etc/apache2/conf-available
make all
make install
make install-commandmode
make install-init
make install-config
/usr/bin/install -c -m 644 sample-config/httpd.conf /etc/apache2/sites-
available/nagios.conf
usermod -G nagcmd www-data
ln -s /etc/init.d/nagios /etc/rcS.d/S99nagios
//Configuration Apache2
//Il faut activer le module rewrite et cgi d’apache2
a2enmod rewrite
a2enmod cgi
La deuxième chose à faire est de définir l'arborescence des fichiers de configuration. Dans
notre cas, cela donne:
3.2.3 Ressources :
Configuration des ressources externes: resource.cfg
Nagios utilise un système de plugins. Le fichier resources.cfg est là pour définir où sont ces
plugins.
Le fichier fourni en standard défini un moyen pour accéder aux plugins standards:
$USER1$=/usr/local/nagios/libexec
Libre à vous d'ajouter d'autres répertoires de plugins.
check_disk
This plugin checks the amount of used disk space on a mounted file system and generates an
alert if free space is less than one of the threshold values
Usage:
check_disk -w limit -c limit [-W limit] [-K limit] {-p path | -x device} [-C] [-E] [-e] [-f] [-g group]
[-k] [-l] [-M] [-m] [-R path ] [-r path ] [-t timeout] [-u unit] [-v] [-X type] [-N type] [-n]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-w, --warning=INTEGER
Exit with WARNING status if less than INTEGER units of disk are free
-w, --warning=PERCENT%
Exit with WARNING status if less than PERCENT of disk space is free
-c, --critical=INTEGER
Exit with CRITICAL status if less than INTEGER units of disk are free
-c, --critical=PERCENT%
Exit with CRITICAL status if less than PERCENT of disk space is free
-W, --iwarning=PERCENT%
Exit with WARNING status if less than PERCENT of inode space is free
-K, --icritical=PERCENT%
Exit with CRITICAL status if less than PERCENT of inode space is free
-p, --path=PATH, --partition=PARTITION
Mount point or block device as emitted by the mount(8) command (may be repeated)
-x, --exclude_device=PATH <STRING>
Ignore device (only works if -p unspecified)
-C, --clear
Clear thresholds
-E, --exact-match
For paths or partitions specified with -p, only check for exact paths
-e, --errors-only
Display only devices/mountpoints with errors
-f, --freespace-ignore-reserved
Don't account root-reserved blocks into freespace in perfdata
-g, --group=NAME
Group paths. Thresholds apply to (free-) space of all partitions together
-k, --kilobytes
M. T. Ait Messaoud| Administration et supervision sous Nagios Page 50
Same as '--units kB'
-l, --local
Only check local filesystems
-L, --stat-remote-fs
Only check local filesystems against thresholds. Yet call stat on remote filesystems
to test if they are accessible (e.g. to detect Stale NFS Handles)
-M, --mountpoint
Display the mountpoint instead of the partition
-m, --megabytes
Same as '--units MB'
-A, --all
Explicitly select all paths. This is equivalent to -R '.*'
-R, --eregi-path=PATH, --eregi-partition=PARTITION
Case insensitive regular expression for path/partition (may be repeated)
-r, --ereg-path=PATH, --ereg-partition=PARTITION
Regular expression for path or partition (may be repeated)
-I, --ignore-eregi-path=PATH, --ignore-eregi-partition=PARTITION
Examples:
check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p Checks /tmp and /var at
10% and 5%, and / at 100MB and 50MB
check_disk -w 100 -c 50 -C -w 1000 -c 500 -g sidDATA -r '^/oracle/SID/data.*$'
Checks all filesystems not matching -r at 100M and 50M. The fs matching the -r regex
are grouped which means the freespace thresholds are applied to all disks together
check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar
Checks /foo for 1000M/500M and /bar for 5/3%. All remaining volumes use
100M/50M
-H, --hostname=HOST
NetBIOS name of the server
-s, --share=STRING
Share name to be tested
-W, --workgroup=STRING
Workgroup or Domain used (Defaults to "WORKGROUP")
-a, --address=IP
IP-address of HOST (only necessary if HOST is in another network)
-u, --user=STRING
Username to log in to server. (Defaults to "guest")
-p, --password=STRING
Password to log in to server. (Defaults to an empty password)
-w, --warning=INTEGER or INTEGER[kMG]
Percent of used space at which a warning will be generated (Default: 85%)
-c, --critical=INTEGER or INTEGER[kMG]
Percent of used space at which a critical will be generated (Defaults: 95%)
-P, --port=INTEGER
Port to be used to connect to. Some Windows boxes use 139, others 445 (Defaults to
smbclient default)
If thresholds are followed by either a k, M, or G then check to see if that much disk space is
available (kilobytes, Megabytes, Gigabytes)
check_dns
This plugin uses the nslookup program to obtain the IP address for the given host/domain
query.
An optional DNS server to use may be specified.
If no DNS server is specified, the default server(s) specified in /etc/resolv.conf will be used.
Usage:
check_dns -H host [-s server] [-q type ] [-a expected-address] [-A] [-n] [-t timeout] [-
w warn] [-c crit]
Options:
check_ftp
This plugin tests FTP connections with the specified host (or unix socket).
Usage:
check_ftp -H host -p port [-w <warning time>] [-c <critical time>] [-s <send string>]
[-e <expect string>] [-q <quit string>][-m <maximum bytes>] [-d <delay>]
[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]
[-D <warn days cert expire>[,<crit days cert expire>]] [-S <use SSL>] [-E]
Options:
check_http
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>] [-J <client certificate file>] [-
K <private key>] [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-E] [-a auth] [-
b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>] [-e <expect>] [-
d string] [-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] [-
S <version>] [--sni] [-C <warn_age>[,<crit_age>]] [-T <content-type>] [-j method]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See
https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-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=VERSION
Connect via SSL. Port defaults to 443. VERSION is optional, and prevents auto-
negotiation (1 = TLSv1, 2 = SSLv2, 3 = SSLv3).
--sni
Enable SSL/TLS hostname extension support (SNI)
-C, --certificate=INTEGER[,INTEGER]
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.
Please note that this plugin does not check if the presented server certificate matches the
hostname of the server, or if the certificate has a valid chain of trust to one of the locally
installed CAs.
Examples:
CHECK CONTENT: check_http -w 5 -c 10 --ssl -H 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.
When the certificate of 'www.verisign.com' is valid for more than 30 days, a STATE_OK is
returned. When the certificate is still valid, but for less than 30 days, but more than 14
days, a STATE_WARNING is returned.
A STATE_CRITICAL will be returned when certificate expires in less than 14 days
check_load
Usage:
check_load [-r] -w WLOAD1,WLOAD5,WLOAD15 -c CLOAD1,CLOAD5,CLOAD15
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-w, --warning=WLOAD1,WLOAD5,WLOAD15
Exit with WARNING status if load average exceeds WLOADn
-c, --critical=CLOAD1,CLOAD5,CLOAD15
Exit with CRITICAL status if load average exceed CLOADn the load average format is the
same used by "uptime" and "w"
-r, --percpu
Divide the load averages by the number of CPUs (when possible)
check_nagios
This plugin checks the status of the Nagios process on the local machine
The plugin will check to make sure the Nagios status log is no older than the number of
minutes specified by the expires option.
It also checks the process table for a process matching the command argument.
Usage:
check_nagios -F <status log file> -t <timeout_seconds> -e <expire_minutes> -
C<process_string>
Options:
-h, --help
Examples:
check_nagios -t 20 -e 5 -F /usr/local/nagios/var/status.log -C /usr/local/nagios/bin/nagios
check_nt
This plugin collects data from the NSClient service running on a Windows NT/2000/XP/2003
server.
Usage:
check_nt -H host -v variable [-p port] [-w warning] [-c critical] [-l params] [-d SHOWALL] [-
u] [-t timeout]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
Options:
-H, --hostname=HOST
Name of the host to check
-p, --port=INTEGER
Optional port number (default: 1248)
-s, --secret=<password>
Password needed for the request
-w, --warning=INTEGER
Threshold which will result in a warning status
Notes:
- The NSClient service should be running on the server to get any information
(http://nsclient.ready2run.nl).
- Critical thresholds should be lower than warning thresholds
- Default port 1248 is sometimes in use by other services. The error output when this
happens contains "Cannot map xxxxx to protocol number".
One fix for this is to change the port to something else on check_nt and on the client service
it's connecting to.
check_ping
Usage:
check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>% [-p packets] [-
t timeout] [-4|-6]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-4, --use-ipv4
Use IPv4 connection
THRESHOLD is <rta>,<pl>% where <rta> is the round trip average travel time (ms) which
triggers a WARNING or CRITICAL state, and <pl> is the percentage of packet loss to trigger
an alarm state.
This plugin uses the ping command to probe the specified host for packet loss
(percentage) and round trip average (milliseconds). It can produce HTML output linking to
a traceroute CGI contributed by Ian Cass. The CGI can be found in the contrib area of the
downloads section at http://www.nagios.org/
check_procs
Checks all processes and generates WARNING or CRITICAL states if the specified metric is
outside the required threshold ranges. The metric defaults to number of processes. Search
filters can be applied to limit the processes to check.
Usage:
check_procs -w <range> -c <range> [-m metric] [-s state] [-p ppid] [-u user] [-r rss] [-z vsz]
[-P %cpu] [-a argument-array] [-C command] [-k] [-t timeout] [-v]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-w, --warning=RANGE
Generate warning state if metric is outside this range
-c, --critical=RANGE
Filters:
-s, --state=STATUSFLAGS
Only scan for processes that have, in the output of `ps`, one or more of the status flags
you specify (for example R, Z, S, RS, RSZDT, plus others based on the output of your 'ps'
command).
-p, --ppid=PPID
Only scan for children of the parent process ID indicated.
-z, --vsz=VSZ
Only scan for processes with VSZ higher than indicated.
-r, --rss=RSS
Only scan for processes with RSS higher than indicated.
-P, --pcpu=PCPU
Only scan for processes with PCPU higher than indicated.
-u, --user=USER
Only scan for processes with user name or ID indicated.
-a, --argument-array=STRING
Only scan for processes with args that contain STRING.
--ereg-argument-array=STRING
Only scan for processes with args that contain the regex STRING.
-C, --command=COMMAND
Only scan for exact matches of COMMAND (without path).
-k, --no-kthreads
Only scan for non kernel threads (works on Linux only).
RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If specified 'max:min', a
warning status will be generated if the count is inside the specified range
This plugin checks the number of currently running processes and generates WARNING or
CRITICAL states if the process count is outside the specified threshold ranges. The process
count can be filtered by process owner, parent process PID, current state (e.g., 'Z'), or may
be the total number of running processes
check_procs -w 50000 -c 100000 --metric=VSZ Alert if VSZ of any processes over 50K
or 100K
check_ssh
Usage:
check_ssh [-4|-6] [-t <timeout>] [-r <remote version>] [-p <port>] <host>
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-H, --hostname=ADDRESS
Host name, IP Address, or unix socket (must be an absolute path)
-p, --port=INTEGER
Port number (default: 22)
-4, --use-ipv4
Use IPv4 connection
-6, --use-ipv6
Use IPv6 connection
-t, --timeout=INTEGER
Seconds before connection times out (default: 10)
-r, --remote-version=STRING
Warn if string doesn't match expected server version (ex: OpenSSH_3.9p1)
-P, --remote-protocol=STRING
Warn if protocol doesn't match expected protocol version (ex: 2.0)
-v, --verbose
Show details for command-line debugging (Nagios may truncate output)
This plugin tests TCP connections with the specified host (or unix socket).
Usage:
check_tcp -H host -p port [-w <warning time>] [-c <critical time>] [-s <send string>]
[-e <expect string>] [-q <quit string>][-m <maximum bytes>] [-d <delay>]
[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]
[-D <warn days cert expire>[,<crit days cert expire>]] [-S <use SSL>] [-E]
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-H, --hostname=ADDRESS
Host name, IP Address, or unix socket (must be an absolute path)
-p, --port=INTEGER
Port number (default: none)
-4, --use-ipv4
Use IPv4 connection
-6, --use-ipv6
Use IPv6 connection
-E, --escape
Can use \n, \r, \t or \ in send or quit string. Must come before send or quit option
Default: nothing added to send, \r\n added to end of quit
-s, --send=STRING
String to send to the server
-e, --expect=STRING
String to expect in server response (may be repeated)
-A, --all
All expect strings need to occur in server response. Default is any
-q, --quit=STRING
String to send server to initiate a clean close of the connection
-r, --refuse=ok|warn|crit
Accept TCP refusals with states ok, warn, crit (default: crit)
-M, --mismatch=ok|warn|crit
Accept expected string mismatches with states ok, warn, crit (default: warn)
-j, --jail
Hide output from TCP socket
-m, --maxbytes=INTEGER
Close connection once more than this number of bytes are received
check_users
This plugin checks the number of users currently logged in on the local system and
generates an error if the number exceeds the thresholds specified.
Usage:
check_users -w <users> -c <users>
Options:
-h, --help
Print detailed help screen
-V, --version
Print version information
--extra-opts=[section][@file]
Read options from an ini file. See https://www.nagios-plugins.org/doc/extra-opts.html
for usage and examples.
-w, --warning=INTEGER
Set WARNING status if more than INTEGER users are logged in
-c, --critical=INTEGER
Set CRITICAL status if more than INTEGER users are logged in
check_dhcp
Usage:
check_dhcp [-v] [-u] [-s serverip] [-r requestedip] [-t timeout] [-i interface] [-m mac]
Options:
-h, --help
3.2.5 Hôtes :
Définissons un hôte représentant un serveur nommé srv-web1. Il est vérifié avec la
commande check-host-alive qui envoie simplement un ping vers l’adresse du serveur. Ce test
est effectué toutes les 5 minutes. En cas de problème, ce test est réitéré deux autres fois : la
propriété max_check_attempts = 3 = 2 + (1 test déjà effectué), sera approfondie dans la suite
du chapitre. Si le problème persiste, une notification est envoyée au groupe web-admins. Si
le problème n’est pas résolu 30 minutes après, une autre notification est envoyée, et ainsi de
suite. Lorsque le problème est résolu, le compteur repasse à zéro.
3.2.6 Services :
Définissons un service Http vérifiant que le port 80 (HTTP) est bien ouvert sur le serveur srv-
web1. Le numéro de port est ici passé en argument numéro 1 à la commande check_tcp
définie précédemment. Si la commande avait eu besoin d’un second argument, on l’aurait
ajouté à la suite, en mettant un autre ! entre les arguments. Par exemple check_tcp!80!5, 80
étant $ARG1$ dans la commande et 5, $ARG2$.
Il est à noter que ceci vaut pour tous les appels de check_command et donc pour les hôtes
également.
Les paramètres contacts et contact_groups n’ont pas besoin d’être présents tous les deux. Si
un seul est positionné, la définition est valide.
Cette vérification est faite toutes les 5 minutes. En cas de problème, un test supplémentaire
est effectué (max_check_attempts = 3 = 2 + 1 test déjà effectué) au bout de 3 minutes. Si le
problème est toujours présent, une notification est envoyée aux admins-web. Au bout de 30
minutes, si le problème n’est toujours pas résolu, une autre notification est envoyée et ainsi
de suite.
Schéma physique :
Notre architecture de test se compose :
D’un Serveur Nagios (Linux : DEBIAN),
D’un Serveur Web (Linux : DEBIAN),
D’un Serveur DNS (Linux : DEBIAN),
D’une Machine Cliente (Windows Seven),
De deux Switchs,
D’un Routeur
# 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=/usr/local/nagios/var/nagios.log
o Par la suite, il faut créer les contacts qui recevront les différentes alertes, pour cela
il faut créer le fichier « /usr/local/nagios/etc/objects/conctact.cfg » :
o Nous pouvons maintenant commencer à définir les différents hôtes qui composent
notre architecture : ces fichiers seront créés sous le répertoire
«/usr/local/nagios/etc/objects/» :
localhost.cfg
# HOST DEFINITION
# Define a host for the local machine
define host{
use linux-server ; Name of host template to use ; This host definition
will inherit all variables that are defined ; in (or inherited by) the
linux-server host template definition.
host_name Serveur_Nagios
alias localhost
address 127.0.0.1
}
# SERVICE DEFINITIONS
# Define a service to "ping" the local machine
define service{
use local-service ; Name of service template to use
host_name Serveur_Nagios
service_description PING
check_command check_ping!100.0,20%!500.0,60%
check_period 24x7
notification_period 24x7
}
# SERVICE DEFINITIONS
# Define a service to "ping" the host
define service{
host_name Routeur
service_description PING
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 3
retry_interval 1
normal_check_interval 2
contact_groups admins
check_period 24x7
notification_period 24x7
}
switch1.cfg :
# HOST DEFINITION
define host{
host_name Switch1
alias switch nagios
address 10.3.2.1
max_check_attempts 2
parents Serveur_Nagios
check_command check-host-alive
first_notification_delay 0
notifications_enabled 1
contact_groups admins
notification_options d,r
}
web.cfg :
# HOST DEFINITION
define host{
host_name Serveur_HTTP
alias serveur-pc-romain
address 10.7.10.2
max_check_attempts 2
parents Routeur
check_command check-host-alive
first_notification_delay 0
notifications_enabled 1
contact_groups admins
notification_options d,r
}
# SERVICE DEFINITIONS
# Define a service to check HTTP on the local machine.
# Disable notifications for this service by default, as not all users may have
# HTTP enabled.
define service {
host_name Serveur_HTTP
service_description HTTP
check_command check_tcp!80
normal_check_interval 2
max_check_attempts 3
retry_check_interval 1
notification_interval 0
check_period 24x7
notification_period 24x7
}
dns.cfg :
# HOST DEFINITION
define host{
host_name Serveur_DNS
alias serveur-pc-picard
address 10.7.10.3
max_check_attempts 2
parents Routeur
check_command check-host-alive
first_notification_delay 0
notifications_enabled 1
contact_groups admins
notification_options d,r
}
# SERVICE DEFINITIONS
# Define a service to check DNS on the local machine.
define service {
host_name Serveur_DNS
service_description DNS
check_command check_tcp!80
normal_check_interval 2
max_check_attempts 3
retry_check_interval 1
notification_interval 0
check_period 24x7
notification_period 24x7
}
windows.cfg :
#
# HOST DEFINITION
#
define host{
host_name Windows
alias poste_client
address 10.3.2.3
max_check_attempts 2
parents Switch1
check_command check-host-alive
first_notification_delay 0
notifications_enabled 1
contact_groups admins
notification_options d,r
}
#
# SERVICE DEFINITIONS
#
# Define a service to "ping" the host
define service{
host_name Windows
service_description PING
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 3
retry_interval 1
normal_check_interval 2
contact_groups admins
check_period 24x7
notification_period 24x7
}
define hostgroup{
hostgroup_name switch/routeur ; The name of the hostgroup
alias Equipements reseaux ; Long name of the
group
members Routeur, Switch1
}
dependence.cfg :
#
# DEPENDENCIES DEFINITIONS
#
define servicedependency{
host_name Serveur_DNS
service_description DNS
dependent_host_name Serveur_HTTP
dependent_service_description HTTP
dependency_period 24x7
execution_failure_criteria o
notification_failure_criteria n
}
Tout d'abord, les bases. Vous créez des dépendances de service en ajoutant des définitions
de dépendance de service dans votre (vos) fichier(s) de configuration des objets .Dans
chaque définition, vous spécifiez le service dépendant, le service dont il dépend, et la
condition (s'il y a lieu) qui provoque l'échec des dépendances d'exécution et de notification
(ces notions sont décrites plus loin).
Vous pouvez créer plusieurs dépendances pour un même service, mais il vous faut une
définition de dépendance de service séparée pour chaque dépendance créée.
L'image suivante nous montre un exemple d'une trame typique de notification de service et
d'exécution de ses dépendances. Différents services dépendent d'autres services pour que
l'exécution des checks et des notifications se réalise.
define servicedependency {
host_name Host B
service_description Service E
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria n
notification_failure_criteria w,u,c
}
define servicedependency {
host_name Host B
service_description Service C
dependent_host_name Host C
dependent_service_description Service F
execution_failure_criteria w
notification_failure_criteria c
}
Les autres définitions de dépendances décrites dans l'image précédente s'écriraient comme
suit :
define servicedependency {
host_name Host A
service_description Service A
dependent_host_name Host B
define servicedependency {
host_name Host A
service_description Service B
dependent_host_name Host B
dependent_service_description Service E
execution_failure_criteria w,u
notification_failure_criteria c
}
define servicedependency {
host_name Host B
service_description Service C
dependent_host_name Host B
dependent_service_description Service E
execution_failure_criteria n
notification_failure_criteria w,u,c
}
Avant que Nagios n'exécute un contrôle de service ou n'envoie des notifications concernant
un service, il vérifiera si le service comporte des dépendances. Si ce n'est pas le cas, le
contrôle est exécuté ou la notification est envoyée comme en temps normal. Si le service a
bien une ou plusieurs dépendances, Nagios vérifiera chacune de la manière suivante :
Nagios compare l'état courant du service dont il dépend aux options d'échec soit d'exécution
soit de notification dans la définition de dépendance (selon ce qui adapté).
Si l'état courant du service dont il dépend correspond à une des options d'échec, la
dépendance est réputée avoir échoué et Nagios sortira de la boucle de vérification des
dépendances.
Si l'état courant du service dont il dépend ne correspond à aucune des options d'échec de la
dépendance, la dépendance est réputée avoir réussi et Nagios continuera avec la prochaine
dépendance.
Ce cycle continue jusqu'à ce que toutes les dépendances du service aient été vérifiées, ou
jusqu'à ce qu'une dépendance échoue.
*Il est important de noter que par défaut, Nagios utilisera l'état hard courant du (des) service(s)
dont il dépend lors de ses vérifications de dépendance. Si vous voulez que Nagios utilise l'état
Dépendances d'exécution
Les dépendances d'exécution permettent de limiter les vérifications de service actives .Les
vérifications de service passives ne sont pas affectées par les dépendances d'exécution.
Si tous les tests de dépendance d'exécution du service réussissent, Nagios exécute le contrôle
du service comme à l'accoutumée. Si ne serait-ce qu'une dépendance d'exécution du service
échoue, Nagios arrêtera temporairement l'exécution des contrôles pour ce service
(dépendant). Par la suite, les tests des dépendances d'exécution du service vont réussir.
Alors, Nagios recommencera les contrôles de ce service de manière normale. Pour plus
d'informations sur l'algorithme d'ordonnancement des contrôles , lisez ceci.
Dépendances de notification
Si tous les tests de dépendance de notification du service réussissent, Nagios enverra les
notifications pour ce service comme à l'accoutumée. Si, ne serait-ce qu'une dépendance de
notification du service échoue, Nagios arrêtera temporairement l'émission de notifications
pour ce service (dépendant). Plus tard, les tests des dépendances de notifications du service
vont réussir. Alors, Nagios recommencera à envoyer des notifications pour ce service de
manière normale. Pour plus d'informations sur l'algorithme de notification, lisez ceci.
Héritage de dépendance
Comme je l'ai déjà dit, par défaut les dépendances de service ne sont pas héritées. Dans
l'exemple ci-dessus, vous pouvez voir que le Service F est dépendant du Service E. Toutefois,
il n'hérite pas automatiquement des dépendances du Service E sur le Service B et le Service C.
Pour rendre le Service F dépendant du Service C, nous avons dû ajouter une autre définition
de dépendance. Il n'y a pas de définition de dépendance pour le Service B, donc le Service F
n'est pas dépendant du Service B.
Comme le paramètre inherits_parent est activé, la dépendance entre les services A et D sera
testée quand la dépendance entre les services F et D le sera.
Dépendances d'hôtes
Comme vous vous y attendez probablement, les dépendances d'hôtes fonctionnent d'une
manière similaire à celles de services. La principale différence est que ce sont des hôtes et
pas des services. Une autre différence est que la dépendance d'hôte ne sert qu'à supprimer
des notifications d'hôtes et non pas des controles d'hôtes.
ATTENTION ! Ne confondez pas les dépendance d'hôtes avec les relations parent/enfant.
Vous utiliserez les relations parent/enfant (définies avec le paramètre parents dans la
définition d'hôte) dans la plupart des cas, plutôt que des dépendances d'hôtes.
Les dépendances d'hôtes ne se sont pas héritées (à moins que ce ne soit explicitement
spécifié)
Les dépendances d'un hôte ne sont seulement valable durant la période de temps spécifiée
Dans l'image ci-dessus, les définitions de dépendances pour l'hôte C devraient être définies
ainsi:
define hostdependency {
host_name Host A
dependent_host_name Host C
notification_failure_criteria d
}
define hostdependency {
host_name Host B
dependent_host_name Host C
notification_failure_criteria d,u
}
Comme pour les dépendances de services, les dépendances d'hôtes ne sont pas héritées.
Dans l'exemple de cette image, vous pouvez voir que l'hôte C n'hérite pas des dépendances
de l'hôte B. Pour que C soit dépendant de A, une autre définition d'hôte doit être précisée.
define serviceescalation{
host_name webserver
service_description HTTP
first_notification 6
last_notification 10
notification_interval 60
contact_groups nt-admins,managers,everyone
}
Remarquez qu'il y a des trous dans les définitions d'escalade de notification. En particulier,
les notifications 1 et 2 ne sont pas prises en compte par les escalades, ni celles au-delà de 10.
Pour la première et la seconde notification, de même que pour celles au-delà de la dixième,
le groupe de contacts par défaut précisé dans la définition de service est utilisé. Dans tous les
exemples que j'utiliserai, je considèrerai que le groupe de contacts par défaut des définitions
de service s'appelle nt-admins.
Contact Groups
En définissant des escalades de notification, il est important d'être conscient que n'importe
quels groupes de contact qui étaient des membres de plus bas niveaux d'escalades (c'est-à-
dire ceux avec les nombres de notification plus basses) devraient aussi être inclus dans les
niveaux plus haut des définitions d'escalade. Cela devrait être fait pour garantir que
quelqu'un qui est notifié d'un problème continue à suivre ce problème jusqu'à sa résolution.
Exemple :
define serviceescalation {
host_name webserver
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 6
last_notification 0
notification_interval 60
contact_groups nt-admins,managers,everyone
}
Le premier (ou plus bas) niveau d'escalade comprend à la fois les groupes de contact nt-
admins et managers. Le dernier (ou plus haut) niveau d'escalade comprend les groupes de
contact nt-admins, managers, et everyone. Remarquez que le groupe de contact nt-admins
fait partie des deux définitions d'escalade. C'est pour qu'il continue à être prévenu s'il reste
des problèmes après que les deux premières notifications de service aient été envoyées. Le
groupe de contact managers apparaît d'abord dans la définition d'escalade la plus basse - il
reçoit sa première notification lorsque la troisième notification de problème est envoyée.
Nous voulons que le groupe managers continue de recevoir des notifications si le problème
persiste après cinq notifications, il fait donc partie de la plus haute définition d'escalade.
Recoupement des portées des escalades
Les définitions d'escalade de notification peuvent avoir des portées qui se recoupent.
Prenons l'exemple suivant :
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 3
last_notification 5
notification_interval 20
contact_groups nt-admins,managers
}
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 4
last_notification 0
notification_interval 30
contact_groups on-call-support
}
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 4
last_notification 0
notification_interval 30
contact_groups on-call-support
}
Si, après trois notifications de problème, une notification de reprise d'activité est envoyée au
service, qui reçoit la notification ? La reprise d'activité est la quatrième notification envoyée.
Cependant, le code d'escalade est suffisamment bien fait pour que seules les personnes qui
ont reçu la troisième notification reçoivent celle de reprise d'activité. Dans ce cas, les groupes
de contact nt-admins et managers recevront la notification de reprise d'activité.
Intervalles de notification
Vous pouvez modifier la fréquence à laquelle les notifications escaladées sont émises pour un
hôte ou un service particulier en utilisant le paramètre notification_interval de la définition
d'escalade de groupe d'hôtes ou de service. Par exemple :
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 3
last_notification 5
notification_interval 45
contact_groups nt-admins,managers
}
define serviceescalation {
host_name webserver
M. T. Ait Messaoud| Administration et supervision sous Nagios Page 87
service_description HTTP
first_notification 6
last_notification 0
notification_interval 60
contact_groups nt-admins,managers,everyone
}
Dans cet exemple nous voyons que l'intervalle de notification par défaut pour les services est
de 240 minutes (c'est la valeur donnée dans la définition du service). Quand la notification de
ce service est escaladée lors des 3ème, 4ème, et 5ème notifications, un intervalle de 45
minutes sera utilisé entre les notifications. Lors de la 6ème notification et des suivantes,
l'intervalle de notification sera de 60 minutes, comme il est spécifié dans la seconde
définition d'escalade.
Comme il est possible d'avoir des définitions d'escalade qui se chevauchent pour un groupe
d'hôtes ou un service donné, et comme un hôte peut être membre de plusieurs groupes
d'hôtes, Nagios doit décider quel intervalle de notification utiliser quand des définitions
d'escalade se chevauchent. Dans tous les cas de chevauchement, Nagios choisira l'intervalle
de notification le plus court. Prenez l'exemple suvant :
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 3
last_notification 5
notification_interval 45
contact_groups nt-admins,managers
}
define serviceescalation{
host_name webserver
service_description HTTP
first_notification 4
last_notification 0
notification_interval 60
contact_groups nt-admins,managers,everyone
}
Nous voyons que les deux définitions d'escalade se chevauchent sur les 4ème et 5ème
notifications. Pour ces notifications, Nagios utilisera un intervalle de notification de 45
minutes, car c'est le plus petit intervalle présent dans les définitions d'escalade valides de ces
notifications.
Une dernière remarque à propos des intervalles de notification concerne les intervalles de 0.
Un intervalle de 0 signifie que Nagios ne doit émettre une notification que pour la première
notification valide durant cette définition d'escalade. Toutes les notifications suivantes pour
le groupe d'hôte ou le service seront supprimées. Prenez cet exemple :
define serviceescalation {
host_name webserver
service_description HTTP
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 3
last_notification 5
notification_interval 45
contact_groups nt-admins,managers
}
define serviceescalation {
host_name webserver
service_description HTTP
first_notification 7
last_notification 0
notification_interval 30
contact_groups nt-admins,managers
}
Pré-requis
Avant de penser pouvoir implémenter la redondance avec Nagios, vous devez être familier
avec ce qui suit…
Exécuter des plugins sur des hôtes distants en utilisant soit NRPE, soit d'autres méthodes
Exemples de scripts
Tous les exemples que j'utilise dans cette documentation se trouvent dans le répertoire
eventhandlers/ de la distribution Nagios. Vous devrez probablement les modifier pour les
faire fonctionner sur votre système…
Buts
Configuration Initiale
Délais
Cas spéciaux
Introduction
Ceci est une méthode facile (et naïve) pour implémenter le monitoring redondant d'hôtes sur
votre réseau, qui protègera seulement contre un nombre limité de problèmes. Des réglages
plus complexes sont nécessaires pour fournir une redondance plus pratique, une meilleure
redondance à travers des segments réseau, etc.
Buts
Le but de ce type d'implémentation de redondance est simple. Les hôtes maître et esclave
surveillent les mêmes systèmes et services sur le réseau. Dans des circonstances normales, le
système maître prendra en charge l'envoi des notifications aux contacts concernant les
problèmes détectés. Nous voulons que système esclave fasse fonctionner Nagios et prenne
en charge la notification des problèmes si:
Le diagramme ci-dessous montre une configuration réseau très simple. Pour ce scénario, je
vais supposer que les systèmes A et E font tourner tous deux Nagios et surveillent tous les
systèmes que l'on y voit. Le système A sera considéré comme étant le système maître et le
système E sera considéré comme étant l'esclave.
Configuration Initiale
Il faudra ensuite considérer les changements entre le(s) fichier(s) de configuration des
objets sur les systèmes maître et esclave…
Je vais supposer que le système maître (système A) est configuré pour surveiller des
services sur tous les systèmes montrés dans le diagramme ci-dessus. Le système esclave
(système E) doit être configuré pour surveiller les mêmes systèmes et services, avec les
ajouts suivants aux fichiers de configuration…
Le fichier de configuration sur le système E devrait avoir un service défini pour surveiller
l'état du processus Nagios sur le système A. Supposons que vous ayez défini cette
vérification de service pour lancer le plugin check_nagios sur le système A.
Il est important de noter que le système A (le système maître) ne sait rien du système E (le
système esclave). Dans ce scénario, il n'en a simplement pas besoin. Bien évidemment, vous
pouvez surveiller les services du système E depuis le système A, mais cela n'a rien à voir
avec l'implémentation de la redondance…
define command {
command_name handle-master-host-event
command_line /usr/local/nagios/libexec/eventhandlers/handle-master-host-event $HOSTSTATE$ $HOSTSTATETYPE$
}
define command {
command_name handle-master-proc-event
command_line /usr/local/nagios/libexec/eventhandlers/handle-master-proc-event $SERVICESTATE$ $SERVICESTATETYPE$
}
Cela implique que vous ayez placé les scripts de gestion d'événements dans le répertoire
/usr/local/nagios/libexec/eventhandlers. Vous pouvez les placer ailleurs, mais vous devrez
modifier les exemples que j'ai donnés ici.
#!/bin/sh
# Only take action on hard host states…
case "$2" in
HARD)
case "$1" in
DOWN)
# The master host has gone down!
# We should now become the master host and take
# over the responsibilities of monitoring the
# network, so enable notifications…
/usr/local/nagios/libexec/eventhandlers/enable_notifications
;;
UP)
# The master host has recovered!
# We should go back to being the slave host and
# let the master host do the monitoring, so
# disable notifications…
/usr/local/nagios/libexec/eventhandlers/disable_notifications
;;
esac
;;
esac
exit 0
La notification sur le système esclave (système E) est désactivée, donc il n'enverra pas de
notifications pour les systèmes autant que pour les services tant que le processus Nagios
fonctionne sur le système maître (système A).
Dès que le processus Nagios sur le système esclave (système E) a la notification activée, il
sera capable d'envoyer des notifications quant aux services ou problèmes système ou
encore les retours à la normale. A ce moment, le système E a effectivement pris la
responsabilité de notifier les contacts des problèmes de systèmes et services!
Dès que le processus Nagios sur le système E est désactivé, il n'enverra plus de notification
concernant les problèmes liés aux services et aux systèmes ou encore les retours à la
normale. Dès ce moment, le système E a pris la responsabilité de notifier les contacts des
problèmes du processus Nagios sur le système A. Tout revient maintenant dans le même
état que lorsque l'on a démarré!
Délais
La redondance dans Nagios n'est en rien parfaite. Un des nombreux problèmes est le délai
entre le moment où le maître tombe et que l'esclave prend le relais. En voici les raisons…
L'intervalle entre la rupture du système maître et la première fois que le système esclave
détecte le problème.
Le temps qu'il faut pour vérifier que le système maître a réellement un problème (en
utilisant une nouvelle fois la commande 'check' d'un service ou d'un système sur le système
esclave)
S'assurant que le processus Nagios sur le système E (re)vérifie un ou plusieurs services avec
une fréquence élevée. Ceci peut être fait en utilisant les arguments check_interval et
retry_interval dans chaque définition de service.
Quand Nagios revient à la normale sur le système A, il y a aussi un délai avant que le
système E ne redevienne esclave. C'est du aux faits suivants…
Cas spéciaux
Le temps où aucun système ne surveille est assez difficile à déterminer. Toutefois, cette
période peut être minimisée en augmentant la fréquence de vérification (sur le système E)
du processus Nagios sur le système A. Le reste est une question de chance, mais le temps de
blackout total ne devrait pas être trop mauvais.
Introduction
Buts
Cas Supplémentaires
Introduction
La supervision avec gestion de panne est pratiquement identique. Il existe quand même des
différences avec le système précédent scénario 1).
Buts
Le but principal de la gestion de panne est d'avoir le processus Nagios sur le système
esclave en hibernation tant que le processus Nagios sur le système maitre fonctionne. Si le
processus sur le système maître arrête de fonctionner (ou si le système tombe), le
processus Nagios sur le système esclave commence à tout surveiller.
Créer un tâche programmée [cron job] sur le système esclave qui lance périodiquement un
script (disons toutes les minutes) qui vérifie l'état du processus Nagios sur le système maître
(en utilisant le plugin check_nrpe sur le système esclave et le démon NRPE sur le système
maître). Le script va vérifier le code de retour du plugin check_nrpe. S'il retourne un état
non-OK, le script va envoyer les commandes appropriées au fichier de commandes externes
pour activer la notification et la surveillance des services. Si le plugin retourne un état OK, le
script enverra les commandes pour désactiver la surveillance active des services et la
notification.
Notez aussi que vous ne devez pas définir de gestionnaires d'événements comme défini
dans le scénario 1, car les contraintes sont surmontées de manière différente.
Cas Supplémentaires
Vous avez maintenant implémenté une gestion de panne de manière plutôt basique. Il y a
toutefois d'autres manières de procéder pour que cela fonctionne de manière plus douce.
Le gros problème avec cette technique est surtout le fait que l'esclave ne connait pas l'état
courant des services ou des systèmes au moment même où il prend à sa charge le travail de
surveillance. Une manière de solutionner ce problème est d'activer la commande ocsp sur le
système maître et de lui demander de rapporter les résultats des vérifications à l'esclave en
utilisant l'addon NSCA De cette manière, le système esclave possède un statut mis à jour
des informations de tous les services et des systèmes s'il venait à prendre en charge la
surveillance. Tant que les vérifications actives ne sont pas activées sur le système esclave, il
n'effectuera aucune vérification active. Malgré tout, il exécutera les vérifications si
nécessaire. Cela signifie qu'autant le maître que l'esclave exécuteront les vérifications de
système comme il le faut, ce qui n'est pas vraiment une bonne affaire puisque la majorité
des surveillances fonctionnent par rapport aux services.
Nagios peut être configuré pour supporter la supervision distribuée des services et ressources du
réseau. Je vais essayer d'expliquer brièvement comment cela peut être fait…
Buts
Le but de l'environnement de supervision distribuéé que je vais décrire est de décharger l'excès de
charge induit par les contrôle de services (sur la CPU, etc.) du serveur central sur un ou plusieurs
serveurs distribués. La plupart des petites et moyennes entreprises n'auront pas réellement besoin de
mettre en œuvre cet environnement. Cependant, quand vous voulez superviser des centaines, voire des
milliers d'hôtes (et plusieurs fois cette valeur en termes de services) à l'aide de Nagios, cela commence
à devenir important.
Diagramme de référence
Le diagramme ci-dessous devrait vous aider à vous faire une idée du fonctionnement de la supervision
distribuée avec Nagios. Je ferai référence aux éléments du diagramme quand j'expliquerai les choses…
Le rôle d'un serveur distribué est de contrôler tous les services définis pour une grappe
[cluster] d'hôtes. J'utilise ce terme grappe de manière inappropriée : il désigne simplement
un groupe d'hôtes de votre réseau. Selon la topographie de votre réseau, vous pouvez avoir
plusieurs grappes en un seul lieu, ou chaque grappe peut être séparée par un WAN, un
pare-feu, etc. Il faut surtout se souvenir d'une chose, c'est que pour chaque groupe d'hôtes
(de quelque manière que vous le définissiez), il y a un serveur distribué sur lequel Nagios
tourne et qui supervise les services des hôtes du cluster. Un serveur réparti est
généralement une installation simplifiée de Nagios. Il n'est pas besoin d'installer l'interface
web, d'envoyer des notifications, de faire tourner les scripts de gestionnaires d'événements
ou de faire autre chose que l'exécution des contrôles de service si vous ne le souhaitez pas.
De plus amples explications relatives à la configuration du serveur distribué suivront…
Le but du serveur central est d'écouter simplement les résultats des contrôles de service
d'un ou de plusieurs serveurs distribués. Même si les services sont occasionnellement
contrôlés activement par le serveur central, les contrôles actifs sont seulement exécutés
dans des circonstances particulières ; disons donc pour l'instant que le serveur central
n'accepte que les contrôles passifs. Comme le serveur central obtient des résultats des
contrôles de services passifs d'un ou plusieurs serveurs répartis, il est utilisé comme point
central pour la logique de supervision (ex: il envoie des notifications, exécute les scripts de
gestionnaires d'événements, détermine l'état des hôtes, son interface web est installée,
etc.).
Avant de sauter à pieds joints dans les détails de la configuration, il faut savoir comment
envoyer les résultats des contrôles de service des serveurs distribués au serveur central. J'ai
déjà expliqué comment soumettre des résultats de contrôles passifs à Nagios à partir de la
machine même sur laquelle Nagios tourne (cf. documentation sur les contrôles passifs),
mais je n'ai pas fourni d'information sur la manière d'envoyer des résultats de contrôles de
service à partir d'autres hôtes.
Afin de faciliter l'envoi de résultats de contrôles passifs à un hôte distant, j'ai écrit le module
complémentaire NSCA . Il contient deux parties. La première est un programme client
(send_nsca) qui tourne sur un hôte distant et envoi les résultats de contrôles de service à un
autre serveur. La seconde est le démon NSCA (nsca) qui fonctionne, soit comme un démon
autonome, soit sous inetd, et écoute les connections des programmes du client. Après avoir
reçu l'information de contrôle de service de la part d'un client, le démon enverra
l'information de contrôle à Nagios (sur le serveur central) en insérant une commande
PROCESS_SVC_CHECK_RESULT dans le fichier de commande externe, avec les résultats du
contrôle. La prochaine fois que Nagios contrôlera les commandes externes, il trouvera
l'information de contrôle de service passif qui avait été envoyée par le serveur distribué et
la traitera. Facile, non ?
Bon, comment Nagios est-il configuré sur un serveur distribué ? A la base, c'est juste une
simple installation. Il n'est pas nécessaire d'installer l'interface web ou de faire envoyer des
notifications par le serveur, comme c'est le cas pour le serveur central.
Seuls les services et les hôtes qui sont supervisés directement par le serveur distribué sont
définis dans le fichier de configuration d'hôte .
Le serveur distribué est configuré avec l'option de remontée de contrôle de service activée.
Afin que tout fonctionne ensemble de manière correcte, nous voulons que le serveur
distribué renvoie les résultats de tous les contrôles de service à Nagios. Nous pourrions
utiliser les gestionnaires d'événements pour envoyer les changements de l'état d'un service,
mais cela ne fait pas l'affaire. Afin d'obliger le serveur distribué à envoyer tous les résultats
des contrôles de service, il faut autoriser l'option de remontée de contrôle de service dans
le fichier de configuration principal et permettre qu'une commande ocsp soit lancée après
chaque contrôle de service. Nous utiliserons cette commande ocsp pour envoyer les
résultats de tous les contrôles de service au serveur central, en utilisant le client send_nsca
et le démon nsca (comme décrit ci-dessus) pour gérer la transmission.
Pour mener tout cela à bien, il faut définir la commande ocsp de cette façon :
ocsp_command=submit_check_result
define command {
command_name submit_check_result
command_line /usr/local/nagios/libexec/eventhandlers/submit_check_result
$HOSTNAME$ '$SERVICEDESC$' $SERVICESTATE$ '$SERVICEOUTPUT$'
}
#!/bin/sh
case "$3" in
OK)
return_code=0
;;
WARNING)
return_code=1
;;
CRITICAL)
return_code=2
;;
UNKNOWN)
return_code=-1
;;
esac
# pipe the service check info into the send_nsca program, which
# in turn transmits the data to the nsca daemon on the central
# monitoring server
C'est tout ! Nous venons de configurer avec succès un hôte distant sur lequel tourne Nagios
pour agir comme un serveur de supervision distribué. Voyons maintenant ce qui se passe
exactement avec le serveur distribué et comment il envoie des résultats de contrôle de service à
Nagios (les étapes soulignées ci-dessous correspondent aux numéros du schéma de
référence ci-dessus) :
Après que le serveur distribué a terminé l'exécution d'un contrôle de service, il exécute la
commande définie par la variable ocsp_command . Dans notre exemple, c'est le script
/usr/local/nagios/libexec/eventhandlers/submit_check_result. Remarquez que la définition
de la commande submit_check_result a envoyé quatre éléments d'information au script : le
nom de l'hôte auquel le service est associé, la description du service, le code de retour du
contrôle de service, et la sortie du plugin de contrôle du service.
Le démon nsca du serveur central prend l'information de contrôle de service et l'écrit dans
le fichier de commande externe pour qu'elle soit reprise ultérieurement par Nagios.
Nous avons vu comment les serveurs de supervision distribués doivent être configurés,
occupons nous maintenant du serveur central. Pour accomplir toutes ses missions, il est
configuré de la même manière que vous configureriez un serveur seul. Il est installé de la
manière suivante :
Sur le serveur central, le paramètre enable_notifications est fixée à 1. Ceci activera les
notifications (optionnel, mais recommandé)
Les contrôles de service actifs sont désactivés sur le serveur central (optionnel, mais
recommandé - voir notes ci-dessous)
Les contrôles de commandes externes sont activés sur le serveur central (obligatoire)
Les contrôles de service passifs sont activés sur le serveur central (obligatoire)
M. T. Ait Messaoud| Administration et supervision sous Nagios Page 102
Il y a trois autres éléments importants que vous devez conserver à l'esprit en configurant le
serveur central :
Tous les services qui sont supervisés par les serveurs distribués doivent comporter des
définitions de service sur le serveur central. Nagios ignorera les résultats des contrôles de
service passifs s'ils ne correspondent pas à un service qui a été défini.
Si vous n'utilisez le serveur central que pour traiter des services dont les résultats sont
fournis par des hôtes distribués, vous pouvez simplement désactiver tous les contrôles de
service de façon globale en mettant le paramètre execute_service_checks à 0. Si vous
utilisez le serveur central pour superviser activement quelques services par lui-même (sans
l'intervention des serveurs distribués), l'option enable_active_checks de chaque définition
de service pour les services dont les résultats sont fournis par les hôtes distribués doit être
positionnée à 0. Ceci empêchera Nagios de vérifier activement ces services.
Il est important que vous désactiviez soit tous les contrôles de service pour l'ensemble du
logiciel, soit l'option enable_active_checks dans la définition de tout service surveillé par un
serveur distribué. Cela assure que les contrôles de service actifs ne sont jamais exécutés en
temps normal. Les services continueront à être ordonnancés à leur intervalle de contrôle
normal (3 minutes, 5 minutes, etc…), mais ils ne seront jamais exécutés. Cette boucle de ré-
ordonnancement continuera aussi longtemps que Nagios tourne. Je vais expliquer bientôt
pourquoi ce type de fonctionnement…
Pour toutes les utilisations intensives, nous pouvons dire que le serveur central s'appuie
uniquement sur les contrôles passifs pour la supervision. Faire totalement confiance aux
contrôles passifs pour superviser pose un problème majeur : Nagios doit se fier à quelque
chose d'autre pour fournir les données supervisées. Que se passe-t-il si l'hôte distant qui
envoie les résultats s'effondre ou devient injoignable ? Si Nagios ne contrôle pas activement
les services de cet hôte, comment saura-t-il qu'il y a un problème ?
Nagios offre une fonctionnalité qui teste la validité des résultats d'un test (freshness
checking). On peut trouver plus d'informations à ce sujet ici. Cette fonctionnalité apporte
une solution aux situations ou les hôtes distants peuvent arrêter d'envoyer le résultat des
tests passifs au serveur central. Elle (freshness) permet d'assurer que le test est soit fourni
passivement par les serveurs distribués, soit exécuté activement par le serveur central si
nécessaire. Si les résultats fournis par le test du service deviennent figés, Nagios peut être
configuré pour forcer un contrôle actif depuis le serveur central.
L'option check_freshness dans la définition des services doit être à 1. Ceci active le test de
validité (freshness checking)
L'option freshness_threshold dans la définition des services doit être positionné à une
valeur qui indique le niveau de validité ([NdT] : la traduction littérale est la fraîcheur, mais il
ne me semble pas adapté) des données (telles que fournies par les serveurs distribués).
L'option check_command dans la définition des services doit indiquer les commandes
valides qui seront employées pour tester activement les services depuis le serveur central.
Nagios teste régulièrement la validité des résultats pour lesquels cette option est activée.
L'option freshness_threshold dans chaque service détermine le niveau de validité pour
celui-ci. Par exemple, si sa valeur est 300 pour un de vos services, Nagios va considérer que
les résultats du service sont figés s'ils ont plus de 5 minutes (300 secondes). Si vous ne
spécifiez pas la valeur de freshness_threshold, Nagios calculera un seuil à partir de la valeur
des options normal_check_interval ou de retry_check_interval (en fonction de l'état du
service). Si les résultats sont figés, Nagios exécutera la commande spécifiée dans
check_command dans la définition du service, vérifiant ainsi activement ce service.
N'oubliez pas que vous devez définir l'option check_command dans la définition des
services, pour pouvoir tester activement l'état d'un service depuis le serveur central. Dans
des conditions normales, cette commande check_command ne sera pas exécutée (parce
que les test actifs auront été désactivés globalement au niveau du programme, ou pour des
services spécifiques). A partir du moment ou le contrôle de validité des données est activé,
Nagios exécutera cette commande, même si les tests actifs ont été désactivés globalement
au niveau du programme ou pour des services spécifiques.
Si nous n'arrivez pas à définir des commandes pour tester activement un service depuis le
serveur central (ou bien cela est un casse-tête douloureux), vous pouvez simplement définir
toutes les options check_command d'après un simple script qui retourne un état critique.
Voici un exemple : supposons que vous ayez défini une commande service-fige et utilisez
cette commande dans l'option check_command de vos services. Elle pourrait ressembler à
cela …..
define command {
command_name service-fige
command_line /usr/local/nagios/libexec/check_dummy 2 "CRITICAL: Service
results are stale"
}
Maintenant, vous savez comment obtenir des résultats de contrôles passifs depuis des
serveurs distribués. Ceci signifie que le serveur central ne teste activement que ses propres
services. Mais qu'en est-il des hôtes ? Vous en avez toujours besoin, non ?
Comme les contrôles d'hôtes n'ont qu'un impact faible sur la surveillance (ils ne sont faits
que s'ils sont vraiment nécessaires), je vous recommanderais bien de faire ces contrôles de
manière active depuis le serveur central. Ceci signifie que vous définirez le contrôle des
hôtes sur le serveur central de la même manière que vous l'avez fait sur les serveurs
distribués (également de la même manière que sur un serveur normal, non distribué).
Les résultats de contrôle passifs des hôtes sont disponible (lisez ceci), donc vous pourriez les
utiliser dans votre architecture distribuée mais cette méthode comporte certains
problèmes. Le principal étant que Nagios ne traduit pas les états problèmes (arrêtés DOWN
ou injoignables UNREACHABLE) retournés par les vérifications passives des hôtes quand ils
sont traités. Par conséquent, si vos serveurs de supervision ont une structure différentes en
terme de parents ou enfants (et c'est ce qui se passe lorsque vos serveurs de supervisions
ne sont pas exactement au même endroit), le serveur central va avoir une vision incorrecte
des états des hôtes.
Si vous voulez vraiment envoyer des résultats passifs de contrôle d'hôte à un serveur de
supervision central, vérifiez que :
La réception passive de vérification d'hôte (requis) est activée sur le serveur central
Le serveur distribué est configuré avec l'option de remontée de contrôle d'hôte activée.