Supervision domestique avec Nagios
Le 30 octobre 2008, à 0:42 par Ulhume...

Lorsque l'on gère un petit réseau domestique avec une ou deux machines, on se retrouve malgré tout avec des problèmes de "grands" comme la nécessité d'être prévenu le plus vite lorsqu'un service tombe, et ce de la manière la plus automatisée possible. C'est à cette problématique que répond Nagios.

Historique (tout afficher)
  • v3 - Mise à jour v3 (2008-10-30 00:44)
  • v2 - Modifications suite aux remarques de Dab (2007-10-14 17:01)

Présentation

Nagios, qui s'appelait précédemment NetSaint, est un outil de supervision pour parc de serveurs. Il permet d'auditer en permanence des machines, des services sur ces machines, de recevoir des alertes en cas de problème et de disposer d'un tableau de bord de l'état du système à un moment donnée.

Nagios s'architecture autour d'un moteur écrit en C chargé de la planification des différents audits à lancer à travers de le réseau et de l'agrégation des résultats dans une base de donnée. L'acquisition en elle-même est déléguée à une impressionnante librairie de greffons qui répondent à tous les besoins ou presque. Des modules qui sont souvent écrits en perl ou en bash, très simple à modifier et tout autant à imiter.

Le tout est contrôlable à travers une frontal Web basée sur le protocole CGI et accessible via n'importe quel serveur HTTP comme Apache.

Installation

Sous Mandriva il suffit d'installer le paquet nagios-www pour que le reste vienne avec par jeu de dépendance. Si vous avez gardé la configuration standard de Mandriva côté apache, l'installation a ajouté un fichier de configuration spécifique en /etc/httpd/conf/webapp.d. Pour les autres ce qui est à rajouter dans votre apache doit ressembler à cela :

ScriptAlias /nagios/cgi-bin /usr/lib/nagios/cgi

<Directory /usr/lib/nagios/cgi>
    Options ExecCGI
    order deny,allow
    deny from all
    allow from 127.0.0.1
</Directory>

Alias /nagios /usr/share/nagios

<Directory /usr/share/nagios>
    Options None
    order deny,allow
    deny from all
    allow from 127.0.0.1
</Directory>

Le ScriptAlias permet d'accéder au CGI de Nagios, et l'Alias au dossier des éléments WEB. Tel quel l'Alias ne laisse passer que les utilisateurs locaux. A vous de modifier cela pour ajouter de l'authentification, du SSL, etc.

Ensuite pour que cela fonctionne, nous allons faire une très vilaine chose, à savoir virer l'authentification du côté CGI de nagios. Pourquoi ? Disons qu'il n'y a pas grand intérêt à authentifier un service qui n'est accessible que localement ou alors est encrypté et authentifié. Du moins pour un usage domestique aucun. Pour faire cela, il faut simplement modifier la configuration /etc/nagios/cgi.cfg et mettre à 0 la valeur de use_authentication.

Ceci fait, nous pouvons redémarrer apache, puis démarrer le service nagios et enfin aller faire un tour sur le serveur à l'url /nagios pour voir la plus horrible interface que le monde ait connu depuis le WEB 0.1. Heureusement il est possible d'arranger cela en installant un look un peu plus moins-pire avec le paquet nagios-theme-nuvola.

Comme vous le voyez, nagios fonctionne "out of the box" avec une série de service (cpu, disques) en écoute de la machine locale. Voyons maintenant comment aller plus loin.

Configuration

Alors je vous préviens, le paramétrage de cet outil peut se révéler être une véritable expérience Kafkaïenne mais une fois réalisé, on dispose de quelque chose de fonctionnel, et pour longtemps.

Pour débuter, prenons un exemple simple. Imaginons que nous ayons un serveur nommé gaston et que nous voulions auditer la bonne marche de son service HTTP.

Nous allons commencer par créer un fichier /etc/nagios/servers/gaston.cfg chargé de décrire le serveur

define host{
  use                     linux-server
  host_name               gaston
  alias                   Le serveur Gaston
  address                 192.168.0.155
}
/etc/nagios/servers/gaston.cfg

Notre host est de type linux-server qui un template nagios qui porte bien son nom. Alias est le nom "humain" du serveur, il peut contenir des espaces mais c'est à peu près tout. Pas d'accents, pas de parenthèses, bref un véritable ascétisme syntaxique tendance ethno-centré US.

Autre détail, ne pensez même pas à formater le code à votre convenance. Par exemple, mettre la première accolade à la ligne entraînera un refus brutal de démarrage...

Pour tester notre configuration, plutôt que de relancer tout de suite le service nagios, nous pouvons d'abord la tester à la main :

