Superviser un système avec Monit
Introduction
Ce manuel a pour but d'aider à la configuration de la supervision avec Monit. Pour plus d'infos sur Monit, voir Monit
Installation
Sur la machine
Installer le paquet monit de façon traditionnelle avec le gestionnaire de paquets inclus dans la distribution utilisée. Pour RHEL/CentOS, il faut installer le paquet supplémentaire epel-release.
Sous forme de conteneur Docker
On peut utiliser l'image docker de Monit conçue par linuxserver (attention encore en béta), facile à déployer avec docker-compose :
version: "2.1"
services:
monit:
image: lscr.io/linuxserver-labs/monit:latest
container_name: monit
environment:
- PUID=1000 #id de l'utilisateur qui mappe les volumes docker (machine hôte)
- PGID=1000 #id du groupe qui mappe les volumes docker (machine hôte)
- TZ=Europe/Paris #timezone
- APPRISE_TARGETS= #cible des alertes, optionnel
volumes:
- /path/to/config:/config #mappage du répertoire de configuration de monit
ports:
- 2812:2812 #port d'écoute de la WebUI intégrée
restart: unless-stopped
Plus d'infos sur l'image ici : 📖 linuxserver-labs : Monit sur GitHub
Configuration de Monit
La configuration de Monit est inclue dans le fichier /etc/monit/monitrc ou /etc/monitrc.
Néanmoins, il est possible de changer le fichier de configuration à utiliser avec la commande suivante :
monit -c /etc/monit.conf
Pour vérifier que la configuration est valide utiliser :
monit -t
Cela fonctionne aussi pour les installations de Monit conteneurisées.
Redémarrer monit après une modification de la configuration (en mode daemon, en mode service utiliser la commande systemctl classique) :
monit quit monit -c /etc/monit.conf
Délai de rafraichissement des checks
Par défaut, Monit lance ses checks tous les 120 secondes (2min), mais il est possible de modifier cela en changeant la directive set daemon :
set daemon 60
Dans l'exemple ci-dessus, les checks ont été paramétrés à toutes les 60 secondes.
Logging
Activer le logging de Monit, grâce à la directive suivante :
set logfile /var/log/monit
Configuration SMTP
Renseigner les paramètres SMTP pour permettre l'envoi d'alertes par mail :
set mailserver smtp.votre.serveur port 25
S'il y a besoin d'une authentification (facultatif), ajouter :
username julien password azerty1234
Et enfin pour choisir le protocole de connexion (facultatif) :
using TLSV1
Protocoles de chiffrement compatibles : SSL, SSLV2, SSLV3, TLSV1 (pour STARTTLS utiliser SSL).
Personnalisation des alertes par mail
On peut mettre en forme les alertes par mail grâce à la directive set mail-format :
set mail-format {
from: monit@mail.fr
reply-to: support@mail.fr
subject: Alerte : $EVENT - $DATE
message: Monit $ACTION $SERVICE le $DATE sur le serveur $HOST: $DESCRIPTION.
}
Ici, le “from” correspond à l'adresse qui envoie les mails d'alerte, le “reply-to” à l'adresse de réponse (pas très utile), “subject” à l'objet du “message” et message au contenu.
Définition des variables :
- $SERVICE : Nom du service indiqué dans monitrc.
- $EVENT : Type d’événement.
- $DATE : La date en cours.
- $ACTION : Le nom de l’action effectuée, qui correspondra à l’action définie dans monitrc pour ce service.
- $HOST : Le nom de l’hôte où est installé monit.
Pour définir les destinataires des alertes mail, utiliser la directive set alert :
set alert admin@mail.fr
Stockage des alertes
Il est possible de stocker les alertes dans une file pour les réutiliser dans une autre application de monitoring. Pour cela, activer la mise en cache avec set eventqueue, spécifier le chemin de stockage sur la machine avec basedir, et définir la taille de la pile (en nb d'events) avec slots :
set eventqueue basedir /var/lib/monit/events slots 100
Activation de l'interface web
Activation du serveur web sur le port 8080 :
set httpd port 8080
Autoriser les connexions depuis une adresse IP spécifique :
allow 192.168.1.2
Définir l'utilisateur et le mot de passe d'accès à l'interface web (identifiant:mot de passe) :
allow admin:password
Autoriser la connexion de tous les membres d'un groupe d'utilisateurs du système :
allow @groupe
⇒ On peut aussi ajouter “readonly” après le nom d'un groupe pour restreindre ses droits en lecture seule.
Configuration des contrôles et des services
Les contrôles sont les actions effectuées par Monit afin de surveiller le système et de réagir aux alertes.
Il y a plusieurs types d'actions possibles :
- alert : Envoie un message d’alerte
- start : Démarrer le service et envoie un message d’alerte
- stop : Stoppe le service et envoie un message d’alerte
- restart : Redémarre le service et envoie un message d’alerte
- exec : Exécute un script et envoie un message d’alerte
- unmonitor : Désactive la surveillance du service et envoie un message d’alerte
- monitor : Active la surveillance
Les contrôles ont une syntaxe normalisée, qui repose toujours sur un test conditionnel du type « Si <test=resultat> alors <action> ».
Par exemple : « Si la charge CPU est supérieur à 90% alors on envoie une alerte »
Les services sont des ensembles de contrôles qui définissent un service à surveiller (serveur web, système de fichiers, etc…), dont la syntaxe commence toujours par “check”.
Performances du système
CHECK SYSTEM #Vérification de la charge CPU moyenne sur une durée IF loadavg (15min) > 4 THEN ALERT #Vérification de la charge CPU utilisateur IF cpu usage (user) > 80% THEN ALERT #Vérification de la charge mémoire IF memory usage > 90% THEN ALERT #Vérification de la charge de la mémoire SWAP IF swap usage > 50% THEN ALERT
État du stockage
Condition physique d'un disque
Le tutoriel suivant permet de créer un script pour superviser l'état d'un disque grâce à la technologie S.M.A.R.T. :
Superviser l'état de ses disques durs avec Monit et SmartMonTools (Smart Home beginner)
Espace disque restant
Contrôle simple pour vérifier l'espace restant sur une partition avec alerte si dépassement du seuil :
CHECK DEVICE DISK WITH PATH /dev/sda1
IF space usage > 80%
THEN ALERT
Il est recommandé d'utiliser l'UUID d'un disque pour continuer à la superviser dans le cas où un restart du serveur changerait le chemin du disque.
Le chemin doit être remplacé par celui vers l'UUID du disque en question :
ls /dev/disk/by-uuid
CHECK DEVICE DISK WITH PATH /dev/disk/by-uuid/67B67C515B26C8F5
IF space usage > 80%
THEN ALERT
Test de fichiers/répertoires
Tester l'existence/état d'un répertoire ou d'un fichier :
CHECK <file|directory> /path/file.txt
IF ... THEN ALERT
État d'un hôte distant
Vérifier qu'une machine est bien joignable (ici on teste le ping puis le SMTP, puis le SSH) :
CHECK HOST host1 ADDRESS 1.1.1.1
IF FAILED icmp type echo count 3 with timeout 35 seconds THEN ALERT
IF FAILED port 25 protocol smtp with timeout 35 seconds THEN ALERT
IF FAILED port **** protocol ssh with timeout 35 seconds for 2 cycles THEN ALERT
État d'un site web
Ce contrôle permet de vérifier si un site web est bien accessible (ici en https port 443) :
CHECK HOST site1 WITH ADDRESS site1.fr
IF FAILED
port 443
protocol https
THEN ALERT
Utiliser un script
Il est également possible de créer ses propres scripts de supervision en shell, de demander à Monit de les exécuter régulièrement et de réutiliser une valeur en sortie comme indicateur.
Exemple avec un script permettant de vérifier l'état d'un disque. Ici, on récupère la valeur de sortie du script et s'il est égal à 0 le contrôle renvoie “Status failed” et alerte l'administrateur :
check program disk_SYSTEM with path "/scripts/check_disk.sh"
every 120 cycles
if status != 1 then alert
group disks