Surveillance service des serveurs via script

Bonjour à toutes et à tous,

Ma cheffe souhaite que l’on reçoive un mail quand un service passe en état failed sur nos serveurs linux.

Depuis ce matin je me documente et j’apprends à faire du script sous linux donc svp soyez indulgent sur ce que vous allez voir ci-dessous :smiley:

Mon script est terminé et il fait ce que je souhaite c’est à dire :

  • vérifier si des services sont en état failed
  • relancer le service en question
  • envoyer un mail sur une liste pour qu’on soit prévenu

Dans le mail en question, j’inclus le status du service. Pour simuler un service en failed, j’ai modifié le fichier conf du service clamav-freshclam.

Quand je fais manuellement un systemctl status clamav-freshclam.service
j’obtiens ca :

root@xxxx:~# systemctl status clamav-freshclam.service
● clamav-freshclam.service - ClamAV virus database updater
   Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2021-03-29 16:09:46 CEST; 21min ago
     Docs: man:freshclam(1)
           man:freshclam.conf(5)
           [url]https://www.clamav.net/documents[/url]
  Process: 12921 ExecStart=/usr/bin/freshclam -d --foreground=true (code=exited, status=2)
 Main PID: 12921 (code=exited, status=2)

mars 29 16:09:46 xxxx systemd[1]: Started ClamAV virus database updater.
mars 29 16:09:46 xxxx freshclam[12921]: ERROR: Missing argument for option at /etc/clamav/freshclam.conf:3
mars 29 16:09:46 xxxx freshclam[12921]: ERROR: Can't open/parse the config file /etc/clamav/freshclam.conf
mars 29 16:09:46 xxxx systemd[1]: clamav-freshclam.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
mars 29 16:09:46 xxxx systemd[1]: clamav-freshclam.service: Failed with result 'exit-code'.
root@glpi:~#

Jusqu’ici, c’est normal. Mais quand je lance mon script, dans le mail que je reçois j’ai ca :

● clamav-freshclam.service - ClamAV virus database updater
   Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-29 15:59:07 CEST; 6ms ago
     Docs: man:freshclam(1)
           man:freshclam.conf(5)
           [url]https://www.clamav.net/documents[/url]  Main PID: 12798 (freshclam)
    Tasks: 1 (limit: 4700)
   Memory: 936.0K
   CGroup: /system.slice/clamav-freshclam.service
           └─12798 /usr/bin/freshclam -d --foreground=true

Ce qui est tout bonnement impossible car le fichier conf du service a toujours ses paramètres erronés

Donc ma question est : ou est ce que je me suis trompé dans le script ? Est ce que l’un de vous peut m’éclairer svp ?

#!/bin/bash

touch /tmp/verif_services /tmp/services_failed /tmp/mail
cd /tmp

VERIF="/tmp/verif_services";
FAILED="/tmp/services_failed";
MAIL="/tmp/mail";
HOSTNAME=$(hostname)

systemctl --type=service | grep failed > $VERIF

if [ -s $VERIF ]
then
        cut -d " " -f2 $VERIF > $FAILED
fi

echo "ATTENTION SERVICE(S) EN ETAT FAILED" >> "$MAIL";
echo " " >> "$MAIL";
echo " " >> "$MAIL";
echo "LE(S) SERVICE(S) SUIVANT(S) EST(SONT) EN ETAT FAILED SUR LE SERVEUR" $HOSTNAME >> "$MAIL";
echo " " >> "$MAIL";
cat $FAILED >> "$MAIL";
echo " " >> "$MAIL";
echo "TENTATIVE DE RELANCE AUTOMATIQUE DU(DES) SERVICES" >> "$MAIL";
echo " " >> "$MAIL";
echo " " >> "$MAIL";

for service in $(cat $FAILED)
do
        systemctl restart $service;
        echo "LE SERVICE" $service "A ETE RELANCE" >> "$MAIL";
        echo " " >> "$MAIL";
        echo " " >> "$MAIL";
        echo "VERIFIEZ L'ETAT DU SERVICE CI-DESSOUS" >> "$MAIL";
        echo " " >> "$MAIL";
        echo " " >> "$MAIL";
        systemctl status $service >> "$MAIL";
        echo " " >> "$MAIL";
        echo " " >> "$MAIL";
        echo "SI TOUJOURS EN FAILED, IL FAUT INTERVENIR SUR LE SERVEUR " >> "$MAIL";
done

cat $MAIL | msmtp prenom.nom@monentreprise.fr;
rm $VERIF $FAILED $MAIL

Je dois faire une modification de la partie « envoi d’email » car je viens de percuter qu’il va m’envoyer un mail à chaque vérification (il sera programmé via cron).

Merci de m’avoir lu :wink:

un service de surveillance avec alerte serait plus simple. Car avec un script, outre la documentation associée, il faut assurer le suivi, la maintenance et les éventuelles évolutions, et c’est sans compter les entrées et départs de personnel.

Monit pourrait faire ton affaire.

L’option outil de surveillance n’est pas envisageable dans notre cas.

Il faut passer par le script.

Merci pour ta réponse

J’ai continué de chercher.
J’ai testé avec la commande systemctl is-failed. Quand je la saisie dans la console, j’ai bien un retour en « failed » mais dans le mail résultat du script, il est en « active ».
je vais devenir chèvre :smiley:

Bon j’ai finalement trouvé. J’ai remplacé la ligne :

systemctl status $service >> "$MAIL";

par

if [ $(ps | grep -v grep | grep $service | wc -l) -gt 0 ]
then
 echo "$service is running!!!"
else
 echo "$service is not running!!!"
fi

Cela ressemble à un gros bricolage…
C’est quand même dommage de ne pas utiliser les fonctionnalités de systemd pour cela. C’est bien documenté et il y a plein d’exemples sur le web.

1 J'aime

Je ne connaissais pas cette partie.
Merci pour le lien.
Par contre, elle semble très longue à mettre en place.
Si j’ai bien compris, il faut modifier chaque fichier pour ajouter les paramètres de notification et ce, sur chaque serveur.

Mon script n’est peut être pas « propre » mais en terme de temps de mise en place sur l’ensemble de nos serveurs, il n’y a pas photo.

Non c’est très rapide à mettre en place, il n’y a que deux fichiers à créer pour systemd et un petit script d’envoi de mail. S’il y a plusieurs serveurs on automatise avec ansible.
Je n’ai pas décortiqué ton script mais je doute qu’il fonctionne parfaitement.

Je vais regarder ca de plus près. Merci

pour mon script, il fonctionne… testé sur un serveur en plantant un service non essentiel ce matin :wink: