Como configurar MON para monitorar remotamente em sistemas Debian e controlar serviços locais

O objetivo é configurar em sistemas Debian o programa "mon" para monitorar REMOTAMENTE serviços e disparar ações conforme os eventos, inclusive controlar serviços locais.
Mon possui vários scripts monitores e de ações em sua seção contrib do repositório em do projeto MON
Os scripts podem ser complexos a ponto de executarem queries pré-definidas em bancos de dados remotos ou também enviar emails de alerta ao sysadmin.

Escopo
Utilizaremos como exemplo, monitorar a disponibilidade de conexão de rede TCP/IP com outra máquina remota. Se perder a conexão de rede, o mon disparará um script que irá PARAR o serviço heartbeat na máquina local SECUNDÁRIA do cluster de Alta Disponibilidade de serviço.
Isso para evitar uma situação de split brain no cluster, na falta de um cabo cross over entre as máquinas ou uma conexão serial direta.
Foi decidido não reiniciar o serviço heartbeat em caso de reconexão, recurso possível com o mon, para exigir verificação da situação pelo sysadmin.
Com base nesses objetivos, alguns parâmetros foram configurados, como a freqüência de execução e número de incidentes necessários para emitir alerta.

Procedimentos

Instalar mon e suas dependências
debianpgcluster2:~# apt-get update
debianpgcluster2:~# apt-get upgrade
debianpgcluster2:~# apt-get install mon

Criar diretório onde guardaremos os logs e conceder propriedade
debianpgcluster2:~# mkdir -p /var/log/mon
debianpgcluster2:~# chown -R mon.mon /var/log/mon

Conceder direitos de execução alheia
Para que o mon possa disparar um script que pare serviços na máquina local, terá de receber poderes de root SEM NECESSIDADE DE SENHA, concedidos pelo sudo.
Edite o arquivo /etc/sudoers para restringir o acesso de mon apenas a um comando específico:
# User alias specification
User_Alias SERVICE_ADMINS = mon
# Cmnd alias specification
Cmnd_Alias HEARTBEAT_STOP_ALERT = /usr/lib/mon/alert.d/heartbeat_stop.alert
Cmnd_Alias INVOKE_HEARTBEAT_STOP = /usr/sbin/invoke-rc.d heartbeat stop
# User privilege specification
root ALL=(ALL) ALL
SERVICE_ADMINS ALL=(root) NOPASSWD: HEARTBEAT_STOP_ALERT, INVOKE_HEARTBEAT_STOP

Edite o arquivo /etc/mon/mon.cf
Muita atenção que linhas separadoras de seções em branco são importantes.
Usaremos um serviço ping, implementado por fping, executado com NO MÍNIMO O DOBRO da freqüência de execução do heartbeat para o serviço de interesse, para garantir que sempre será possível detetar a queda de rede antes que o heartbeat identifique a falta de contato com o nó secundário E vice-versa, e assim entre em situação de split brain.
Não é recomendável ping sobre o gateway, pois pode ficar saturado e não responder a tempo.
Haverá um registro de downtime em /var/log/mon/downtime.log mantido pelo próprio mon.
O período de verificação do monitor é nos dias da semana de Domingo à Sábado, i.e., todos os dias. Week days; semana inicia domingo.
Versões recentes de mon não precisam ter tal especificação para esse uso, bastando deixar o período em branco, mas você precisa testar.
Mon disparará 1 alerta após 1 ocorrência, pois o sistema precisa detetar dentro do período definido pela freqüência e basta a primeira vez, pois não reiniciará automaticamente.
# /etc/mon/mon.cf, configuration file for mon
#
# Run `/etc/init.d/mon reload' after editing this file in order for your
# changes to take effect.
# There is no default configuration for mon. The docs most useful for
# setting up your /etc/mon/mon.cf file are the mon(1) man page,
# /usr/share/doc/mon/README.hints*, /usr/share/doc/mon/README.monitors*
# and /usr/share/doc/mon/examples/mon.cf*.
# When you do configure your server, it's a good idea to include these
# settings (to restrict access to the server to the local machine):
#
# serverbind = localhost
# trapbind = localhost
# global options
serverbind = localhost
trapbind = localhost
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
logdir = /var/log/mon
histlength = 100
#authfile = /etc/mon/auth.cf
dtlogging = yes
dtlogfile = downtime.log
#blank lines section separators are important!
hostgroup pingableservers
10.987.789.987
#blank lines section separators are important!
watch pingableservers
service ping
description verificar rede externa
interval 10s
monitor fping.monitor
period wd {Sun-Sat}
numalerts 1
alertafter 1
alert heartbeat_stop.alert
alert mail.alert -S "Network is down" admin@example.com
upalert mail.alert -S "Network is up" admin@example.com
# alert file.alert -d /var/log/mon network.log

Crie o arquivo de log /var/log/mon/heartbeat_stop.alert.log para o usuário mon
debianpgcluster2:~# touch /var/log/mon/heartbeat_stop.alert.log
debianpgcluster2:~# chown mon.mon /var/log/mon/heartbeat_stop.alert.log

Crie o arquivo /usr/lib/mon/alert.d/heartbeat_stop.alert
Mon, tal como cron, não executa scripts que gerem saída no console.
No script, redirecione toda saída de comandos para algum arquivo, em nosso caso usando sintaxe válida para bash.
No script que não precisa parâmetros, optamos por gerar logs separados, para o comando invocado e para o próprio script.
#!/bin/sh
#
echo "`date` $*" >> /var/log/mon/heartbeat_stop.alert.log
sudo invoke-rc.d heartbeat stop &>/var/log/mon/heartbeat_invoke.log

Depois conceda permissão de execução ao arquivo /usr/lib/mon/alert.d/heartbeat_stop.alert
debianpgcluster2:~# chmod a+x /usr/lib/mon/alert.d/heartbeat_stop.alert

Reinicie mon
debianpgcluster2:~# invoke-rc.d mon restart

Verifique o funcionamento do mon
debianpgcluster2:~# monshow --detail pingableservers,ping |less

Bibliografia
[0] http://www.kernel.org/software/mon/
[1] http://sourceforge.net/projects/mon/
[2] http://mon.cvs.sourceforge.net/viewvc/mon/mon-contrib/monitors/postgres/postgresql/postgresql.monitor?view=log
[3] http://www.debianhelp.co.uk/mon.htm
[4] http://www.is.depaul.edu/_downloads/SampleMONConfigFile.txt
[5] https://mon.wiki.kernel.org/index.php/Mon_Manual
[6] http://foswiki.sigsegv.cx/bin/view/Net/MONStuff

Comentários

Postagens mais visitadas deste blog

Tutorial Cyrus IMAP aggregator (murder) 2.3.16 sobre Debian GNU Linux 5.x Lenny

How to configure multipath for high availability and performance on Debian and CentOS for storage at IBM DS8300 SAN

Como instalar Oracle Client no Debian e Ubuntu