Monit

Monit est un service de monitoring qui vérifie que certaines conditions sont remplies (tel fichier a tel checksum, tels droits, tel service tourne, tel requete tcp/ip renvoie tel truc, etc) et lance des actions sinon (redémarrer, mail d'alerte).

Dans squeeze, c'est la 5.1 qui est dispo, mais elle marche pas dans un container openvz (pb de lecture des infos de ram, pas grave mais 2 lignes d'erreur par check), mais c'est assez simple de récupérer la 5.4 (un binaire et une page de man).

Syntaxe

On va se créer un fichier /etc/monit/serviceTruc par service à surveiller.

La syntaxe est assez simples, avec les deux seules entrées

  • set itemAConfigurer
  • check serviceASurveiller

Pour un process vaut mieux un pidfile, mais on peut préciser une regex, pour un fichier le chemin.

Ensuite, faut commencer avec les exemples fournis sur http://mmonit.com/wiki/Monit/ConfigurationExamples

La page de man est très complète.

On peut tester certaines choses gourmandes de temps en temps seulement (ou sauf sur certaines tranches horaires où c'est "normal" de sortir des clous), avec every

 check process toto matching /usr/local/bin/toto # prend le 1er process qui satisfait la regex
 every 2 cycles ...
 check process mysqld with pidfile /var/run/mysqld.pid
 not every "* 0-3 * * 0" # on vérifie pas entre minuit et trois heures du mat le dimanche

Il connait les protocoles : APACHE-STATUS DNS DWP FTP GPS HTTP IMAP CLAMAV LDAP2 LDAP3 LMTP MEMCACHE MYSQL NNTP NTP3 POP POSTFIX-POLICY RADIUS RDATE RSYNC SIP SMTP SSH TNS PGSQL, ce qui permet de faire par ex du

Ça permet de faire du

if failed host 192.168.1.100 port 8080 protocol http 
   and request '/testing' hostheader 'example.com' 
   with timeout 20 seconds for 2 cycles 
then alert

if failed port 80 protocol http

  and request "/page.html"
      with checksum 8f7f419955cefa0b33a2ba316cba3659 

then alert

if failed unixsocket /var/run/php5-fpm/mypool.socket ...
if failed (url http://myhost.tld/check and content == 'OK') then alert

En théorie on peut faire du

if failed host sqlhost port 3306 protocol mysql send "string de connexion + select" expect "résultat attendu" then alert

mais la chaîne de connexion est un peu compliquée à élaborer, autant avoir un script externe qui utilise le binaire mysql et filtre avec awk pour répondre OK (par exemple).

check program toto with path "/root/toto.sh" 
  if status != 0 then alert

et dans toto.sh on met par ex (stderr sera dans le mail d'alerte)

# ... params
# la requete doit renvoyer 1
nb=$(mysql $MYSQL_OPTS -e "$QUERY")
if [ "$nb" != "1" ] 
then
  echo "Avec mysql $MYSQL_OPTS -e '$QUERY' >&2
  echo "On a pas récupéré '1' mais $nb" >&2
  exit 1
fi
exit 0
 
linux/monit.txt · Dernière modification: 30/08/2012 19:01 par daniel