1 - Créer ses plugins en Perl - Première Partie
Notre article consacré au développement de plugin Nagios en Perl utilisera le module CPAN Monitoring::Plugin avec une distribution Debian ou Centreon. Ce module nous permettra de développer un plugin avec un minimum de code et en respectant la codification de Nagios et Centreon. Cet article a été remis à jour pour rester dans l'esprit Open Source par rapport aux décisions de la nouvelle politique de Nagios.
1.1 Prérequis
Premier prérequis est de connaître un minimum le Perl, il existe de nombreuses documentations sur le net. Ne vous inquiétez pas, ce langage n'est pas difficile à aborder et le code proposé sera simple et documenté. D'ailleurs je ne suis pas un expert en Perl et j'accepte volontiers les remarques et améliorations ;-).
Vous devrez installer le module CPAN en installant le paquet suivant. Pour une distribution Debian (attention pour Jessie, il faudra installer le dépôt backport) :
Vous devrez installer le module CPAN en installant le paquet suivant. Pour une distribution Debian (attention pour Jessie, il faudra installer le dépôt backport) :
apt-get install libmonitoring-plugin-perl
Pour une distribution Centreon 64 bits version <= 3.4.1 :
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/perl-Monitoring-Plugin-0.38-1.el6.1.noarch.rpm yum install perl-Monitoring-Plugin-0.38-1.el6.1.noarch.rpm yum install perl-Class-Accessor perl-Config-Tiny
Pour une distribution Centreon CentOS 7, il faudra installer le dépôt epel :
yum install epel-release -y yum install perl-Monitoring-Plugin -y
Enlevez le dépôt epel pour éviter des problèmes de dépendances avec Centreon.
yum remove epel-release -y
1.2 Un plugin minimal
Pour ce premier plugin, nous allons réinventer la roue :-) En fait, nous allons réécrire le plugin check_centreon_dummy développé en Perl de manière classique. Ce plugin ne fait que retourner un état préétabli avec un code retour compatible Nagios. Pour l'exercice, nous allons l'appeler check_factice.pl.
Ci-dessous, voici le code minimal :
Ci-dessous, voici le code minimal :
#!/usr/bin/perl #=============================================================================== # Auteur : kermith72 # Date : 12/07/2017 # But : plugin Nagios factice -> dummy #=============================================================================== use strict; # rends le language moins permissif, déclaration de variable obligatoire,... use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w use Monitoring::Plugin; # Chargement du module CPAN # déclaration de la sonde my $np = Monitoring::Plugin->new; # Code de retour de la sonde $np->plugin_exit( OK, "OK"); __END__
N'oubliez pas de rendre le code exécutable et placer le dans le dossier des plugins :
chmod +x check_factice.pl
En fait ce plugin ne fait rien si ce n'est de retourner le code OK comme vous pouvez le constater sur le résultat de la supervision ci-dessous. Par défaut ce plugin affiche pour le message court (statut du service) le nom du plugin débarrassé du préfixe check_ suivi du message du code de retour (OK). Nous allons l'étoffer avec quelques paramètres supplémentaires.
1.2.a Modifier le statut de service du plugin
Modifions le message court appelé statut du service, nous devrons renseigner l'argument shortname. Dans l'exemple ci-dessous, nous afficherons la chaine Dummy.
# déclaration de la sonde my $np = Monitoring::Plugin->new( shortname => 'Dummy', );
1.2.b Utiliser des paramètres
Nous allons enrichir notre plugin avec les paramètres. Dans ce premier exemple, nous allons pouvoir changer le code de sortie grâce à un paramètre que l'on nommera status. Ce paramètre aura pour valeur 0 à 3 correspondant aux codes de retour Nagios. Afin d'ajouter un paramètre, nous devons obligatoirement renseigner l'argument usage.
# déclaration de la sonde my $np = Monitoring::Plugin->new( shortname => 'Dummy', usage => 'Usage : %s -s <code retour>’ );
La chaine initialisé dans usage sera affichée lorqu'on utilise le paramètre -? ou --usage. Maintenant, initialisons notre paramètre status, le nom raccourci sera s. Celui-ci sera optionnel. Par défaut le code de retour OK lui sera affecté.
# Paramètre code de sortie # status | s ; i = integer $np->add_arg( spec => 'status|s=i', help => 'code de retour 0-3', default => 0); # Récupération des valeurs de paramètres $np->getopts;
Ensuite, il suffira d'utiliser ce paramètre pour modifier le code de sortie du plugin. Bien sûr, il manque encore des vérifications du paramètre et la modification du message de sortie en fonction du code de retour.
# Code de retour de la sonde $np->plugin_exit( $np->opts->status, "OK »);
Ajoutons un peu de logique dans notre plugin. Nous vérifierons les valeurs du paramètres status, celui-ci doit être compris entre 0 et 3. Puis nous ajoutons une variable $message pour adapter le texte en fonction du code de retour.
# logique du programme # déclaration variable message de sortie my $message = "OK"; # contrôle du paramètre status if ($np->opts->status < 0 || $np->opts->status > 3 ) { # Sortie du programme $np->plugin_exit(UNKNOWN, "Status doit etre compris entre 0 et 3"); } # adaption du message de sortie en fonction du code de status if ($np->opts->status == 1) { $message = "Warning"; } elsif ($np->opts->status == 2 ) { $message = "Critical"; } elsif ($np->opts->status == 3 ) { $message = "Unknown"; } # Code de retour de la sonde $np->plugin_exit( $np->opts->status, $message);
1.2.c Finalisation de notre programme
Améliorons notre plugin en rajoutant des arguments supplémentaires comme la licence, l'aide et le numéro de version de notre plugin.
# déclaration variable $licence my $licence = "This program is free software; you can redistribute it and/or modify it under" ." the terms of the GNU General Public License as published by the Free Software" ." Foundation ; either version 2 of the License."; # déclaration de la sonde my $np = Monitoring::Plugin->new( shortname => 'Dummy', usage => 'Usage : %s -s <code retour>’, license => $licence, version => '1.00', blurb => "Ce plugin est un plugin exemple qui ne retourne que des etat de nagios predefinis." ."il a un parametre status permettant le choix du code de retour" );
Pour finir nous rajouterons un deuxième paramètre pour obtenir un message personnalisé. Et voici le programme final du plugin check_factice.pl
#!/usr/bin/perl #=============================================================================== # Auteur : kermith72 # Date : 12/07/2017 # But : plugin Nagios factice -> dummy #=============================================================================== use strict; # rends le language moins permissif, déclaration de variable obligatoire,... use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w use Monitoring::Plugin; # Chargement du module CPAN # déclaration variable $licence my $licence = "This program is free software; you can redistribute it and/or modify it under" ." the terms of the GNU General Public License as published by the Free Software" ." Foundation ; either version 2 of the License."; # déclaration de la sonde my $np = Monitoring::Plugin->new( shortname => 'Dummy', usage => 'Usage : %s -s <code retour>’, license => $licence, version => '1.00', blurb => "Ce plugin est un plugin exemple qui ne retourne que des etat de nagios predefinis." ."il a un parametre status permettant le choix du code de retour" ); # Paramètre code de sortie # status | s ; i = integer $np->add_arg( spec => 'status|s=i', help => 'code de retour 0-3', default => 0); # Paramètre code de sortie # output | o ; s = string $np->add_arg( spec => 'output|o=s', help => 'message personnalise', default => 'OK'); # Récupération des valeurs de paramètres $np->getopts; # logique du programme # déclaration variable message de sortie my $message = $np->opts->output; # contrôle du paramètre status if ($np->opts->status < 0 || $np->opts->status > 3 ) { # Sortie du programme $np->plugin_exit(UNKNOWN, "Status doit etre compris entre 0 et 3"); } # vérification du message par défaut if ( $np->opts->output eq 'OK') { # adaption du message de sortie en fonction du code de status if ($np->opts->status == 1 || $np->opts->output eq 'OK') { $message = "Warning"; } elsif ($np->opts->status == 2 ) { $message = "Critical"; } elsif ($np->opts->status == 3 ) { $message = "Unknown"; } } # Code de retour de la sonde $np->plugin_exit( $np->opts->status, $message); __END__
Continuons avec des plugins contenant des données de performances. Ceci nous permettra de réaliser des graphiques dans notre environnement Centreon.