Surveillance système des machines sur un réseau avec Munin
Date de publication : 14/10/2006 , Date de mise à jour : 13/07/2007
Par
Nicolas Vallée (Home Page)
Surveiller de manière simple l'activité de tous les services importants sur son réseau...
I. Introduction
II. Mise en place
II-1. Installation
II-2. Configuration des services
II-2-1. Le serveur principal
II-2-2. Un noeud
III. Personnaliser Munin
III-1. Développer ses plugins
III-1-1. Description du graphe
III-2. Vérifier le bon fonctionnement
III-1-3. Exemple de plugin complet
III-2. Personnaliser les pages web
IV. Divers
Pour Windows
IV-1. Exemple
IV-2. Liens utiles
I. Introduction
Munin est un outil de surveillance basé sur le célèbre
RRDTool, permettant de connaître toutes les données systèmes des autres ordinateurs du réseau. Il les présente automatiquement sous forme de graphiques consultables depuis une page web. Par ailleurs, il dispose d'un système de plugins qui le rend simple d'utilisation et très modulaire.
J'ai choisi de le présenter, et non certains de ses concurrents comme
Nagios,
Cacti ou
Zabbix, car il m'a semblé être le plus simple d'utilisation tout en conservant de fortes possibilités d'adaptation.
Un système Munin est composé de :
- un serveur principal, récupérant les informations
- un noeud par équipement à surveiller
Il faut signaler qu'avec une telle architecture Munin se différencie de Nagios. Ce dernier préfère en effet centraliser toutes les mesures sur le serveur, ce qui permet de ne rien installer sur les équipements surveillés.
Comme souvent, j'ai choisi de vous détailler l'installation sur le système Debian, mais tout peut s'appliquer à un autre Unix. J'ai d'ailleurs joué avec cet outil sur les systèmes Debian, FreeBSD et NetBSD.
II. Mise en place
II-1. Installation
Sur le serveur principal, il suffit d'installer l'outil de récupération des données.
Sur les noeuds, il faut installer un service pouvant répondre à tout moment à une requête de recupération d'informations. Bien sûr, le serveur principal peut aussi être l'un des noeuds ;)
apt-get install munin-node
|
II-2. Configuration des services
II-2-1. Le serveur principal
Il n'y a que quelques points à configurer... mais il faut laisser le reste intact.
- le chemin absolu du dépôt des rapports sous format HTML
- chaque noeud à surveiller
| /etc/munin/munin.conf |
# depot des rapports
htmldir /var/www/munin
# liste des machines a surveiller
[monitor.domain.com]
address 192.168.0.1
use_node_name yes
[other-machine.domain.com]
address 192.168.0.2
use_node_name yes
|
Il faut maintenant mettre en place de quoi aller récupérer régulièrement les données sur les noeuds. Pour cela, on édite la table de cron de l'utilisateur lançant munin, ce n'est pas toujours munin... via la commande su -u munin -e
| crontab |
*/5 * * * * /usr/bin/munin-cron
|
II-2-2. Un noeud
Sur le noeud, la seule chose importante à configurer est l'adresse du serveur qui surveille le réseau. Le reste peut être laisser aux valeurs par défaut
| /etc/munin/munin-node.conf |
# autoriser les connexions depuis le serveur principal
allow ^192\.168\.0\.1$
|
 |
Quand vous installez un nouveau plugin, pensez à vérifier que l'utilisateur sous lequel tourne Munin a le droit de l'exécuter... ça évite de perdre 3 mois avant de publier son tuto ;)
|
 |
Pensez à laisser passer les appels sur le port tcp 4949 sur chacun de vos noeuds au niveau de votre pare-feu... sinon le serveur principal ne pourra pas récupérer les données.
|
 |
