Exemple de création de plugin NAGIOS

Témoignages à propos d'implémentations EyesOfNetwork
Répondre
Avatar du membre
LaBanane
Messages : 50
Enregistré le : 28 septembre 2016, 11:45

Exemple de création de plugin NAGIOS

Message par LaBanane » 28 septembre 2016, 16:55

Bonjour,

Ce topic est destiné à toutes personnes souhaitant s'initier à la création de plugin pour Nagios afin de monitorer des ressources spécifiques. Dans mon cas: L'état SMART et le status dans le RAID des disques dure de serveur DELL T630, ainsi que le status des blocks d'alimentation.
Attention ! Je n'ai pas la prétention de tout savoir sur la création de plugins, ni que ma façon de faire est la meilleur. Il s’agit d'un exemple que j'ai mis en place et qui est fonctionnel au sein de mon entreprise.

Les lignes qui vont suivre sont tirées d'un document que j'ai rédigé pour mon entreprise et que je diffuse avec l'accord de mon responsable.

Création de plugin Nagios simple pour monitorer le smart des disques serveur et les alimentations.

Je vais montrer ici l’ensemble des étapes nécessaire pour la création d’un plugin Nagios pour monitorer une ressource particulière. S’il s’agit de monitorer uniquement un serveur et que le plugin est déjà créé, vous pouvez aller à l’étape 9.

Etape 1 : Télécharger les Mibs du constructeur et placez-les dans le dossier prévu à cet effet.
1. Récupérer les MIBs
Qu’est-ce qu’un MIB ? Wikipédia : Une MIB (management information base, base d'information pour la gestion du réseau) est un ensemble d'informations structuré sur une entité réseau, par exemple un routeur, un commutateur ou un serveur. Ces informations peuvent être récupérées, ou parfois modifiées, par un protocole comme SNMP.
Dans notre cas les mibs IDRAC des serveurs DELL n’était pas fourni par DELL. Je suis allé les chercher sur le site https://github.com/dangmocrang/check_idrac
Le fichier se nomme: idrac-smiv2.mib

2. Envoyer les MIBs sur le serveur EON
Se connecter via WinSCP sur notre serveur E.O.N et mettre les Mibs dans /usr/share/snmp/mibs
Petit point particulier, il faut renommer le fichier MIB en ‘’.txt’’. Sinon il n’est pas pris en compte.

3. Vérifier les droits
Faire un clic droit puis “Propriété” pour faire correspondre à l’image ci-dessous.
Droit :: 0644

Etape 2 : Identifiez la métrique que vous voulez monitorer
1. Recherchez la métrique voulue
Chaque MIB à une base de connaissance qui recense l’ensemble des OID.
C’est quoi une OID ? Wikipedia : Les OID (pour Object Identifier) sont des identifiants universels, représentés sous la forme d'une suite d'entiers. Ils sont organisés sous forme hiérarchique avec des nœuds. Ainsi seul l'organisme 2.999 peut dire quelle est la signification de l'OID 2.999.1.
L'objectif des OID est d'assurer l'interopérabilité entre différents logiciels. Les OID sont utilisés dans le monde LDAP mais aussi dans d'autres domaines, comme le protocole SNMP pour identifier des ressources.
Dans notre cas on peut retrouver cela sur le site : http://www.circitor.fr/Mibs/Html/IDRAC-MIB.php

Code : Tout sélectionner

Ex:
physicalDiskSmartAlertIndication 	1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31
Indicates whether the physical disk has received a predictive failure alert.
OBJECT-TYPE 		  	 
BooleanType 		 

2. Traduisez le nom de la métrique en OID
Nous avons deux choses à monitorer, le smart des disques dures et l’état des alimentations. Après une recherche et quelques test voici les métriques récupérées depuis le site web de l’étape précédente :
Un booléen qui indique si une défaillance est prévue par le smart des disques.
• physicalDiskSmartAlertIndication BooleanType
• OID 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31.[1-4]
• Status 0 = OK, 1 = KO

Le statut des disques, il indique avec précision dans quel état est le disque (Par rapport au raid).
• physicalDiskState INTEGER,
• OID 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.4.[1-4]
• Status unknown(1), ready(2), online(3), foreign(4), offline(5), blocked(6), failed(7), non-raid(8), removed(9)

Le statut des alimentations, il indique avec précision l’état des alimentations.
• powerSupplyStatus INTEGER
• OID 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1.[1-2]
• Status other(1), unknown(2), ok(3), nonCritical(4), critical(5), nonRecoverable(6)
NB : A la fin de chaque OID il y a [1-4] ou [1-2], cela correspond au disque 1, 2, 3 et 4 et pareille pour les alimentations.

Etape 3 : Utilisez une commande pour récupérer la valeur de l’OID
Une fois l’OID en votre possession, vous pouvez lancer cette commande depuis le serveur EON pour récupérer la valeur de votre métrique :
> # snmpwalk -c irfasud -v 2c 192.168.40.3 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1
• SNMPv2-SMI::enterprises.674.10892.5.4.600.12.1.5.1.1 = INTEGER: 3
• SNMPv2-SMI::enterprises.674.10892.5.4.600.12.1.5.1.2 = INTEGER: 3
Toutes les vérifications se font via un snmpwalk. ; -C CommunotéSNMP ; -v 2c(version SNMP) ; @IP du serveur ; OID
La réponse renvoyée dépend de l'OID que l'on check. Dans notre cas on test les alimentations du serveur de Nîmes 192.168.40.3, l’OID est : 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1 et comme on peut le voir si on ne précise pas le numéro de l’alimentation le serveur nous donne l’état des deux.
Si on précise le numéro de l’alimentation en fin d’OID on obtient ceci :
> # snmpwalk -c irfasud -v 2c 192.168.40.3 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1.1
• SNMPv2-SMI::enterprises.674.10892.5.4.600.12.1.5.1.1 = INTEGER: 3

Etape 4 : Créer les scripts PERL
Enfin il ne nous reste plus qu’à créer les scripts qui seront utilisé par Nagios pour monitorer les ressources voulue !

Script: IDRAC_smart-disk-alerte.pl

Code : Tout sélectionner

#!/usr/bin/perl -W

### physicalDiskSmartAlertIndication            BooleanType,
# - physicalDiskSmartAlertIndication    1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1;31;[1-4]
# 0 is OK , 1 is KO
### physicalDiskState                                                   INTEGER,
# - physicalDiskState                                   1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1;4;[1-4] Status(1 Unknow; 2 Ok but no RAIDI; 3 OK; 4 Foreign config; 5 Not available for RAID ; 6 Blocked by controller ; 7 Not opperationnal
# 3 is OK , else is KO


# my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);

use warnings;

$num_args= $#ARGV + 1;
if($num_args != 3){
        print "\nUsage: ./idrac.pl Community \@IP NumDISK\n";
    exit;
}

$COM=$ARGV[0];
$IP=$ARGV[1];
$NumDISK=$ARGV[2];
#$1=SNMP Community / $2=IP@ host / $3=N° du disque
        # On test dabord si la commande fonctionne et que l'hote distant répond
        $DiskSmart = 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31.'.$NumDISK.' 2>&1 | grep "Timeout"';
        system "$DiskSmart";
        if($? == 0) {
                print "Timeout:: host unreachable ?";
                exit 3;
        }
        # Ensuite on regarde le status des disques
        $DiskSmart = 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31.'.$NumDISK.' | grep "INTEGER: 0"';
        system "$DiskSmart";
        # print "resultat: $?";
        # Renvoi 256 ?
        if($? != 0) {
                print "Critical: Les attribus SMART annonce une défaillance imminente";
                exit 1;
        } else {
                $DiskStatus = 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.4.'.$NumDISK.' | grep "INTEGER: 3"';
                system "$DiskStatus";
                if($? != 0) {
						system 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.4.'.$NumDISK.' | cut -d" " -f4';
                        print " <<< Critical: Le status du disque n'est pas normale. Status(1 Unknow; 2 Ok but no RAID; 3 OK; 4 Foreign config; 5 Not available for RAID ; 6 Blocked by controller ; 7 Not opperationnal) \n";
                        exit 2;
                } else {
                        print "  :: Disk OK";
                }
        }

__END__
Script : IDRAC_power-supply-alerte.pl

Code : Tout sélectionner

#!/usr/bin/perl -W

## powerSupplyStatus            INTEGER,
# - powerSupplyStatus 	1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1.[1-2]
# 3 is OK , 5 is KO

use warnings;

$num_args= $#ARGV + 1;
if($num_args != 3){
	print "\nUsage: ./idrac.pl Community \@IP AlimBlock\n";
    exit;
}

$COM=$ARGV[0];
$IP=$ARGV[1];
$AlimBLOCK=$ARGV[2];
#$1=SNMP Community / $2=IP@ host / $3=N° du blockAlim
	# On test dabord si la commande fonctionne et que l'hote distant répond
	$AlimBLOCKStatus = 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1.'.$AlimBLOCK.' 2>&1 | grep "Timeout"';
	system "$AlimBLOCKStatus";
	if($? == 0) {
		print "Timeout:: host unreachable ?";
		exit 3;
	}
	# Ensuite on test l'état des blocks d'alim
    $AlimBLOCKStatus = 'snmpwalk -v 2c -c '.$COM.' '.$IP.' 1.3.6.1.4.1.674.10892.5.4.600.12.1.5.1.'.$AlimBLOCK.' | grep "INTEGER: 3"';
	system "$AlimBLOCKStatus";
    if($? != 0) {
        print "Critical: PowerSupply defaults\n";
		exit 2;
    } else {
		print "  :: Power supply block OK";
		exit 0;
	}

__END__
Quelques explications en vrac :
• Je vérifie les arguments avec $num_args, si le nombres d’arguments n’est pas bon je « print » l’utilisation. C’est une sorte d’aide.
• Ensuite je récupère les arguments dans des variables ($COM pour la communauté SNMP, $IP pour l’IP de l’hôte à monitorer et enfin $NumDISK pour le numéro du disque à monitorer.
• Je test ensuite si ma commande SNMP atteint bien l’hôte. Remarquez le 2>&1 . Il est nécessaire de le préciser car sinon les sorties « erreurs » de la commande ne passe pas le pipe !
• La commande « system » sert à exécuter ce que je mets dans ma variable $AlimBLOCKStatus ou $DiskSmart comme si on le lançait en ligne de commande.
• On remarque également que je mets des « exit [0-4] », cela va déterminer comment l’état va s’afficher dans Nagios. (OK=0, WARNING=1, CRITICAL=2, UNKNOWN=3, DEPENDENT=4)

C’est deux script seront à placer dans /srv/eyesofnetwork/nagios-3.5.1/plugins/ sur le serveur EON avec WinSCP. Pensez à adapter les droits et les propriétaire des deux fichier, prenez comme exemple les autres scripts présents dans le dossier.

Etape 5 : Création d’un Host Group
Un petit peu d’organisation ne nous fera pas de mal ! Il est donc préférable de créer un groupe particulier pour tous nos Host ou l’on souhaite monitorer les disques et alimentations. Cela sera utile pour organisé le panorama Nagios plus tard.
Pour cela aller dans la partie ‘’Administration’’ puis au niveau du menu latéral gauche choisissez “Nagios \ Configuration” puis dans la fenêtre cliquer sur ‘’Host Groups’’ :
Cliquer ensuite sur ‘’Add a New Host Group’’ en haut de la page. Et remplir les deux champs pour créer sont host group. Dans notre cas il s’appellera ‘’Dell’’

Etape 6 : Créez une “Nagios Commands”
Nous avons récupéré le MIB du matériel voulu, et placé dans le dossier adéquate de notre serveur EON. Nous avons créé des scripts PERL pour utiliser les OID qui corresponde aux ressources que l’on veut monitorer. Il est maintenant temps de rentrer dans le concret ! On va configurer Nagios pour utiliser tout ce bordel ….
Allez dans la partie “Administration” puis au niveau du menu latéral gauche choisissez “Nagios \ Configuration”. Cliquez ensuite sur “Nagios Command”.

Le mieux est en fait de dupliquer un service existant et de le modifier. Pour ce faire, cochez une “Nagios command”, sélectionnez “Duplicate” puis validez par “Submit”.
Cela duplique avec le même nom mais ajoute un “-NuméroAleatoire” au bout. Cliquez donc sur l’objet dupliqué pour l’éditer.

Voici les trois champs à remplir:
• Command Name: iDRAC-check_alim
• Command Line: $USER1$/IDRAC_power-supply-alerte.pl $ARG1$ $HOSTADDRESS$ $ARG2$
• Commande Description: iDRAC-check_alim
(répéter l'opération pour la deuxième commande iDRAC-check_disk)

Le $USER1$ est une variable système par défaut Nagios reprenant le chemin des plugins : /srv/eyesofnetwork/nagios-3.5.1/plugins/ on voit ensuite les deux scripts que l’on a créés IDRAC_xxxx.pl
Ensuite comme pour lancer un programme classique sous linux on introduit nos arguments. On attend 3 arguments pour nos scripts :
• La communauté SNMP
• L’@IP du serveur
• Le numéro du disque ou de l’alimentation
Les arguments $ARG1$ et $ARG2$ seront réutilisés plus tard dans la configuration. Enfin $HOSTADDRESS$ est une variable Nagios, comme $USER1$, qui désigne l’@IP de l’hôte qui doit recevoir la commande.
Voilà votre “Nagios command” est prête !


Avant de commencer cette partie, une petite explication de comment fonctionne les choses !
On va créer un Service Templates : iDRAC_SERVICE_disk qui utilisera notre commande iDRAC-check_disk, ce Service Templates sera lui-même utilisé par notre Host Template Name.
Pourquoi ? Et bien parce qu’on peut lier plusieurs Service Templates avec des arguments différents à un seul Host Template Name ! Et nous pourrons donc monitorer X disques ou alimentations pour un seul HOST. Si on ne fait pas comme cela, on sera limité à 1 disque ou alimentation par HOST, ce qui ne convient pas !

Etape 7 : Création d’un Service Templates
Pour créer un service, faites comme pour une “Nagios command”, à savoir, allez dans la partie “Administration” puis au niveau du menu latéral gauche choisissez “Nagios \ Modèles” puis descendez jusqu’à la rubrique “Service Templates”.
(Modèles -> lister dans EON 5.0)
Puis faites une duplication d’un service et éditez-le. Seulement deux onglets ont besoin d’être modifiés : General et Checks :
• Onglet General : ‘’Template Name: iDRAC_SERVICE_alim’’ et ‘’Description: iDRAC_SERVICE_alim’’ puis faire un “update General”
• Onglet Check : Cochez la case “provide value” en face de “check command” et choisissez nos belle commande maison : ‘’iDRAC-check_disk’’ ou ‘’iDRAC-check_alim’’

Ont créé ainsi nos deux Service Template.

Etape 8 : Création du Host Template Name
Pour créer un Host Template Name, faites comme pour service, allez dans la partie “Administration” puis au niveau du menu latéral gauche choisissez “Nagios \ Modèles” et tout en haut vous verrez la catégorie “Host Templates Name”.
(Modèles -> lister dans EON 5.0)
Dupliquez un Template…Vous commencez à connaître…et éditez-le :
• Onglet General : ‘’Template Name: iDRAC_template_alim’’ et ‘’Description: iDRAC_template_alim’’ puis faire un “update General”
• Onglet Group Memberships : HostGroup Dell (créé dans l’étape 5.)
• Onglet Services : Créer autant de Service que de disque ou d’alimentation ‘’Create A New Service For This Template’’

Quand on ajoute un nouveau service une page s'ouvre avec les champs suivant:

Code : Tout sélectionner

Service Description: Disk 1 service
Display Name: (Optional) Disk 1 service

Service Templates To Inherit From (Top to Bottom): (On choisi dans le menu déroulant le service template que l'on à créer dans l'étape précédente)
iDRAC_SERVICE_alim

Check Command: (Se rempli automatiquement quand on sélectionne le service template)

Check Command Parameters:
$ARG1$: IRFASUD
$ARG2$: 1
• $ARG1$ correspond à la communauté SNMP
• $AGR2$ correspond au numéro du disque dure. [1-4]
Faire de même jusqu’à avoir les 4 disques ou 2 alimentations configurés.

Etape 9 : Ajoutez le host à monitorer et lui attribuer notre Template
Toujours dans la partie “Administration” et au niveau du menu latéral gauche choisissez “Nagios \ Equipements”. Dans notre cas nos machines virtuelles sont rangés dans leur ESX respectif qui sont eux aussi monitoré. Donc essayons d’ajouter le monitoring iDRAC des disques et alimentation du serveur de Toulouse par exemple dans le bon ESX. On rentre dans ESX31T Toulouse pour l’exemple :

Ensuite on ajoute un ‘’New Child host’’, que l’on nommera iDRAC31T. On remplit les champs demandés et on ajoute les deux Host Template créés précédemment.
L’adressage type de nos sites veulent que le serveur iDRAC de chaque site soit en .3 donc l’iDRAC de Toulouse est en 192.168.50.3, on voit également nos deux Template ajouté.

Etape 10 : Exportez la configuration
Si vous souhaitez pouvoir visualiser votre nouvel host dans le panorama Nagios, vous devez “exporter” la configuration. Pour ce faire, rien de plus simple, allez dans la partie “Administration” et au niveau du menu latéral gauche choisissez “Nagios \ Appliquez la configuration” puis cliquez sur “restart”.
Cet export doit obligatoirement se solder par un “Complete” sinon cela indique qu’il y a une erreur de configuration dans vos Template.
Plus qu’à configurer le panorama pour afficher votre Host Groupe créé dans l’étape 5 !

Voila .... j'espère que cela aidera certain. Si vous avez des questions n'hésitez pas.
Modifié en dernier par LaBanane le 04 novembre 2016, 11:21, modifié 1 fois.
"Il vaut mieux un qui sait que cent qui cherchent." -sagesse populaire :D

Avatar du membre
Seb
Messages : 3558
Enregistré le : 11 février 2009, 17:35
Localisation : Limoges
Contact :

Re: Exemple de création de plugin NAGIOS

Message par Seb » 30 septembre 2016, 15:04

Excellent!!!!
Merci de l'effort pour avoir mis tout ça par écrit!
"Mieux vaut cent chevaux sous une selle que d'un âne assis dessus"
Joe dans son bar servant un de ses clients...JBT

Répondre