Reed-alert : Monitorer simplement OpenBSD

Article publié, le et modifié le
9 minute(s) de lecture

Cet article contient 1742 mots.
Source brute de l'article : MD

Description

Reed-alert est un projet de monitoring simple sous OpenBSD, écrit par Solène Rapenne ; 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.6
  • Version : 1.04

Cette version date ; préférez 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
# make install

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

Ensuite, il est préférable d’installer le paquet ecl : # pkg_add ecl

Documentation

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.

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 * * * * reed-alert /repertoire-vers/reed-alert/config.lisp

où :

  • /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

(=> mail curl-http-status :url "huc.fr.eu.org" :timeout 3)
(=> mail curl-http-status :url "openbsd.fr.eu.org" :timout 3)
(=> mail curl-http-status :url "blog.openbsd.fr.eu.org" :timeout 3)

=> version élaborée :

Code : LISP

(loop for host in (list "huc.fr.eu.org" "openbsd.fr.eu.org" "blog.openbsd.fr.eu.org")
    do
        (=> mail curl-http-status :url host :timeout 3))

=> Exemple de retour :

Code : sh

MAIL    CURL-HTTP-STATUS    URL https://huc.fr.eu.org TIMEOUT 3         SUCCESS SUCCESS NO  0
MAIL    CURL-HTTP-STATUS    URL https://openbsd.fr.eu.org TIMEOUT 3         SUCCESS SUCCESS NO  0
MAIL    CURL-HTTP-STATUS    URL https://blog.openbsd.fr.eu.org TIMEOUT 3        SUCCESS SUCCESS NO  0

Exemple : disk-usage

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

Code : LISP

(loop for path in (uiop:run-program "mount | awk -v pattern='/' '$0 ~ pattern { print $3 }' " :output :lines)
    do
        (=> mail disk-usage :path path :limit 80))

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

MAIL    DISK-USAGE  PATH / LIMIT 80         SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /home LIMIT 80         SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /tmp LIMIT 80      SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /usr LIMIT 80      SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /usr/X11R6 LIMIT 80        SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /usr/local LIMIT 80        SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /usr/obj LIMIT 80      SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /usr/src LIMIT 80      SUCCESS SUCCESS NO  0
MAIL    DISK-USAGE  PATH /var LIMIT 80      SUCCESS SUCCESS NO  0

Exemple : ping

=> version basique :

Code : LISP

(=> mail ping :host "192.168.1.1" :desc "Ping 192.168.1.1")
(=> mail ping :host "huc.fr.eu.org" :desc "Ping huc.fr.eu.org")
(=> mail ping :host "openbsd.fr.eu.org" :desc "Ping openbsd.fr.eu.org")
(=> mail ping :host "blog.openbsd.fr.eu.org" :desc "Ping blog.openbsd.fr.eu.org")

=> version élaborée :

Code : LISP

(loop for host in (list "192.168.1.1" "huc.fr.eu.org" "openbsd.fr.eu.org" "blog.openbsd.fr.eu.org")
    do
        (=> mail ping :host host))
Astuce

=> Exemple de retour :

Code : sh

MAIL    PING    HOST 192.168.1.1    Ping : 192.168.1.1  SUCCESS SUCCESS NO  0
MAIL    PING    HOST huc.fr.eu.org  Ping : huc.fr.eu.org    SUCCESS SUCCESS NO  0
MAIL    PING    HOST openbsd.fr.eu.org  Ping : openbsd.fr.eu.org    SUCCESS SUCCESS NO  0
MAIL    PING    HOST blog.openbsd.fr.eu.org     Ping : blog.openbsd.fr.eu.org   SUCCESS SUCCESS NO  0

Exemple : service

=> version basique :

Code : LISP

(=> mail service :name "ntpd")
(=> mail service :name "pflogd")
(=> mail service :name "smbd")
(=> mail service :name "smtpd")
(=> mail service :name "sshd")
(=> mail service :name "syslogd")

=> version élaborée :

Code : LISP

(loop for name in (list "ntpd" "pflogd" "smbd" "sshd" "syslogd")
    do
        (=> mail service :name name))

=> Exemple de retour :

Code : sh

MAIL    SERVICE NAME ntpd       SUCCESS SUCCESS NO  0
MAIL    SERVICE NAME pflogd         SUCCESS SUCCESS NO  0
MAIL    SERVICE NAME smbd       SUCCESS SUCCESS NO  0
MAIL    SERVICE NAME sshd       SUCCESS SUCCESS NO  0
MAIL    SERVICE NAME syslogd        SUCCESS SUCCESS NO  0

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

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.

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