Ce manuel a pour but d'aider à la configuration de la supervision avec Monit. Pour plus d'infos sur Monit, voir Monit
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.
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
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
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.
Activer le logging de Monit, grâce à la directive suivante :
set logfile /var/log/monit
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).
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 :
Pour définir les destinataires des alertes mail, utiliser la directive set alert :
set alert admin@mail.fr
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 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.
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 :
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”.
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
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)
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
Tester l'existence/état d'un répertoire ou d'un fichier :
CHECK <file|directory> /path/file.txt
IF ... THEN ALERT
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
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
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