<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1157"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1157/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1157/atom/feed</id>
  <updated>2008-10-30T00:44:18+01:00</updated>
  <entry>
    <title>Supervision domestique avec Nagios</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1157" />
    <id>http://artisan.karma-lab.net/node/1157</id>
    <published>2008-10-30T00:42:31+01:00</published>
    <updated>2008-10-30T00:44:18+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Serveurs" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  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 <kbd>Nagios</kbd>. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  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 <kbd>Nagios</kbd>. 
</p>
<!--break-->

	<a name='chapter_13'></a>
  <h2>Présentation</h2>
	

<p>
<image file="nagios.png" width="300px"/>
  <a class='external' target='_blank' href='http://www.nagios.org' >Nagios</a>, 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.
</p>

<p>
  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.  
</p>
<p>
  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.
</p>


	<a name='chapter_14'></a>
  <h2>Installation</h2>
	
<p>
  Sous Mandriva il suffit d'installer le paquet <kbd>nagios-www</kbd> 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 :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  ScriptAlias /nagios/cgi-bin /usr/lib/nagios/cgi<br />
<br />
<span class="sc3"><span class="re1">&lt;Directory</span> /usr/lib/nagios/cgi<span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; Options ExecCGI<br />
&nbsp; &nbsp; order deny,allow<br />
&nbsp; &nbsp; deny from all<br />
&nbsp; &nbsp; allow from 127.0.0.1<br />
<span class="sc3"><span class="re1">&lt;/Directory<span class="re2">&gt;</span></span></span><br />
<br />
Alias /nagios /usr/share/nagios<br />
<br />
<span class="sc3"><span class="re1">&lt;Directory</span> /usr/share/nagios<span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; Options None<br />
&nbsp; &nbsp; order deny,allow<br />
&nbsp; &nbsp; deny from all<br />
&nbsp; &nbsp; allow from 127.0.0.1<br />
<span class="sc3"><span class="re1">&lt;/Directory<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
  Le <kbd>ScriptAlias</kbd> permet d'accéder au CGI de Nagios, et l'<kbd>Alias</kbd> 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'<a class='external' target='_blank' href='/node/22' >authentification</a>, du SSL, etc. 
</p>
<p>
  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 <kbd>/etc/nagios/cgi.cfg</kbd> et mettre à <kbd>0</kbd> la valeur de <kbd>use_authentication</kbd>.
</p>
<p>
<image file="horrible.png" width="200px"/>
  Ceci fait, nous pouvons redémarrer apache, puis démarrer le service <kbd>nagios</kbd> et enfin aller faire un tour sur le serveur à l'url <kbd>/nagios</kbd> 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 <kbd>nagios-theme-nuvola</kbd>.
</p>
<p>
  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. 
</p>


	<a name='chapter_15'></a>
  <h2>Configuration</h2>
	
<p>
  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.  
</p>
<p>
 Pour débuter, prenons un exemple simple. Imaginons que nous ayons un serveur nommé <kbd>gaston</kbd> et que nous voulions auditer la bonne marche de son service HTTP. 
</p>
 
<p>
 Nous allons commencer par créer un fichier <kbd>/etc/nagios/servers/gaston.cfg</kbd> chargé de décrire le serveur 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  define host{<br />
&nbsp; use &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; linux-server<br />
&nbsp; host_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gaston<br />
&nbsp; alias &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Le serveur Gaston<br />
&nbsp; address &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 192.168.0.155<br />
}
  </div>
  <div class='caption'>/etc/nagios/servers/gaston.cfg</div>
  </div>
</p>
<p>
  Notre <kbd>host</kbd> est de type <kbd>linux-server</kbd> qui un template nagios qui porte bien son nom. <kbd>Alias</kbd> 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.
</p>
<p>
  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...
