SERPRO, the Brazilian IT government agency, has been advancing in its collaboration with Debian Project.
This is a first preliminary informal report about these advancements. This is not an official statement from Debian Project nor SERPRO, yet.
Tech Force / Linux blog / MON Debian remoto controlar serviços locais
Este tutorial completo mostrará como montar um LABORATÓRIO de infra-estrutura de e-mail bastante escalável, para centenas de milhares de contas.
André Felipe Machado <andremachadoSPAMFILTER@techforce.com.br>
Quarta-Feira, 2 de Junho de 2010
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.
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.
debianpgcluster2:~# apt-get update debianpgcluster2:~# apt-get upgrade debianpgcluster2:~# apt-get install mon
debianpgcluster2:~# mkdir -p /var/log/mon debianpgcluster2:~# chown -R mon.mon /var/log/mon
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
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.logdebianpgcluster2:~# touch /var/log/mon/heartbeat_stop.alert.log debianpgcluster2:~# chown mon.mon /var/log/mon/heartbeat_stop.alert.log
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
debianpgcluster2:~# chmod a+x /usr/lib/mon/alert.d/heartbeat_stop.alert
debianpgcluster2:~# invoke-rc.d mon restart
debianpgcluster2:~# monshow --detail pingableservers,ping |less
[0] http://www.kernel.org/software/mon/
[1] http://sourceforge.net/projects/mon/
[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
SERPRO, the Brazilian IT government agency, has been advancing in its collaboration with Debian Project.
This is a first preliminary informal report about these advancements. This is not an official statement from Debian Project nor SERPRO, yet.