Folosesc deja de multă vreme Nagios. Nagios este foarte util pentru notificări despre servicii pe diverse servere ce nu funcționează. Poate trimite notificări prin e-mail, SMS(având un SMS gateway conectat), poate vorbi în boxe(prin intermediul festival) sau poate destul de multe notificări.
Însă nagios face doar notificări. Rulează sub un user simplu, pentru anumite comenzi(ce nu pot fi rulat de sub un simplu user) face sudo (cu supraveghere atentă).
Până nu demult aveam întipărită bine în minte ideea că dacă vreau ceva care să verifice starea unui Program și să ia măsuri în anumite situații trebuie să fac un script, aveam în cap chiar și un exemplu (de la eggdrop, remember IRC?) care să îl pun să ruleze în cron.
Ieri m-a întrebat despre așa ceva, pe messenger, unul dintre cititorii acestui blog. I-am dat aceleași răspunsuri pe care le-am scris mai sus dar se pare că pe el nu l-a mulțumit. A tot căutat și el pe net până a dat de un tutorial pe care mi l-a pasat.
Software-ul pare a fi unul destul de matur, a ajuns la versiunea a 5-a(În repozitoarele Debian stable sau Ubuntu LTS e la versiunea 4.8.x). Are chiar și o interfață web pe care totuși nu v-aș recomanda să o porniți, iar dacă o porniți să nu o lăsați liberă publicului larg(în primul rând daemonul rulează sub userul root).
Monit este capabil ca în funcție de diverși parametrii ai aplicatiei, cum ar fi memoria RAM utilizată, nivelul de încărcare al procesorului, dispariția activității pe portul TCP sau UDP să ia anumite măsuri, adică să lanseze anumite comenzi de oprire/pornire/repornire a serviciilor sau chiar modificarea permisiunilor asupra fișierelor.
Dar gata cu vorba lungă, care contrar reclamelor de la TV, este sărăcia omului și să ne apucăm de treabă. Începem cu instalarea pachetului. Nu avem de făcut decât să rulăm ca root următoarea comandă:
apt-get install monit
yum install monit
Ce se îtâmplă?:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
monit
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 254kB of archives.
After this operation, 680kB of additional disk space will be used.
Get:1 http://ftp.nb.lug.ro hardy/universe monit 1:4.8.1-2.1 [254kB]
Fetched 254kB in 0s (1966kB/s)
Selecting previously deselected package monit.
(Reading database ... 79286 files and directories currently installed.)
Unpacking monit (from .../monit_1%3a4.8.1-2.1_i386.deb) ...
Setting up monit (1:4.8.1-2.1) ...
Starting daemon monitor: -e monit won't be started/stopped
unless it it's configured
please configure monit and then edit /etc/default/monit
and set the "startup" variable to 1 in order to allow
monit to start
Edităm ulterior fișierul /etc/default/monit
startup=1
CHECK_INTERVALS=180
Edităm /etc/monit/monitrc
set alert [email protected] #adresa de e-mail validă unde se vor trimite notificările
include /etc/monit.d/*
Creem directorul /etc/monit.d și creem câte un fișier de configurare pentru diversele servicii ce urmează să le monitorizăm.
mkdir /etc/monit.d
cd /etc/monit.d/
Iată câtvea exemple:
apache2:
check process apache2 with pidfile /var/run/apache2.pid
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if cpu > 60% for 2 cycles then alert
if cpu > 80% for 5 cycles then restart
if totalmem > 1.5 GB for 5 cycles then restart
if children > 50 then restart
if loadavg(5min) greater than 10 for 8 cycles then stop
group lamp
bind9:
check process named with pidfile /var/run/bind/run/named.pid
start program = "/etc/init.d/bind9 start"
stop program = "/etc/init.d/bind9 stop"
if failed host 127.0.0.1 port 53 type tcp protocol dns then alert
if failed host 127.0.0.1 port 53 type udp protocol dns then alert
if 5 restarts within 5 cycles then timeout
group dns
dovecot:
check process dovecot with pidfile /var/run/dovecot/master.pid
group mail
start program = "/etc/init.d/dovecot start"
stop program = "/etc/init.d/dovecot stop"
if 5 restarts within 5 cycles then timeout
if failed port 110 type TCP protocol POP then restart
if failed port 143 type TCP protocol IMAP then restart
mysql:
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if cpu > 60% for 2 cycles then alert
if cpu > 80% for 5 cycles then restart
if totalmem > 1.0 GB for 5 cycles then restart
if children > 50 then restart
if failed host 127.0.0.1 port 3306 protocol mysql then restart
if 5 restarts within 5 cycles then timeout
if loadavg(5min) greater than 10 for 8 cycles then stop
group lamp
postfix:
check process postfix with pidfile /var/spool/postfix/pid/master.pid
group mail
start program = "/etc/init.d/postfix start"
stop program = "/etc/init.d/postfix stop"
if failed port 25 protocol smtp then restart
if 5 restarts within 5 cycles then timeout
proftpd:
check process proftpd with pidfile /var/run/proftpd.pid
start program = "/etc/init.d/proftpd start"
stop program = "/etc/init.d/proftpd stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout
group lamp
ssh:
check process sshd with pidfile /var/run/sshd.pid
start program = "/etc/init.d/ssh start"
stop program = "/etc/init.d/ssh stop"
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
group ssh
webmin:
check process webmin with pidfile /var/webmin/miniserv.pid
group webmin
start program = "/etc/init.d/webmin start"
stop program = "/etc/init.d/webmin stop"
if failed host 127.0.0.1 port 8080 then restart
if 5 restarts within 5 cycles then timeout
check file webmin_rc with path /etc/init.d/webmin
group webmin
if failed checksum then unmonitor
if failed permission 755 then unmonitor
if failed uid root then unmonitor
if failed gid root then unmonitor
În final pornim serviciul de monitorizare
/etc/init.d/monit start
Starting daemon monitor: monit.