Outils pour utilisateurs

Outils du site


si-monitor_client:xml

Howto : créer et activer un module de supervision

On se propose dans ce tutoriel de créer un module de supervision qui permettra de monitorer deux paramètres spécifiques à un fichier : sa taille et les droits qui lui sont appliqués.

Il faudra pouvoir configurer un ou plusieurs chemins d'accès au fichier au niveau du gabarit.

Le module devra permettre de remonter une alerte sur les deux paramètres remontés.

- Objectifs de cette fonctionnalité

Etendre tout ce qui inclus de base dans SI Monitor (cpu, ram…) par des modules personnalisables.

Exemple : Supervision des backups (émettre une alerte si le statut d'un backup n'est pas bon)
Exemple : Emettre une alerte sur mot clé (dans un fichier de log)
Exemple : Taille d'un fichier : Emettre une alarme sur la taille normale est dépassée. Peut aussi vérifier les droits sur un fichier
Exemple : Détecter l'existence d'un fichier.
Exemple : Nombre de paquets bloqués sur un Firewall. Valeur que l'on peut tracer sur un graphe avec émission d'une alerte si valeur anormale
Exemple de détection d'attaque DDOS : créer un script qui renvoie la valeur du nombre de paquets droppés sur une chaine IPTable (par ex) puis remettre le compteur à zéro (ex : toutes les minutes via un cron). SI Monitor (via la création d'un module personnalisé), permet d'émettre une alerte si le nombre de paquets est anormalement élevé et de tracer un graphe. etc…

- Fonctionnement