</p>
<p>
  Pour tester notre configuration, plutôt que de relancer tout de suite le service <kbd>nagios</kbd>, nous pouvons d'abord la tester à la main :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>nagios -v /etc/nagios/nagios.cfg</div><div class='result'>Nagios 3.0.3</div><div class='result'>Copyright (c) 1999-2008 Ethan Galstad (http://www.nagios.org)</div><div class='result'>Last Modified: 06-25-2008</div><div class='result'>License: GPL</div><div class='result'>&nbsp;</div><div class='result'>Reading configuration data...</div><div class='result'>&nbsp;</div><div class='result'>Running pre-flight check on configuration data...</div><div class='result'>&nbsp;</div><div class='result'>Checking services...</div><div class='result'>Checked 8 services.</div><div class='result'>Checking hosts...</div><div class='result'>Checked 1 hosts.</div><div class='result'>Checking host groups...</div><div class='result'>Checked 1 host groups.</div><div class='result'>...</div><div class='result'>Total Warnings: 0</div><div class='result'>Total Errors:   0</div><div class='result'>&nbsp;</div><div class='result'>Things look okay - No serious problems were detected during the pre-flight check</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  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 <kbd>nagios</kbd>. 
</p>
<p>
  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. 
</p>

<p>
  Deuxième étape, ajouter un service à <kbd>gaston</kbd> en éditant à nouveau notre fichier <kbd>gaston.cfg</kbd>  :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  define service{<br />
&nbsp; use &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local-service<br />
&nbsp; host_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gaston<br />
&nbsp; service_description &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Audit du site web de Gaston<br />
&nbsp; check_command &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_http_text!Ceci est le site Web de Gaston<br />
}
  </div>
  <div class='caption'>/etc/nagios/servers/gaston.cfg</div>
  </div>
</p>
<p>
  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 <kbd>Ceci est le site Web de Gaston</kbd>. En l'état cela ne marchera pas car il va encore falloir créer la commande Nagios <kbd>check_http_text</kbd>. 
</p>
<p>
  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 <kbd>/usr/lib/nagios/plugins</kbd>, ne sont pas reconnus directement. Il faut préalablement les déclarer dans le fichier <kbd>/etc/nagios/objects/commands.cfg</kbd>. 
</p>
<p>
  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 <kbd>check_http</kbd>, qui ne teste que la présence d'un serveur web, à la place <kbd>check_http_text</kbd>.
</p>
<p>
  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 <kbd>commands.cfg</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  define command{<br />
&nbsp; &nbsp; &nbsp; &nbsp; command_name &nbsp; &nbsp;check_http_text<br />
&nbsp; &nbsp; &nbsp; &nbsp; command_line &nbsp; &nbsp;$USER1$/check_http -H $HOSTADDRESS$ &nbsp;-R &quot;$ARG1$&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }
  </div>
  <div class='caption'>à la fin de /etc/nagios/objects/commands.cfg</div>
  </div>
</p>
<p>
  La commande <kbd>check_http_text</kbd> va invoquer le plugin <kbd>check_http</kbd> 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 (<kbd>check_http_text!Ceci est le site Web de Gaston</kbd>). 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...
</p>
<p>
  Maintenant, on redémarre le service <kbd>nagios</kbd> et là sur la page WEB devrait apparaître notre nouveau service. 
</p>
<p>
  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. 
</p>


	<a name='chapter_16'></a>
  <h2>Audit de services internes à distance</h2>
	
<p>
  Imaginons que cette fois nous voulions connaître l'espace disque sur le serveur <kbd>gaston</kbd>. Pour réaliser une telle chose nous allons devoir passer par une couche de transport prise en charge par le paquet <kbd>nrpe</kbd>.
</p>
<p>
 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, <kbd>nrpe</kbd> 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é. 
</p>
<p>
  Pour auditer à distance l'état des disques du serveur <kbd>gaston</kbd>, nous allons devoir commencer par y installer le service <kbd>nrpe</kbd> avec le paquet <kbd>nrpe-plugin</kbd>. Et sur la machine qui exécute Nagios, nous allons installer le plugin ET la commande <kbd>nrpe</kbd> provenant du paquet <kbd>nagios-check_nrpe</kbd>.
