Nagios est un formidable outil permettant de gérer d'immenses parcs de machine, d'afficher des plans d'architecture, des rapports d'erreurs, etc. Maintenant lorsque l'on a dans son "parc" personnel deux pauvres serveurs qui se battent en duel, passer des heures à paramétrer et maintenir un tel système n'est pas forcement rentable. Maintenant refaire soi-même à la main toute cette mécanique ne l'est pas non plus, voici donc une voie du milieu.
Comme nous l'avons déjà vu, Nagios est un système de supervision évolué, doté d'une interface WEB, d'une très dense bibliothèque de greffons, d'une base de donnée et de tout le tremblement. Pour zapper joyeusement la case "je me prends la tête avec la configuration", on peut légitiment se demander s'il est pas possible de détourner ces greffons pour un usage un peu plus simpliste.
Prenons l'exemple du greffon qui fait "ping" (c'est le greffon le plus dispendieux de l'établissement !). Il se trouve dans le dossier /usr/share/nagios/plugins sous le nom check_ping. Tentons de le lancer avec les paramètres qui vont bien, ceux que l'on trouve dans /etc/nagios/objects/commands.cfg
Nous constatons d'abord qu'un greffon nagios est une simple commande qui communique avec son maître par le biais d'une ligne écrite dans la sortie standard et du code d'erreur retourné.
La ligne comporte une petite section précédant le signe - qui indique le nom du test, PING, et le status OK, WARNING ou CRITICAL. Après nous avons des indications sur ce qui c'est passé jusqu'au signe |, puis ce sont des mesures permettant d'évaluer les performances du test.
Le code de retour est très logiquement 0 si tout va bien et autre chose si ça coince.
Sachant que tous les greffons se comportent exactement de la même manière, que dans la majorité des cas les appeler avec -h en paramètre nous en donne la syntaxe, et que le cas échéant nous avons le fichier commands.cfg pour s'aider, pourquoi ne pas écrire un petit programme tout bête dont le seule rôle sera d'encapsuler le lancement de ces plugins et écrire dans la sortie standard en cas d'erreur.
Je rappelle qu'ici le but est de travailler avec deux pauvres machines, et que tout ceci n'est qu'une glutte adaptée à ce contexte et ce contexte uniquement, pas la peine de venir me faire la morale
Tant qu'à faire, autant améliorer un aspect qui me fatigue un peu (ou peut-être suis-je trop fatigué pour savoir comment faire) avec Nagios. Le cas est assez simple, lorsque je décris les services de la machine A, une partie de ceux-ci sont locaux, d'autres sont publiques. Par exemple la charge CPU est locale, un serveur HTTP est publique. Pour tester le service HTTP de ma machine A, il est plus fiable de ce placer sur la machine B et regarder si ce service fonctionne que de rester sur A. Mon point de vue sur le service sera donc de B sur A. Et lorsque je cherche à vérifier la charge, je vais rester sur A, il sera donc de A sur A.
In extenso, si je cherche à tester les services locaux de la machine B qui n'est pas celle qui exécute les tests (machine A). Mes services locaux sont à réaliser avec un point de vue de B sur B.
Dans mon petit code, pour chaque test je vais donc définir un point de vue. S'il est "local" (cas par défaut), c'est qu'il part de la machine qui teste vers la machine à tester. S'il est "remote", il part de la machine à tester vers elle-même. Et s'il est "autre chose", il par de n'importe quelle machine du réseau vers la machine à tester.
Après c'est au code de se débrouille pour lancer le greffon réellement localement, ou par l'intermédiaire d'un canal SSH vars la machine source du point de vue. Je pars donc du principe que les machines qui se surveillent ont leurs clefs correctement configurées.
Comme pour le backup via rdiff, l'idée est de régler cela en le minimum de ligne, mais en perl cette fois. D'ailleurs j'ai prévu de tout migrer définitivement vers ce langage, du moins tout ce qui relève du domaine du script.
Je ne vais pas vider le code ici, il n'a absolument aucun interêt, il ne fait, comme pour le backup, que fournir des fonctions qui vont être utilisées par un script principal, celui de supervision. Pour récuperer, vous pouvez aller ici.
Pour notre script de supervision, les choses sont ultra simples, nous disposons d'une commande pour définir le destinataire des alertes (define_alert), d'une autre pour définir une machine (define_host) et enfin d'une dernière pour ajouter un test (add_test). Après le tout est de prendre la bonne syntaxe et les bons greffons.