La tache cron (ou planificateur Windows) appelle SI Monitor probe (l'indicateur). Cet indicateur va simultanément récupérer la sortie d'un script personnalisé (plugin Nagios, script client…script dans n'importe quel langage à partir du moment où la sortie est textuelle (chaine de caractères). L'indicateur fait son rapport au serveur Frontend qui se charge d'historiser, d'émettre une alarme le cas échéant et de tracer les graphes.

- Création du module mycheckfile

  1. Se rendre dans le menu Administration⇒Modules,
  2. Renseignez un nom (sans espaces) et une description pour ce module,
  3. On indique ici que le module est direct, puisque les données qui seront remontées concerneront l'hôte sur lequel la sonde est installée.
  4. Cliquez sur Créer.

- Paramétrage du modèle XML

Lors de la création du module, un fichier XML décrivant le modèle du module a été créé. Il contient les informations suivantes :

mycheckfile.xml
<?xml version="1.0" encoding="utf-8"?>
<module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60">
	<singleparams/>
	<globalparams/>
	<reportvalues regex="/(.*)/i"/>
	<alarms/>
</module>

<note tip> Cliquez sur “Editer le modèle” pour afficher la définition XML du module. </note>

Les attributs du noeud module sont :

  • id : l'id correspondant dans la base de données
  • name : le nom correspondant dans la base de données
  • minperiodicitycheck : la période minimum de rafraîchissement de la donnée (il convient de ne pas indiquer une valeur trop faible pour éviter la surcharge au niveau sonde et au niveau serveur).
  • maxperiodicitycheck : la période maximum de rafraîchissement de la donnée (0 pour infini)
  • defaultperiodicitycheck : la période de rafraîchissement de la donnée par défaut

Le nœud module peut contenir les fils suivants :

  • singleparams : Les paramètres d'entrée dits “uniques”
  • globalparams : Les paramètres qui s'appliquent à l'ensemble du module
  • reportvalues : Les variables retournées par la sonde
  • alarms : Les alarmes qui peuvent être définies sur le module

- Paramètres d'entrée

Nous allons placer dans singleparams un nœud param qui contiendra notre paramètre d'entrée à savoir le chemin du fichier. Le nœud singleparams contient des nœuds param. Les attributs possibles pour le nœud param sont :

  • type qui peut être :
    • userdefined : défini par l'utilisateur, au niveau du formulaire de configuration de gabarit
    • calculated : calculé par le système
  • name : Le nom du paramètre (Lettres, chiffres et underscore)
  • coupleid : Permet de définir l'appartenance ou non à un couple de valeurs (ne sera pas utilisé ici)
  • label_fr : Label utilisé pour le formulaire
  • mask : Regex qui permet de vérifier la validité de la saisie
  • form : Type de champ de formulaire

Voici notre paramètre d'entrée :

<param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/>

- Paramètres dans le rapport

Pour ce module, l'indicateur de supervision va faire un rapport contenant un certain nombre d'informations, dont un rapport textuel qu'il faudra savoir interpréter.

Ce rapport textuel va être lu par une expression régulière (attribut regex du nœud reportvalues), qui placera sa lecture dans différentes variables (décrites dans les nœuds reportvalue)

Nous savons que notre script remontera les données sous cette forme :

filepath:/var/log/syslog,filesize:141268368,filechmod:-rw-r-----

Nous devons récupérer dans trois variables différentes les valeurs :

  • /var/log/syslog
  • 141268368
  • 0640

Pour celan nous utiliserons la regex suivante :

/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i

Notre XML devrait donc ressembler à ceci :

<reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i"/>

Il y a trois parenthèses capturantes dans cette regex. Nous aurons donc trois paramètres à ajouter avec les nœuds reportvalue.

Les attributs possibles du nœud reportvalue sont :

  • index : la position dans la regex, en partant de 0 (entier),
  • mandatory : obligatoire ou non (dans certains cas, le nombre de paramètres peut être variable (boolean),
  • name : le nom de la variable (lettres, nombre et underscore)

Nous aurons donc ici :

<reportvalue index="0" name="filepath"/>
<reportvalue index="1" name="filesize"/>
<reportvalue index="2" name="filechmod"/>

A ce stade, notre fichier XML de définition du modèle ressemble donc à ceci :

mycheckfile.xml
<?xml version="1.0" encoding="utf-8"?>
<module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60">
	<singleparams>
		<param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/>
	</singleparams>
	<globalvalues/>
	<reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i">
		<reportvalue index="0" name="filepath"/>
		<reportvalue index="1" name="filesize"/>
		<reportvalue index="2" name="filechmod"/>
	</reportvalues>
	<alarms/>
</module>

- Alarmes

Il ne nous reste plus qu'à définir quelles alarmes pourront être appliquées à notre module. Pour cela, nous utilisons évidemment le nœud alarms auquel nous allons ajouter des nœuds alarm.

Les alarmes du xml ne permettent pas de définir le seuil (alerte, erreur) mais les informations de bases (nom de l'alarme et opérateur). Pour configurer les seuils, il faut se référer à la personnalisation des seuils

Les attributs possibles pour le nœud alarm sont :

  • authorizedparam : On spécifie ici sur quel paramètre de reportvalues s'appliquera l'alarme,
  • authorizedoperand : On indique ici les opérandes autorisées pour effectuer le test, séparées par le caractère | (parmi <, ⇐, ==, !=, >=, >),
  • defaultoperand : L'opérande par défaut

Nous proposons ici d'autoriser la création de deux types d'alarmes, la première sur le paramètre filesize, et la deuxième sur le paramètre filechmod :

<alarm authorizedparam="filesize" authorizedoperand="&lt;|&lt;=|==|!=|&gt;=|&gt;" defaultoperand="&gt;"/>
<alarm authorizedparam="filechmod" authorizedoperand="!=" defaultoperand="!="/>

<note tip>Remarquez au passage que nous avons dû échapper notre chaîne de caractères pour qu'elle soit compatible avec XML (le signe < est échappé en &lt; et le signe > en &gt;). Si nécessaire, le site http://www.freeformatter.com/xml-escape.html peut vous aider dans cette tâche.</note>

Nous avons terminé la définition de notre module. Le fichier XML devrait être le suivant :

mycheckfile.xml
<?xml version="1.0" encoding="utf-8"?>
<module id="34" name="mycheckfile" minperiodicitycheck="5" maxperiodicitycheck="0" defaultperiodicitycheck="60">
	<singleparams>
		<param type="userdefined" name="filepath" label_fr="Chemin complet" mask="[a-zA-Z0-9/]*" form="string"/>
	</singleparams>
	<globalvalues/>
	<reportvalues regex="/filepath:(.*),filesize:([0-9]+),filechmod:(.*)/i">
		<reportvalue index="0" name="filepath"/>
		<reportvalue index="1" name="filesize"/>
		<reportvalue index="2" name="filechmod"/>
	</reportvalues>
	<alarms>
		<alarm authorizedparam="filesize" authorizedoperand="&lt;|&lt;=|==|!=|&gt;=|&gt;" defaultoperand="&gt;"/>
		<alarm authorizedparam="filechmod" authorizedoperand="!=" defaultoperand="!="/>
	</alarms>
</module>

- Paramétrage du gabarit

Maintenant que notre module est prêt, nous allons l'activer dans un gabarit.

  1. Rendez-vous sur la page Administration⇒Gabarits
  2. Sélectionnez le gabarit sur lequel vous souhaitez activer le module et cliquez sur Configurer, ou bien créez-en un nouveau le cas échéant.
  3. Cliquez sur Ajouter un module. Votre module devrait apparaître dans la liste déroulante. Validez.
  4. Cliquez sur Paramètres.
  5. Puis ajoutez des chemins de fichier comme suit :
  6. Fermez la fenêtre lorsque vous avez terminé.
  7. Cliquez sur Activer pour activer le module dans ce gabarit.
  8. Enfin, cliquez sur Revenir à la liste des gabarits, puis cliquez sur Distribuer pour appliquer le gabarit aux différentes sondes.

Vous pouvez vérifier que votre configuration est active. Pour cela :

  1. Rendez-vous dans le menu Administration⇒Hôtes
  2. Sélectionnez un hôte qui utilise votre gabarit
  3. Cliquez sur Fichier ini

Vous devriez voir votre section comme ceci :

[plugin:mycheckfile]
@interval=60
@plugin=mycheckfile
@service=mycheckfile
filepath0=/var/log/syslog
filepath1=/var/log/messages

- Remontée de données

Pour cet exemple, nous utiliserons :

  • Un script python avec pour sortie la chaîne de caractères précitée.
mycheckfile.py
#!/usr/bin/python3
""" Les librairies nécessaires à l'exécution de notre script """
import os
import stat
import configparser
import base64
 
""" Configparser nous permet de lire le fichier ini de l'indicateur simonitor """
config = configparser.ConfigParser()
config.read('/etc/simonitor.ini')
res = []
""" Pour chaque ligne commençant par filepath dans la section plugin:mycheckfile et si le fichier existe... """
for key in config['plugin:mycheckfile']:
	if key.count("filepath") > 0:
		path = config['plugin:mycheckfile'][key]
		if os.path.isfile(path):
			""" ... récupérer les infos filesize et permissions """
			osfile = os.stat( path )
 
			mode = stat.filemode( osfile.st_mode )
			size = osfile.st_size
			""" Ajouter à la liste de résultats """
			res.append( 'filepath:'+path+',filesize:'+str( size )+',filechmod:'+mode )
 
""" Séparer les lignes par un \n """
strres = "\n".join( res )
""" Afficher le résultat """
print( strres )
  • Notre indicateur simonitor
  • Le scheduleur cron :

Voici la ligne cron que nous pourrions ajouter (fréquence d'exécution : 1 minute) :

* * * * * /opt/simonitor/simonitor-probe -x "mycheckfile=;d;`/usr/bin/python3 /opt/simonitor/mycheckfile.py`" >> /dev/null 2>&1

Au bout de quelques minutes, vous devriez voir apparaître des informations dans les logs :

Si vous rencontrez une erreur dans SI Monitor pensez à :

  • Vérifiez que le firewall ne bloque pas le réseau, si des ports particuliers sont utilisés.
  • Vérifiez aussi que les données sont envoyées au bon serveur dans simonitor.ini, notamment en cas de version de dev et version de prod.
  • Vérifiez que le nom du module soit le même partout.

- Définition d'alarmes

Les alarmes sont définies :

  • soit pour un hôte en particulier,
  • soit pour un groupe d'hôtes.

Il existe deux niveaux d'alarme :

  • Alerte (warning) : Le seuil atteint nécessite une notification pour action, mais n'est pas bloquant pour la production
  • Alarme (error) : le seuil atteint est critique et impacte la production.
si-monitor_client/xml.txt · Dernière modification: 2020/09/04 14:47 (modification externe)