16 juin 2010

Surveillance système des machines sur un réseau avec Munin

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.
 apt-get install munin 
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$
warning 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 ;)
warning 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.
warning 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.
graph_category other
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
# ou un truc dans le meme style... ;) 

III-1-3. Exemple de plugin complet

Voici un exemple de plugin pour surveiller vsftpd... programmé en perl ;)
/usr/share/munin/plugins/vsftpd

#!/usr/bin/perl
# vim:syntax=perl
#
# Plugin to monitor a vsftpd server running on the machine
#
#
# Requirements:
#       - Needs access to the log file of the ftp server
#
# Tip: To see if it's already set up correctly, just run this plugin
# with the parameter "autoconf". If you get a "yes", everything should
# work like a charm already.
#
# Parameters supported:
#
#       config
#       autoconf
#
# Configurable variables
#
#       logfile      - Override default log file
#
# $Log$
# Revision 0.0.0.1  2006/07/14 19:20  gorgonite

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
 
مواضيع من منتدى نقاش المغرب العربي
  1. مبادئ الإعلام الآلي للمبتدئيين
  2. القرص الصلب
  3. مهارات خفية في برنامج الرسام قليلون من يستعملونها
  4. معلومات عن امتدادات الملفات
  5. الرخصة الدولية فى المحاسبة الألكترونية International Electronic Accounting
  6. Introduction à JavaScript: Cours N° 01
  7. Introduction à JavaScript: Cours N° 02
  8. Introduction à JavaScript: Cours N° 03
  9. Les formulaires en HTML
  10. Une compagne pour le soutien de mansouri ghazel et l'en
  11. Table de Matières sous word 2007
  12. numérotation des pages sous word 2007
  13. آخر مواضيع منتدى نقاش المغرب العربي
  14. Les long documents dans word 2007
  15. Microsoft Office Word: Utilisation des formulaires
  16. insertion des filigranes en Word 2007
  17. Les tableaux en HTML
  18. Rechercher/Remplacer sous word 2007
  19. Insertions automatiques sous word 2010
  20. Introduction à JavaScript: Cours N° 05
  21. Introduction à JavaScript: Cours N° 04
  22. Introduction a javascript
  23. découvrir l'office 2010: les nouveautés de word 2010
  24. Le ruban plus facile à modifier sous Word 2010
  25. En-tête et Pied de page dans word 2007
  26. Les images dans le document Word
  27. Convertir vos fichiers word au PDF en utilisanat PDFCreator
  28. Création d'un modèle de document sous word 2007
  29. L'utilisation des champs dans Microsoft Word
  30. Utilisation des blocs de construction sous Word 2007
  31. Numérotation des titres sous word 2007
  32. Le publipostage Word-Excel
  33. Récupération des données endomagées dans les classeurs excel
  34. Les Fonction en Excel
  35. Mise en forme Conditionnelle en excel
  36. Gestion des erreurs en Excel
  37. Création, enregistrement et fusion de format personnalisés sous excel
  38. Gestion des doublons en excel
  39. Les tableaux croisés automatiques dans escel 2007
  40. Présentation de microsoft Excel 2007
  41. مواضيع جديدة من منتدى نقاش المغرب العربي
  42. Les références absolues et relatives dans vos classeurs Excel
  43. Personalisation de ruban sous excel 2007
  44. les tableaux sous excel 2007
  45. Créer un diagramme de Pareto dans Excel
  46. Les fonctions Index et Equiv sous excel
  47. Les fonctions Index et Equiv sous excel
  48. Fonctions date et heure sous excel
  49. Comprendre et gérer les dates sous Excel et en VBA
  50. Gérer la navigation dans un diaporama PowerPoint

Aucun commentaire:

Enregistrer un commentaire