</p>
<p>
  Sur la machine <kbd>gaston</kbd>,  nous allons éditer le fichier <kbd>/etc/nagios/nrpe.cfg</kbd> et localiser la ligne contenant <kbd>command[check_disk1]</kbd>. Vous commencez à comprendre, cette ligne publie via <kbd>nrpe</kbd> un paramétrage spécifique du plugin <kbd>check_disk</kbd> qui pour l'instant utilise la partition <kbd>/dev/hda1</kbd>. Changer la référence de la partition pour, par exemple, auditer le répertoire <kbd>/var</kbd> en <kbd>/dev/sda3</kbd>. On remplace donc <kbd>hda1</kbd> par <kbd>sda3</kbd>. Le reste ne change pas. Ensuite il faut sauver et redémarrer <kbd>nrpe</kbd>.
</p>

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

  <div class='code-block code-block-fragment'>
  <div class='container'>
  define service<span class="br0">&#123;</span><br />
&nbsp; use &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local-service<br />
&nbsp; host_name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gaston<br />
&nbsp; service_description &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Etat de la partition <span class="sy0">/</span>var<br />
&nbsp; check_command &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check_nrpe<span class="sy0">!</span>check_disk1<br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>/etc/nagios/servers/gaston.cfg</div>
  </div>
</p>
<p>
  Notez le paramètre <kbd>!check_disk1</kbd>, il va être transmis à la commande et remplacer l'argument <kbd>$ARG1$</kbd> avant que le plugin nrpe soit exécuté. Le serveur <kbd>gaston</kbd> va recevoir la demande de plugin <kbd>check_disk1</kbd> et va donc exécuter en local le plugin <kbd>check_disk</kbd> sur la partition <kbd>/dev/sda3</kbd>. 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é...
</p>


	<a name='chapter_17'></a>
  <h2>Passage par SSH</h2>
	
<p>  
  Une manière de se passer de NRPE est d'utiliser <a class='external' target='_blank' href='/node/82' >SSH et une authentification par clef pour les deux deux utilisateurs nagios des deux machines</a>. 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. 
</p>
<p>
  Pour commencer, nous devons créer un plugin capable de relayer une commande sur une machine distante 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<br />
<span class="re2">host=</span>$<span class="nu0">1</span><br />
<span class="kw3">shift</span><br />
<span class="re2">command=</span><span class="re4">$*</span>;<br />
<span class="re2">command=</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>nagios<span class="sy0">/</span>plugins<span class="sy0">/</span><span class="re1">$plugins</span><span class="re1">$command</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ssh"><span class="kw2">ssh</span></a> <span class="re1">$host</span> <span class="st0">&quot;$command&quot;</span>
  </div>
  <div class='caption'>/usr/lib/nagios/plugins/ssh_check</div>
  </div>
</p>
<p>
  Pas très sorcier. Ensuite disons que nous voulions auditer l'espace disque, nous allons ajouter une nouvelle commande :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; define <span class="kw3">command</span><span class="br0">&#123;</span><br />
&nbsp; command_name &nbsp; &nbsp;check_disk<br />
&nbsp; command_line &nbsp; &nbsp;<span class="re1">$USER1</span>$<span class="sy0">/</span>ssh_check <span class="re1">$HOSTADDRESS</span>$ &nbsp;<span class="sy0">/</span>check_disk -w <span class="nu0">10</span><span class="sy0">%</span> -c <span class="nu0">5</span><span class="sy0">%</span> -p <span class="sy0">/</span>var -p <span class="sy0">/</span>tmp -p <span class="sy0">/</span>storage -p <span class="sy0">/</span> &nbsp;home -p <span class="sy0">/</span><br />
<span class="br0">&#125;</span>
  </div>
  <div class='caption'>objects/commands.cfg</div>
  </div>
</p>
<p>
  Ceci fait, la commande s'utilise comme les autres et renvoie à Nagios les résultats distants sans broncher. 
</p>


	<a name='chapter_18'></a>
  <h2>conclusion</h2>
	
<p>
  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 <a class='external' target='_blank' href='http://blog.nicolargo.com/' >ici</a>.
</p>
    ]]></content>
  </entry>
</feed>