root#nagios -v /etc/nagios/nagios.cfg
Nagios 3.0.3
Copyright (c) 1999-2008 Ethan Galstad (http://www.nagios.org)
Last Modified: 06-25-2008
License: GPL
 
Reading configuration data...
 
Running pre-flight check on configuration data...
 
Checking services...
Checked 8 services.
Checking hosts...
Checked 1 hosts.
Checking host groups...
Checked 1 host groups.
...
Total Warnings: 0
Total Errors: 0
 
Things look okay - No serious problems were detected during the pre-flight check
root# 

Là ça passe où ça casse mais au moins cela donne la ligne où ça plante. Une fois que tout est correcte, on peut redémarrer proprement le service nagios.

Il suffit ensuite d'aller sur l'URL de nagios, de faire un refresh pour voir un nouveau host apparaître. Dans un premier temps il apparaît en gris car la mise à jour des status est encore en file d'attente. Mais au bout de quelque temps cela devrait passer au vert.

Deuxième étape, ajouter un service à gaston en éditant à nouveau notre fichier gaston.cfg :

define service{
  use                             local-service
  host_name                       gaston
  service_description             Audit du site web de Gaston
  check_command                   check_http_text!Ceci est le site Web de Gaston
}
/etc/nagios/servers/gaston.cfg

L'idée de ce service est de vérifier si le serveur HTTP fonctionne sur gaston et que la page renvoyé contient la chaîne de caractère Ceci est le site Web de Gaston. En l'état cela ne marchera pas car il va encore falloir créer la commande Nagios check_http_text.

En effet Nagios est fournit avec une foultitude de plugins permettant de tester un grand nombre de services. Ces plugins, qui sont de simple exécutables stockés dans /usr/lib/nagios/plugins, ne sont pas reconnus directement. Il faut préalablement les déclarer dans le fichier /etc/nagios/objects/commands.cfg.

Ceci dit, là, nous cherchons la difficulté car une grande partie des plugins de base sont déjà configurés en commandes directement utilisable et nous aurions pu par exemple utiliser commande check_http, qui ne teste que la présence d'un serveur web, à la place check_http_text.

Mais pour nous faire la main, disons que nous avons absolument besoin de quelque chose de plus spécifique. Pour ajouter cette nouvelle commande, nous allons donc étendre le fichier commands.cfg :

define command{
        command_name    check_http_text
        command_line    $USER1$/check_http -H $HOSTADDRESS$  -R "$ARG1$"
        }
à la fin de /etc/nagios/objects/commands.cfg

La commande check_http_text va invoquer le plugin check_http avec comme premier paramètre l'adresse IP du serveur, et en second paramètre une expression régulière à vérifier dans la page de garde. Ce paramètre correspond à ce qui se trouve après le point d'exclamation dans le service que l'on a écrit un peu plus haut (check_http_text!Ceci est le site Web de Gaston). A noter que si nous avions créé une commande avec plusieurs paramètres, nous aurions rajouté des $ARG2$ ou $ARG3$ et aussi rajouté dans le service des paramètre précédé de leur point d'exclamation. Oui je sais, c'est totalement idiot comme formalisme...

Maintenant, on redémarre le service nagios et là sur la page WEB devrait apparaître notre nouveau service.

A ce stade, vous avez presque toute les billes pour configurer Nagios. C'est long, c'est fastidieux, on se trompe souvent mais on y arrive, du moins pour les service locaux et les services distants mais publiques (ex. http, ssh, etc.). Reste le cas des services locaux, d'un serveur distant.

Audit de services internes à distance

Imaginons que cette fois nous voulions connaître l'espace disque sur le serveur gaston. Pour réaliser une telle chose nous allons devoir passer par une couche de transport prise en charge par le paquet nrpe.

NRPE est un petit serveur qui va se mettre en écoute sur un port sur la machine distante et répondre aux requêtes de votre serveur Nagios. Lorsqu'il reçoit une demande, il va exécuter un plugin local et transmettre sa réponse à Nagios. Conséquence directe, nrpe a son propre fichier de configuration qui n'a rien à voir avec celui de nagios. Donc si vous pensiez pouvoir paramétrer cela à distance c'est raté.

Pour auditer à distance l'état des disques du serveur gaston, nous allons devoir commencer par y installer le service nrpe avec le paquet nrpe-plugin. Et sur la machine qui exécute Nagios, nous allons installer le plugin ET la commande nrpe provenant du paquet nagios-check_nrpe.

Sur la machine gaston, nous allons éditer le fichier /etc/nagios/nrpe.cfg et localiser la ligne contenant command[check_disk1]. Vous commencez à comprendre, cette ligne publie via nrpe un paramétrage spécifique du plugin check_disk qui pour l'instant utilise la partition /dev/hda1. Changer la référence de la partition pour, par exemple, auditer le répertoire /var en /dev/sda3. On remplace donc hda1 par sda3. Le reste ne change pas. Ensuite il faut sauver et redémarrer nrpe.

Maintenant nous allons ajouter un nouveau service à /etc/nagios/servers/gaston.cfg :

define service{
  use                             local-service
  host_name                       gaston
  service_description             Etat de la partition /var
  check_command                   check_nrpe!check_disk1
}
/etc/nagios/servers/gaston.cfg

Notez le paramètre !check_disk1, il va être transmis à la commande et remplacer l'argument $ARG1$ avant que le plugin nrpe soit exécuté. Le serveur gaston va recevoir la demande de plugin check_disk1 et va donc exécuter en local le plugin check_disk sur la partition /dev/sda3. Le résultat est renvoyé à nrpe, qui le revois au plugin nrpe sur la machine nagios qui va le rendre à nagios lui-même. ouf ! Dans la série pourquoi faire simple lorsque l'on peut faire compliqué...

Passage par SSH

Une manière de se passer de NRPE est d'utiliser SSH et une authentification par clef pour les deux deux utilisateurs nagios des deux machines. L'idée est assez simple, il s'agit de lancer, via ssh le plugin nagios distant par le biais d'une commande nagios conçue pour cela. Il faut toujours configuré de nouvelles commandes mais au moins cette configuration reste centralisée sur le serveur nagios et ne demande pas l'ouverture de ports supplémentaires.

Pour commencer, nous devons créer un plugin capable de relayer une commande sur une machine distante

#! /bin/sh

host=$1
shift
command=$*;
command=/usr/lib/nagios/plugins/$plugins$command
ssh $host "$command"
/usr/lib/nagios/plugins/ssh_check

Pas très sorcier. Ensuite disons que nous voulions auditer l'espace disque, nous allons ajouter une nouvelle commande :

  define command{
  command_name    check_disk
  command_line    $USER1$/ssh_check $HOSTADDRESS$  /check_disk -w 10% -c 5% -p /var -p /tmp -p /storage -p /  home -p /
}
objects/commands.cfg

Ceci fait, la commande s'utilise comme les autres et renvoie à Nagios les résultats distants sans broncher.

conclusion

Nagios n'est clairement pas un outil pour newbies. Mais une fois le paramétrage en main il se révèle être d'une grande souplesse. De plus son système de greffons permet de l'étendre très simplement. Si vous comptez aller plus loin avec Nagios, je vous conseille d'aller regarder par ici.

Commentaires

Dab, le 4 July, 2007 - 11:12

Quelques observations en vrac ....
Son prédécesseur n'est pas allsaint mais Netsaint.
La verif de la config ne se fait pas par nagios -d mais nagios -v. On peut aussi optimiser l'ordonnanceur avec un nagios -s.
Pour NRPE je te conseille d'ajouter des arguments à la définition de la commande:

command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -t 30 -c $ARG1$ -a $ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$ $ARG7$

En effet la config de nagios est un peu lourde mais elle est très souple. Ainsi tu peux très bien demander le controle de l'accès à une base de données toute les 3 mn, tous les jours de 8h à 17h et en cas de pb avertir par mail l'équipe de production les jours de la semaine et sur téléphone astreinte le samedi et dimanche mais pas avant midi:)
Tu peux aussi récupérer les données fournies par les services, les stocker en base RRD et en tirer des graphes.
Pour une config plus graphique, regarde du coté de http://www.oreon-project.org et pour d'autres plugins non officiel http://www.nagiosexchange.org ... tu y trouvera surement ton bonheur