Vérifiez que l'utilisateur lançant le serveur munin-node n'ait pas . dans sa variable d'environnement PATH... sinon il faut appliquer un patch au module Net-Server de Perl. J'ai eu ce problème sous FreeBSD :'(
|
III. Personnaliser Munin
III-1. Développer ses plugins
Pour développer un nouveau plugin, on doit faire un programme qui selon son premier argument répond :
| Argument en entrée |
Réponse du plugin |
| autoconf |
si tout est ok, on répond yes ; sinon on répond no (message d'erreur) |
| config |
on renvoie les paramètres qui décrivent le graphe |
| n'importe quoi d'autre |
on renvoie les valeurs des paramètres à surveiller |
III-1-1. Description du graphe
On commence par donner le titre.
graph_title Very Secure FTP server
|
Ensuite, on donne les éléments standards des graphes. Ceux sont les arguments passés à rrdgraph.
On dit que l'on aura un graphe gradué sur 1000 unités, et commençant à 0.
graph_args --base 1000 -l 0
graph_vlabel requests
|
Puis, on donne la section à laquelle appartient ce plugin.
Enfin, on donne les infos de chaque donnée à surveiller :
- le nom à afficher,
- le type de suivi (DERIVE pour observer les variations depuis le dernier enregistrement, COUNTER pour observer la valeur affichée... argument passé à rrdcreate),
- et le minimum.
connections.label connections
connections.type DERIVE
connections.min 0
|
Pour avoir toutes les options, regardez ce
lien.
III-2. Vérifier le bon fonctionnement
Sur la machine noeud, donc ayant le plugin en local, faîtes ceci
$ munin-run vsftpd
connections.value 0
|
Sur le serveur, voilà comment le tester... en supposant que le plugin soit sur le machine foo.example.com
$ su -s /bin/bash munin
$ /usr/share/munin/munin-update --debug --nofork --stdout --host foo.example.com --service vsftpd
Aug 11 22:39:51 - [6846] Updating /var/lib/munin/example.com/foo.example.com-vsftpd-connections-g.rrd with 0
|
III-1-3. Exemple de plugin complet
Voici un exemple de plugin pour surveiller vsftpd... programmé en perl ;)
| /usr/share/munin/plugins/vsftpd |
my $logfile = exists $ENV{'logfile'} ? $ENV{'logfile'} : "/var/log/vsftpd.log";
my $ret = undef;
open(my $logs, '<', $logfile) or $ret = "access to the file $logfile";
if ( exists $ARGV[0] and $ARGV[0] eq "autoconf" )
{
if ($ret)
{
print "no ($ret)\n";
exit 1;
}
print "yes\n";
exit 0;
}
if ( exists $ARGV[0] and $ARGV[0] eq "config" )
{
print "graph_title Very Secure FTP server\n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel requests\n";
print "graph_category other\n";
print "connections.label connections\n";
print "connections.type DERIVE\n";
print "connections.min 0\n";
print "login_successes.label successful_logins\n";
print "login_successes.type DERIVE\n";
print "login_successes.min 0\n";
print "login_failures.label failed_logins\n";
print "login_failures.type DERIVE\n";
print "login_failures.min 0\n";
print "upload_successes.label successful_uploads\n";
print "upload_successes.type DERIVE\n";
print "upload_successes.min 0\n";
print "upload_failures.label failed_uploads\n";
print "upload_failures.type DERIVE\n";
print "upload_failures.min 0\n";
print "download_successes.label successful_downloads\n";
print "download_successes.type DERIVE\n";
print "download_successes.min 0\n";
print "download_failures.label failed_uploads\n";
print "download_failures.type DERIVE\n";
print "download_failures.min 0\n";
print "deletion_successes.label successful_deletions\n";
print "deletion_successes.type DERIVE\n";
print "deletion_successes.min 0\n";
print "deletion_failures.label failed_deletions\n";
print "deletion_failures.type DERIVE\n";
print "deletion_failures.min 0\n";
exit 0;
} else {
my ($nbConnect, $nbOKLogin, $nbFailLogin) = (0,0,0);
my ($nbOKUpload, $nbFailUpload, $nbOKDownload, $FailDownload) = (0,0,0,0);
my ($nbOKDelete, $nbFailDelete) = (0,0);
while (my $line = <$logs>) {
$nbConnect++ if ($line =~ "CONNECT");
$nbOKLogin++ if ($line =~ "OK LOGIN");
$nbFailLogin++ if ($line =~ "FAIL LOGIN");
$nbOKUpload++ if ($line =~ "OK UPLOAD");
$nbFailUpload++ if ($line =~ "FAIL UPLOAD");
$nbOKDownload++ if ($line =~ "OK DOWNLOAD");
$nbFailDownload++ if ($line =~ "FAIL DOWNLOAD");
$nbOKDelete++ if ($line =~ "OK DELETE");
$nbFailDelete++ if ($line =~ "FAIL DELETE");
}
print "connections.value $nbConnect\n";
print "login_successes.value $nbOKLogin\n";
print "login_failures.value $nbFailLogin\n";
print "upload_successes.value $nbOKUpload\n";
print "upload_failures.value $nbFailUpload\n";
print "download_successes.value $nbOKDownload\n";
print "download_failures.value $nbFailDownload\n";
print "deletion_successes.value $nbOKDelete\n";
print "deletion_failures.value $nbFailDelete\n";
}
close($logs);
|
III-2. Personnaliser les pages web
Il suffit de modifier les templates contenues dans le répertoire /etc/munin/templates/
IV. Divers
Pour Windows
Pour surveiller les machines Windows, vous pouvez installer Munin via Cygwin... sinon testez cette méthode (suivre le
lien)
IV-1. Exemple
Voilà ce que devrait vous donner Munin...

A l'échelle d'un réseau

A l'échelle d'une machine

A l'échelle d'un plugin
IV-2. Liens utiles


Copyright (c) 2006 Nicolas Vallée. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. Read the full license here :
http://www.gnu.org/licenses/fdl.txt