--- aliases: [/fr/sys/openbsd/reed-alert/] date: 2020-02-24T01:27:09+01:00 description: "Mettre en place simplement du monitoring d'OpenBSD, en mode console/terminal, avec un simple fichier de configuration grâce au projet 'Reed-alert'" draft: false include_toc: true show_comments: false tags: ['OpenBSD','supervision'] title: "Reed-alert : Monitorer simplement OpenBSD" --- ## 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. --- - Auteure : [Solène Rapenne][1] - dépôt Git : git://bitreich.org/reed-alert - [présentation de reed-alert][1] *(en anglais)* - [constat au bout de cinq ans][2]… *(en anglais)* ## Installation ### Paquet L'installation est très simple en soit : `# pkg_add reed-alert` * OpenBSD : 6.6 → **7.2** * Version : **1.05** Vous pouvez préférer le code sur le dépôt {{< anchor git git >}} qui corrige quelques détails. ### git ```sh $ 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 {{< anchor "outil de sortie au format HTML" "sortie-html" >}}. ### Dépendance - le paquet **ecl** : `# pkg_add ecl` — *qui 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 {{< note warning >}} Assurez-vous que la variable d'environnement `PATH` dans votre crontab comporte aussi le répertoire `/usr/local/bin`. {{}} Une fois que vous aurez tout configuré, et {{< anchor vérifiez vérification >}} 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 {{< anchor Documentations documentations >}}* * `/repertoire-vers/reed-alert/` correspond au répertoire où vous aurez créé/déposé votre {{< anchor "fichier de configuration" 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. {{< note warning >}} Évitez d'utiliser ces mots clés dans vos propres variables, vous pourriez avoir à gérer des {{< anchor erreurs dépannage >}} bien truculentes ! {{< /note >}} 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. {{< note info >}} Sachez qu'il est possible de créer des alertes de type SMS, des alertes qui n'avertissent de rien, ou tout autre sorte d'alerte que vous pourriez inventer. {{< /note >}} 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 {{< anchor git 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. {{< note tip >}} Configurez votre {{< anchor crontab cron >}} en ajoutant l'outil de sortie HTML. {{}} ### 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` {{< note tip >}} Pour cibler un serveur délivrant sur le protocole {{< abbr HTTPS "HyperText Transfer Protocol Secure" >}}, il est nécessaire de le cibler en le précédent du schéma suivant : `https://` suivi du nom de domaine à cibler. {{}} ⇒ version basique : {{< code "sys-openbsd-reed-alert-example-curl-basic" LISP >}} ⇒ version élaborée : {{< code "sys-openbsd-reed-alert-example-curl-loop" LISP >}} ⇒ Exemple de retour : {{< code "sys-openbsd-reed-alert-example-curl-return" sh >}} #### Exemple : `disk-usage` Là, je vous ferais direct la version élaborée : {{< code "sys-openbsd-reed-alert-example-disk-usage-loop" 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 "sys-openbsd-reed-alert-example-disk-usage-return" sh >}} #### Exemple : `ping` ⇒ version basique : {{< code "sys-openbsd-reed-alert-example-ping-basic" LISP >}} ⇒ version élaborée : {{< code "sys-openbsd-reed-alert-example-ping-loop" LISP >}} {{< note tip >}} Vous voulez personnaliser le message avec un texte prédéfini, tel que `Ping :`, utilisez la fonction `concatenate`, en ajoutant une description dans la dernière ligne, tel que :
`:desc (concatenate 'string "Ping : " host)` {{< /note >}} ⇒ Exemple de retour : {{< code "sys-openbsd-reed-alert-example-ping-return" sh >}} #### Exemple : `service` ⇒ version basique : {{< code "sys-openbsd-reed-alert-example-service-basic" LISP >}} ⇒ version élaborée : {{< code "sys-openbsd-reed-alert-example-service-loop" LISP >}} ⇒ Exemple de retour : {{< code "sys-openbsd-reed-alert-example-service-return" 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 à {{< anchor "créer une tâche cron" cron >}} ;-) ## Dépannage ### The character *** is not a valid dispatch macro character. Exemple : ```sh An error occurred during initialization: Reader error in file #, 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 : ```sh 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 {{< anchor "installer le paquet ecl" dépendance >}}, ajoutez dans la variable d'environnement `PATH` de votre crontab le répertoire `/usr/local/bin`. ### 'name' is not of type FUNCTION.. ```sh 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 ```sh 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 ```sh An error occurred during initialization: Unexpected end of file on #. ``` L'erreur ci-dessus est due à une mauvaise écriture dans votre fichier de configuration !
Donc, {{< color red >}}VÉRIFIEZ, vérifiez ET vérifiez encore, et encore {{< /color >}} 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`. --- * {{< man crontab 5 >}} ## 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 ---- [1]: https://dataswamp.org/~solene/2018-01-17-reed-alert.html [2]: https://dataswamp.org/~solene/2022-02-10-five-years-of-reed-alert.html