Ulhume, le 4 July, 2007 - 15:00

Je te remercie pour tes remarques et conseils, c'est corrigé.

Pour ce qui est de la configuration de Nagios, ce n'est pas sa souplesse que je conteste plus mais son langage. La conception de ce produit se veut très "orientée objet" et le langage, lui, pas du tout... En conséquence tu passes un peu ta vie à croiser des références (de hostname par exemple) dans tous les sens. Un syntaxe XML me paraîtrait un peu plus logique :

<host name="...">
  <service name="...">
  </service>
</host>

Cela n'empêche pas de faire des références le cas échéant pas cela conserve une fluidité de lecture pour le cas le plus général.

Autre aspect étrange, le fait qu'il y ait une relation 1:1 entre IP et host. J'ai nombre de hosts ayant plusieurs IP, ou pire, une seule IP pour plusieurs services hébergés par plusieurs hosts en fonction du port. Dans ce cas, il faut faire fleurir des commandes spécifiques avec les IP/Ports en plus. Rien d'impossible, mais une certaine complexité à la relecture.

Mon but n'est pas de "casser" nagios qui fait très bien le job, mais juste de me demander comment il pourrait évoluer pour plus d'efficacité

En d'autres terme, il y a deux paradigmes possibles, Soit la description de la topologie d'un réseau, ce que cherche à faire Nagios mais en ce cas, la syntaxe de suit pas bien. Soit définir des agents/sondes que tu organises par famille, pourquoi pas géographique. Lorsque je regarde la syntaxe de Nagios, j'ai l'impression d'un "entre les deux".