Avouez que c'est un peu moins compliqué qu'une configuration Nagios au grand complet. En plus l'immense avantage est qu'en lançant ce script, vous savez tout de suite s'il fonctionne. Dés qu'une erreur est détectée, un message écrit dans la sortie standard. De même une liste de tous les états de toutes les machines est maintenue dans le fichier /var/lib/supervision (prendre soin de créer ce dossier avant de lancer le script).
Ensuite, il ne vous reste plus qu'à mettre cela dans une entrée du CRONTAB sur une période correspondant à vos besoins. L'utilisation de CRON permet de prendre en charge les erreurs et de les envoyer par mail à qui de droit.
Même si "supervision du pauvre" porte ici bien son nom, cela reste une approche pragmatique et très rentable car utilisant à plein tous les greffons de Nagios. Après de nombreuses petites optimisations sont possible mais en l'état cette librairie répond déjà, et ce depuis un certain temps déjà, à mes modestes besoins.
- répondre
plouf , le 7 November, 2008 - 20:39J'adore le clin d'œil aux Monty Python...
J'aime bien ton approche, je ne suis pas non plus convaincu de l'utilité d'un Nagios dans un mini-parc (je suis un peu dans le même cas).
Je vais essayer d'approfondir un peu mais au premier abord ta méthode me semble quand même un peu trop légère (c'est mon point de vue hein).
En tout cas il me semble indispensable d'avoir un petit système de graphique à la MRTG en plus.
On dirait qu'il n'est pas possible de récupérer le nagios.pm sans s'identifier...
- répondre
Ulhume, le 7 November, 2008 - 22:05@plouf hey, j'étais pas sur que quelqu'un la verrais
La bonne question c'est indispensable pour quoi ? Si je compte j'ai au max 20 services sur 2 machines, je ne saurais même pas que faire comme graphique. Alors avoir une application web pour cela. Je trouve aussi bien d'être prévenu si la bande passante est trop occupée (attaque de spams) ou si un service est tombé (au hasard spamd
. J'ai utilisé Nagios pendant très longtemps et au final le seul truc que j'utilisais étaient les alertes par mail, j'allais jamais sur l'appli. Enfin comme tu le dit c'est mon point de vue, je deviens minimaliste avec le temps, faut que ça réponde au besoin sans fioriture et sans me casser les pied 
Maintenant rien ne t'empêche de modifier la procédure d'acquisition pour alimenter une base RRD et utiliser cela avec un cacti.
PS: il devrait plus te demander de mot de passe.
- répondre
Dab, le 8 November, 2008 - 00:02Heu question conne, mais pourquoi ne pas simplement mettre les checks en cron ?
... Pour ce qui me concerne je ne controle rien 
(Tests immédiats et envoi mail géré par cron). Sinon bien que je sois daccord quant à l'utilité d'un nagios @home, c'est tout de même pas si terrible. définition d'une machine, de service, d'un utilisateur et basta
- répondre
Ulhume, le 8 November, 2008 - 04:28@Dab Cela m'économisait juste l'envoie de mail, dans tous les cas j'avais besoin de scripter les appels ssh. Mais sur le fond tu as absolument raison.
Sinon concernant la nécessité du contrôle, pour l'intra, c'est surtout de la tranquillité d'esprit (d'où le côté overkill d'un nagios). Lorsque je modifie un paramétrage, met à jour, etc, je n'ai pas à me poser de question tant que la supervision, que grâce à ce système je peux aussi lancer à la main, ne couine pas pour l'absence d'un service essentiel. C'est assez important pour nous car nous sommes deux à compter dessus en clientèle (serveur de fichier, distribution du courrier,etc.). Et vu qu'on est tout deux plus ou moins indep, c'est aussi notre serveur "pro".
Sinon pour la dédibox qui est en quelque sorte notre DMZ, vu ce qu'elle se prend dans la tête ne serais-ce qu'avec les spams, tout linux qu'elle est, y'a des services qui tombent de temps à autre (spamd, postfix en tête). Et là on est de 3 à 5 à l'utiliser et je ne peux pas attendre que les boîtes se fassent inonder de cochonneries. Du coup quant ça tombe je me prend un petit mail sur l'intra et si je suis pas loin d'une console, je peux remonter le service rapido. C'est aussi pas mal pour vérifier qu'un zouave n'est pas en train de mirrorer artisan à la hussarde
Bref c'est un gros plus, pas totalement indispensable mais qui me simplifie beaucoup la vie vu pour des serveurs que je ne suis pas le seul à utiliser mais que je suis seul à maintenir.
- répondre
Dab, le 8 November, 2008 - 10:16Ah ok je comprends mieux ton besoin ... je serais plutot fier si quelqu'un mirrorait mon site
(pour ça un petit wget avec les options qui vont bien passe incognito)
- répondre
Ulhume, le 8 November, 2008 - 10:48@Dab ça me fait plaisir mais avec une limitation de bp, pas à fond la caisse
- répondre
lawl , le 9 November, 2008 - 14:39Avec nagios si on veux tester des services localement sur un serveur distant on se sert de nrpe ou nsclient.
- répondre
Ulhume, le 9 November, 2008 - 16:04@lawl Oui je sais (cf article précédent sur Nagios "normal" donné en ien en introduction). Mais quel intérêt ais-je à installer un serveur supplémentaire sur une bécane alors qu'un ssh fait tout aussi bien l'affaire ? En plus c'est sécurisé, compressé, et ça marche pour le reste (accès console, sftp, backups, etc.) donc une configuration pour tous.
C'est un peu l'adage "pourquoi faire simple quant on peut faire compliqué ton histoire"
- répondre
lawl , le 9 November, 2008 - 17:53je répond juste à :
"Tant qu'à faire, autant améliorer un aspect qui me fatigue un peu (ou peut-être suis-je trop fatigué pour savoir comment faire) avec Nagios"
- répondre
Ulhume, le 9 November, 2008 - 18:37@lawl oui mais ce moment ce n'est pas ce que j'ai voulu dire. Ce qui me manque avec Nagios c'est une manière simple, dans le cadre de la définition du service d'un host d'utiliser une 3ième machine comme point de lancement du test. Alors ceci dit oui, en collant nrpe sur la 3ième machine, et en créant une commande spécifique ça doit être jouable, mais c'est globalement pas simple (au sens direct).
Poster un nouveau commentaire