%

Reed-alert : Monitorer simplement OpenBSD

Article publié, le et modifié le
8 minutes de lecture

Cet article contient 1496 mots.
Source brute de l'article :
Commit version : 0edebb7

Description

Reed-alert est un projet de monitoring simple sous OpenBSD, il n’enregistre aucune donnée ni ne produit des graphes de visualisation.

À partir d’un fichier de configuration, il vérifie plusieurs états et si ceux-ci échouent alors il sera envoyé une alerte. Le langage utilisée est le Lisp.


Installation

Paquet

L’installation est très simple en soit : # pkg_add reed-alert

  • OpenBSD : 6.67.2
  • Version : 1.05

Vous pouvez préférer le code sur le dépôt git qui corrige quelques détails.

git

$ git clone git://bitreich.org/reed-alert
$ cd reed-alert
$ make
sed 's,REEDDIR=,&/usr/local/share/reed-alert/,' reed-alert.in > reed-alert
$ doas make install
mkdir -p /usr/local/share/reed-alert/
mkdir -p /usr/local/bin
install -o root -g bin -m 755 reed-alert /usr/local/bin/reed-alert
install -o root -g wheel -m 644 probes.lisp functions.lisp /usr/local/share/reed-alert//

L’avantage du dépôt est qu’il fourni le fichier README très explicatif, ainsi que des fichiers d’exemples, ainsi qu’un outil de sortie au format HTML .

Dépendance

  • le paquet ecl : # pkg_add eclqui est normalement installé en dépendance du paquet reed-alert.

Configuration

Le fichier README vous informe que vous pouvez copier l’un des deux fichiers exemples en fichier de configuration. Faisons simple, en admettons que nous soyons dans le répertoire de reed-alert :
$ touch config.lisp.

Il vous faudra ensuite l’éditer avec votre éditeur de texte favori.

cron

Attention

Une fois que vous aurez tout configuré, et vérifiez que votre configuration soit sans erreur, n’hésitez pas à ouvrir la table de cron de l’utilisateur root pour y ajouter un job de surveillance, tel que :

*/5 * * * * -ns reed-alert /repertoire-vers/reed-alert/config.lisp

où :

  • les deux options -ns sont spécifiques à la gestion cron - cf la partie Documentations
  • /repertoire-vers/reed-alert/ correspond au répertoire où vous aurez créé/déposé votre fichier de configuration
  • cette tâche s’exécutera toutes les 5 minutes ; à vous de voir, si cette période vous est utile/nécessaire, et de la modifier en conséquence.

Langage

C’est du Common LISP !

Hormis les variables et les preuves déjà prédéfinies, il est possible d’utiliser des concepts de condition, de boucles, d’imbriquer des dépendances, des niveaux d’échelles d’alertes, d’étendre/créer vos propres preuves. Tout cela est expliqué clairement dans le fichier README.

Variables prédéfinies

Il existe des variables prédéfinies, elles sont entourées du symbole modulo % et peuvent être utilisées partout dans votre fichier de configuration.

Voici leurs noms et leur définition :

  • %function% : le nom de la fonction qui sert de preuve
  • %date% : la date actuelle au format YYYY/MM/DD hh:mm:ss
  • %params% : les paramètres utilisés dans le contexte de la preuve
  • %hostname% : le nom d’hôte
  • %result% : l’erreur retournée (tel que la valeur excédant la limite, un fichier non trouvé, etc… )
  • %desc% : une description arbitraire nommant une vérification ; par défaut, est une chaîne vide
  • %level% : le type de la notification utilisé
  • %os% : le système d’exploitation utilisé (FreeBSD/Linux/OpenBSD)
  • %newline% : le caractère de nouvelle ligne
  • %state% : les états “start” / “end” lorsqu’un problème est levé ou résolu.

Preuve

La preuve est en fait un type de vérification à effectuer. C’est un test !

Par défaut, il est possible de vérifier :

  • command : exécute une commande arbitraire, désirée par l’administrateur, et qui déclenchera une alerte si le code d’erreur est supérieur à zéro.
  • curl-http-status : exécute une requête HTTP et lève une alerte si le code de retour est différent de ‘OK’ (code 200)
  • disk-usage : que la taille d’une partition n’excéde pas une certaine limite
  • file-exists : qu’un certain fichier existe
  • file-less-than
  • file-updated : qu’un certain fichier existe et qu’il a été mis à jour depuis un temps défini
  • load-average-1 : que la charge moyenne durant la dernière minute n’excéde pas une certaine limite
  • load-average-5 : que la charge moyenne durant les cinq dernières minutes n’excéde pas une certaine limite
  • load-average-15 : que la charge moyenne durant les quinze dernières minutes n’excéde pas une certaine limite
  • number-of-processes : le nombre de processus n’excède pas une certaine limite.
  • pid-running : le processus en question soit vivant, en spécifiant le fichier d’identifiant de processus.
  • ping : que l’hôte distant répond à deux ping.
  • service : qu’un service soit actif sur le système hôte
  • ssl-expiration : qu’un certificat SSL expire dans une période donnée en nombre de secondes.
  • write-to-file : permet d’écrire du contenu dans un fichier ; le créera s’il n’existe pas localement.