Sinon, j'ai essayé le produit d'Oreon... Franchement c'est pas terrible. Zero support postgresql, un système de pooling des logs pour alimenter leur base. Je ne suis sûrement pas allé assez loin mais le produit m'a clairement déçu.

Dab, le 4 July, 2007 - 16:52

Si tes machines ont plusieurs adresses IP j'imagine que celles-ci sont traduits avec enregistrements DNS différents, il est donc judicieux de créer plusieurs hosts dans Nagios non ? Migration d'une ip virtuelle sur une autre machine => pas de modif de la conf de Nagios
Sinon tu peux déclarer une machine avec plusieurs adresses IP : address 192.168.1.1,192.168.1.2

Pour le PAT je n'ai pas été confronté à ce pb et ne vois pas très bien comment procéder puisque le controle (via NRPE) se fait sur un seul port. (a moins de déclarer plusieurs commande nrpe sur des ports différents mais là ça devient lourd dingue.). Dans tous les cas tu aurais eu le même pb avec n'importe quel outil de supervision.

L'idée du XML : il semble que kk1 ai eu la même Wink http://blog.nicolargo.com/2007/04/de-nagios-a-xml.html

Oréon je l'avais rapidement testé à une époque mais au final j'aime autant remplir mes fichiers de conf à la mano ou par des petits scripts. Pour y voir un peu plus clair j'ai créé autant de fichiers de conf qu'il y a de machines à contrôler, ceux-ci étant stockés dans des répertoires relatif à l'OS des machines.

mes_conf/linux/hosts.cfg
mes_conf/linux/hostgroups.cfg
mes_conf/linux/services-machine1.cfg
mes_conf/linux/ ...
mes_conf/windows/ ...

suffit ensuite d'ajouter à ton nagios.cfg des lignes du type:

cfg_dir=/etc/nagios/mes_conf/linux
cfg_dir=/etc/nagios/mes_conf/windows

voili voilà ...

Ulhume, le 4 July, 2007 - 18:24

Pas mal le coup du convertisseur XML. Comme quoi il faut toujours chercher avant de faire Wink

Sinon pour le coup du multi-IP, comment tu fais pour les services qui utilisent $HOSTADDRESS$, ils se prennent les deux comme déclaré ?

PAT ? Ça veut dire quoi ?

Dans tous les cas, l'idée du script va faire son chemin je pense. Tu as l'air d'utiliser Nagios pour ton taf, moi c'est pour mes 4 misérables serveurs Wink Mais au fond la contrainte est là même vu que j'ai 0 temps pour de l'exploitation et de l'audit manuel ...

NB: En réalité j'ai commencé il y a un petit moment un outil en java qui fait peu ou prou le job de nagios. Vu que je n'ai pas encore eu le temps de le terminé, j'utilise Nagios pour tester ce qui se fait en live. Dans mon approche je décrit plus les services que les machines (en xml) et les senseurs sont plus orientés performance que fonctionnement (en gros perf à -1 = Warning -2 = Critique). Ce qui me permet de faire d'une pierre deux coups en quelque sorte.

malic , le 30 October, 2008 - 10:15

Quite à mettre une usine à gaz comme nagios pour la maison, autant passer à centreon... ça vous évitera de mettre trop le nez dans les fichiers de conf.

Attention, par contre c'est peut être aller une peu loin pour une maison mais plus c'est simple, plus c'est facilement mobile, remplaçable, manipulable et surtout moins addictif.

malic , le 30 October, 2008 - 10:20

Tu avais déjà regarder Centreon, j'avais pas lu le commentaire.

< note pour plus tard : lire les commentaires en plus de l'article

ahem..

Ulhume, le 30 October, 2008 - 10:41

@malic yep j'avais déjà regardé mais il y a plus d'un an pour la première version de ce billet. Et c'était à mon sens une usine à gaz encore pire que Nagios tout seul, avec nécessité de mettre en place une base forcement mySql (je suis en Postgres). Faudrait que je le reteste dans une nouvelle version, mais basiquement centreon est juste un wrapper autour de nagios.

Dab, le 30 October, 2008 - 10:56

...Quite à mettre une usine à gaz comme nagios pour la maison, autant passer à centreon...
hmmmm... ça restera une usine à gaz ... avec des surcouches supplémentaires ... par contre il y a Munin très simple de mise en oeuvre.
nota :... à lancer à travers de le réseau et de l'agrégation des résultats dans une base de donnée ... Par défaut il ne fait pas d'agrégation en base mais tout est possible via 'process_performance'

Ulhume, le 30 October, 2008 - 10:55

@Dab dommage que je n'ai pas connu munin plus tôt Arf

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...