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

Sources