Attention

Je vous renvoie à la lecture du fichier README pour en savoir plus sur chacune de ces preuves.

Ajout de l’alerte

La première chose à faire est d’ajouter une alerte - pour nous faciliter le propos, nous créerons une alerte mail.

Info

Ajoutez basiquement :
(alert mail "echo 'problem on %hostname%' | mail mail@domain.tld")

Une version plus élaborée :
(alert mail "echo -n '[%state%] Problem with %function% %date% %params%' | mail -s '[%state%] alarm on %hostname%' mail@domain.tld")

Sortie HTML

La version du dépôt git fournit un outil de sortie au format HTML que l’on trouve dans le répertoire enfant extras/output2html.sh.

Voici comment l’utiliser :
$ reed-alert config.lisp | extras/output2html.sh > alert.html

Il ne vous reste plus qu’à mettre/fournir ce fichier html sur un espace web pour obtenir la lecture de celui-ci.

Astuce

Exemples

Pour rappel, allez lire les deux fichiers d’exemples fournis par le projet. Ils sont instructifs.

Ci-dessous, retrouvez des exemples de mon cru.

Exemple : curl-http-status

Astuce

⇒ version basique :

Code : LISP

⇒ version élaborée :

Code : LISP

⇒ Exemple de retour :

Code : sh

Exemple : disk-usage

Là, je vous ferais direct la version élaborée :

Code : LISP

Explication :

  • La boucle appele la commande mount qui est “filtrée” par la commande awk afin de ne restituer que le nom des partitions existantes, sur lesquelles sera appliqué le test de preuve.

⇒ Exemple de retour :

Code : sh

Exemple : ping

⇒ version basique :

Code : LISP

⇒ version élaborée :

Code : LISP

Astuce

⇒ Exemple de retour :

Code : sh

Exemple : service

⇒ version basique :

Code : LISP

⇒ version élaborée :

Code : LISP

⇒ Exemple de retour :

Code : sh

Vérification

Pour vérifier l’écriture de votre fichier de configuration, une fois que celle est terminée/modifiée, exécutez simplement en console :
$ reed-alert /repertoire-vers/reed-alert/config.lisp

Une fois que votre vérification est faite, pensez à créer une tâche cron ;-)

Dépannage

The character *** is not a valid dispatch macro character.

Exemple :

An error occurred during initialization:
Reader error in file #<input stream #P/path/reed-alert/config.lisp" 0xa5b677d1960>, position 173:
The character Space is not a valid dispatch macro character.

Vérifiez vos écritures. Vous avez certainement fait une erreur typographique…

ecl or sbcl not found in PATH.

Vous avez le message suivant :

ecl or sbcl not found in PATH.
you need at least one of them to use reed-alert

Après vous être assuré d’avoir au moins installer le paquet ecl , ajoutez dans la variable d’environnement PATH de votre crontab le répertoire /usr/local/bin.

’name’ is not of type FUNCTION..

An error occurred during initialization:
"name" is not of type FUNCTION.

Vous utilisez une boucle ?
Il y a de forte probabilité que vous ayez utilisé un nom de variable similaire à celui d’une fonction !

Not a valid property list

An error occurred during initialization:
Not a valid property list (HOST Ping  192.168.1.3).

Vous utilisez une boucle ?
Vérifiez l’écriture de votre boucle, une des propriétés n’est pas correcte.

Unexpected end of file on

An error occurred during initialization:
Unexpected end of file on #<input stream #P"/path/reed-alert/config.lisp">.

L’erreur ci-dessus est due à une mauvaise écriture dans votre fichier de configuration !
Donc, VÉRIFIEZ, vérifiez ET vérifiez encore, et encore ce que vous avez écrit : un simple oubli d’une parenthèse fermante, d’un apostrophe/guillemet peut en être la cause.

Documentations

La copie du dépôt vous permettra de lire les fichiers suivants :

  • README : À lire, très complet, il fournit en anglais, les différentes étapes d’installation, de paramétrage, et autres exemples.
  • les fichiers d’exemple : example-simple.lisp et example-full.lisp.

Remerciements

  • Solène Rapenne fait partie de l’équipe des développeurs d’OpenBSD. Informaticienne, elle développe dans plusieurs langages, dont le Lisp qui est la base du code de reed-alert, et à ses heures perdues professionnellement parlant absolument la fonction d’administrateur réseaux/système! :p