quinta-feira, 26 de agosto de 2010

Nagios - Traps para o Nagios no FreeBSD

Para este artigo foi utilizado o S.O FreeBSD 8.0-RELEASE-p3 e os seguintes softwares:

- Nagios Core Version 3.2.0
- net-snmp-5.5_3
- snmptt_1.3
- Mibs dos switches Dell


Definições dos aplicativos utilizados:

Nagios:

Originalmente escrito sob o nome Netsaint, o Nagios1 foi criado e ainda
e mantido por Ethan Galstad e sua equipe de mais de 150 desenvolvedores
espalhados por todo o mundo, dedicados a desenvolver plugins, corrigir bugs,
desenvolver uma interface web, produzir e traduzir a vasta documentacao, entre
outras atividades. Este software de monitoramento de redes e distribuido
livremente, atraves da lei de copyleft GPL. A habilidade em administrar
ambientes com infra-estrutura de WAN, LAN e MAN, e a interface grafica – GUI
utilizada lhe garantem desempenho comparavel a sistemas comerciais existentes,
como WhatsUp e BigBrother, assim como o Angel Network Monitor, o PIKT, o
Autostatus e outros2.

FONTE: NAGIOS -mono-HettyAndrade.pdf - www.ginux.ufla.br/files/mono-HettyAndrade.pdf

http://www.nagios.org/

Net-SNMP :

Uma extensão da implementação SNMP, ele quem irá escutar os TRAPS enviados pelos dispositivos de rede para o servidor Nagios. Utiliza a porta padrão de TRAP UDP 162 para escutar as notificações TRAPS.

http://net-snmp.sourceforge.net/

SNMPTT :

SNMP Trap Translator é um manipulador de traps escrito em Perl para ser usado com o Net-SNMP / UCD-SNMP. Ele irá se integrar com o Net-Snmp para pegar os Traps que o este software capturou.

http://snmptt.sourceforge.net/

Mibs:

Será necessário baixar a MIB SNMP dos equipamentos de rede que você queira que o Nagios exiba no sistema. Pode ser inserido qualquer equipamento para enviar TRAPS para o Nagios bastando o mesmo possuir em sua MIB informações de suas TRAPS.


Vamos para a configuração:

1 – Com a MIB do seu equipamento em mãos iremos então converter para o formato exigido pelo SNMPTT. Podemos fazer isto manualmente, no README têm explicando como fazer, porém já deixo informado que é um pouco complexo construir este arquivo nas unhas, podemos fazer então com um script Shell que vêm no .tar do SNMPTT. O nome do script shell que vêm com o aplicativo SNMPTT é snmpttconvertmib, e para converter uma MIB para o formato do SNMPTT utilizamos a seguinte linha de comando:

/home/leonardo.conrado/snmptt/snmptt_1.3/snmpttconvertmib --in=/home/leonardo.conrado/switch-6024f.mib --out=/etc/snmptt.dell-6024f.conf --exec='/usr/local/libexec/nagios/eventhandlers/submit_check_result $r TRAP 1'


Onde, os parâmetros:

--in : a mib a qual deseje converter para a formato do SNMPTT.

--out : arquivo gerado pelo script SNMPTT, ele contém os TRAPS extraidos do arquivo .mib original e formatado para a compreensão do SNMPTT.

--exec : comando a ser executado quando chegar um Trap no net-snmp e capturado pelo SNMPTT se existir este Trap no aquivo do SNMPTT será executado este comando. Neste caso o comando colocará um status para o Nagios exibir nos problemas do serviços de rede, ou seja, este arquivo citado no --exec o "submit_check_result", este script irá escrever um comando para o arquivo de comando/status do Nagios, o nagios.cmd. Nota: Este script destina-se a ser executado no mesmo host que está executando o Nagios.

$r : Variavel contendo informações sobre o problema informado pelo TRAP enviado, isto será exibido no Nagios.

TRAP : Serviço configurado no Nagios(Iremos configurar este serviço para o Nagios, mais adiante).

1 : Uma das variáveis reservada do Nagios. Isso irá setar como será exibido no Nagios o problema do Trap.
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
Se tiver muitos arquivos .mib para serem convertidos utilize este script .sh que cirei para converter os meus arquivos .mib de um equipamento:

!/bin/sh

for i in $( ls /home/leonardo.conrado/*.mib ); do
echo $i
/home/leonardo.conrado/snmptt/snmptt_1.3/snmpttconvertmib --in=$i --out=/etc/snmptt.mikrotik.conf --exec='/usr/local/libexec/nagios/eventhandlers/submit_check_result $r TRAP 1'
done


2 - Após converter os seus arquivos .mib vamos descompactar o .tar do aplicativo snmptt, e partirmos agora para a instalação do aplicativo snmptt para se integrar ao Nagios.

3 - Copie o arquivo snmptt para a pasta /usr/local/sbin (Lembrando que estamos configurando o snmptt no sistema FreeBSD), der permissão de execução para este arquivo(chmod +x snmptt);

4 - Copie o snmptt snmptthandler para a pasta /usr/local/sbin (Lembrando que estamos configurando o snmptt no sistema FreeBSD), der permissão de execução para este arquivo(chmod +x snmptthandler);

5 - Copie o arquivo snmptt.ini para /etc/, é neste arquivo que iremos indicar aonde estar o nosso arquivo .mib já convertido, para que a aplicação snmptt saiba as TRAPS
que deve registrar e enviar para o Nagios. No nosso caso devemos inserir no final deste arquivo snmptt.ini a linha: /etc/snmptt.dell-6024f.conf, conforme abaixo:

[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file). The COMPLETE path
# and filename. Ex: '/etc/snmp/snmptt.conf'

6 - Crie a pasta /var/log/snmptt/ ;

7 - Edite /usr/local/etc/snmptrapd.conf e adicione a linha: traphandle default /usr/local/sbin/snmptthandler no topo do arquivo;

8 - Crie a pasta /var/spool/snmptt/

9 - Vamos colocar a aplicação para iniciar automaticamente no startup do servidor, para os sistemas Linux como: Mandrake, Red Hat e outros distros Linux o tar do snmptt já traz um script para ser colocado na pasta init.d, porém, como estamos instalando no FreeBSD teremos que criar o nosso próprio script ou consegui-lo através dos ports, bem eu decidi faze-lo mesmo:

10 - Então crie um arquivo chamado snmptt dentro da pasta /usr/local/etc/rc.d/ e der permissão executavel para o mesmo(chmod +x /usr/local/etc/rc.d/snmptt), vamos editá-lo:

[root@noc /usr/sbin]# vi /usr/local/etc/rc.d/snmptt


#!/bin/sh
# PROVIDE: snmptt
# REQUIRE: DAEMON
# BY LEONARDO COUTO CONRADO
. /etc/rc.subr

name="snmptt"

rcvar="`set_rcvar`"

load_rc_config $name

: ${snmptt_enable="YES"}

command="/usr/local/sbin/${name}"
command_args="--daemon"
procname=/usr/bin/perl
pidfile="/var/run/${name}.pid"

run_rc_command "$1"


11 - Edite também o arquivo /etc/rc.conf e adicione a seguinte linha: snmptt_enable="YES"

12 - Aproveitando a edição do arquivo /etc/rc.conf coloque ou modifique as linhas referentes aos serviços que trabalham junto com o snmptt, são eles o snmptrapd(Responsável por escutar as TRAPS enviadas pelos seus equipamentos de rede) e o serviço snmp. O arquivo que estar em produção aqui estar dessa forma:

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# Enable of SNMP - Simple Network Management Protocol
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
snmpd_enable="YES"
snmpd_flags="-a"
snmpd_conffile="/usr/local/share/snmp/snmpd.conf"

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# Enable of snmptrapd_enable for traps
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
snmptrapd_enable="YES"
snmptrapd_flags="-a -On -Lsd -p /var/run/snmptrapd.pid -c /usr/local/etc/snmptrapd.conf"

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# Enable of snmptt_enable for NAGIOS to receiver traps of equipaments of the network
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
snmptt_enable="YES"

13 - Você pode também iniciar a aplicação para testa-la, para debug, com o comando:

snmptt --daemon


Para debugar possiveis erros visualize o seu /var/log/messages e também utilize o comando ps auxww | grep snmptt, abaixo mostro que os processos estão rodando de forma correta:

[root@noc /etc]# ps auxww | grep snmptt
root 886 0.0 0.4 23124 2244 ?? Ss 14Sep10 1:27.46 /usr/bin/perl /usr/local/sbin/snmptt --daemon (perl5.8.9)
root 887 0.0 0.7 23124 3448 ?? Ss 14Sep10 5:01.94 /usr/bin/perl /usr/local/sbin/snmptt --daemon (perl5.8.9)
root 25856 0.0 0.2 8060 1108 0 S+ 4:34PM 0:00.01 grep snmptt


Vejam que ele inicia duas instâncias do snmptt.

14 - Um possível erro que pode ocorrer durante o startup do daemon snmptt estar relacionado a alguns módulos do perl estarem faltando ou alguns INIFiles. Comigo o erro que aconteceu foi o seguinte abaixo:

9.4. I see following error: Can't locate Config/IniFiles.pm in @INC ...What should I do?

It's likely that you don't have required Perl modules installed. In this case it's Config::IniFiles that is missing. The easiest way to install Perl modules is to use CPAN extension, eg. perl -MCPAN -e 'install Config::IniFiles'.

Para resolver este caso execute a instalação dos INIFiles conforme mostro abaixo:

perl -MCPAN -e 'install Config::IniFiles'


Bem agora iremos para a parte de integração com o Nagios:

1 - Baixe o .tar do Nagios, aqui utilizei o nagios-3.2.0.tar.gz

tar -xzf nagios-3.2.0.tar.gz


2 - Iremos copíar o script submit_check_result da pasta descompactada do Nagios para a pasta /usr/local/libexec/nagios/eventhandlers/, este script é o responsável por pegar a TRAP e colocar no arquivo nagios.cmd que é o arquivo que coloca todos os eventos/status dos equipamentos em fila para que seja exibido no Nagios. Na verdade quem captura a TRAP é daemon snmptrapd ele fica escutando as TRAPS na porta UDP 161 do seu servidor Nagios e então captura qualquer TRAP que for enviada para o seu servidor, quando a trap é capturada o daemon do snmptt pega essas informações registradas pelo snmptrapd e então verifica no arquivo de mib convertido para ver se encontra algum OID com o mesmo valor do OID do TRAP recebido, se encontrar então ele executa o parametro EXEC referente ao OID encontrado, exemplo na prática:

1 - Um cooler do Switch dell 6024F, que estar configurado para enviar TRAPS para o servidor Nagios, parou, nesse momento o switch envia um pacote TRAP com OID .1.3.6.1.4.1.674.10895.3000.2.1.0.1 para o servidor Nagios.

2 - O daemon snmptrapd que estar escutando na porta UDP 161 captura este pacote e registra em seu log;

3 - O daemon snmptt sabendo desse recebimento de TRAP irá verificar para ver se o OID do TRAP recebido é igual algum OID que estar naquele arquivo convertido a partir de algum arquivo .mib, lembra? Nesse caso que estamos descrevendo, houve a conversão de diversos arquivos .mib baixados no site da Dell referentes a seus switches de série 6020F e convertidos para o padrão exigido do snmptt.

4 - Se houver o OID no arquivo .mib convertido ,então, o daemon do snmptt irá para o próximo passo que é executar o EXEC referente a esse OID, no caso como foi um cooler do switch que parou ele dispara o EXEC do OID .1.3.6.1.4.1.674.10895.3000.2.1.0.1, este OID é o que mostro abaixo:

EXEC /usr/local/libexec/nagios/eventhandlers/submit_check_result $r TRAP 2 "Product Global Status Change.: The product global status has changed from $2 to $1 at time $3."

Este EXEC executa o script do Nagios o submit_check_result passando parametros que são as informações necessárias para exibir o status do equipamento no Nagios.

DETALHE! ATENÇÂO!
Devemos fazer uma modificação no script submit_check_result, já que estamos configurando para o FreeBSD, o detalhe estar na variável CommandFile do script esta variável aponta o arquivo nagios.cmd do Nagios, que por sinal fica em um local diferente das instalações realizadas em distros Linux. Você deve trocar:

De:

CommandFile="/usr/local/nagios/var/rw/nagios.cmd"

Para:

CommandFile="/var/spool/nagios/rw/nagios.cmd"


Bom o que devemos fazer agora é a configuração nos arquivos .cfg do Nagios:

1 - Configurar um template para o serviço TRAP, então:

vi /usr/local/etc/nagios/objects/templates.cfg


Adicione as linhas abaixo:

############################################################################################
# CREATED FOR THE TRAP SERVICE
############################################################################################
# MODELO 01:
#######################################################################
define service{
name generic-trap-service
register 0
is_volatile 1
check_period 24x7
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
active_checks_enabled 0
passive_checks_enabled 1
retain_status_information 1
retain_nonstatus_information 1
notification_interval 31536000
notification_period 24x7
notification_options w,u,c
notifications_enabled 1
check_freshness 1 Enable freshness checking
freshness_threshold 360 Reset trap alert every 6 min
contact_groups admins
}


2 - Como estamos monitorando TRAPS vindos de switches irei adicionar mais um serviço para os switches

vi /usr/local/etc/nagios/objects/servicesswitch.cfg


Adiciona para cada switch da minha rede mais um serviço a ser monitorado, o do TRAP:

# Define a service TRAP for switch/equipament
define service{
use generic-trap-service
host_name SWHCDB13448P
service_description TRAP
check_command check-host-alive
}


OK, após estas configurações iremos dar um reload no Nagios para ele recarregar as configurações:

[root@noc /usr/local/etc/nagios/objects]# /usr/local/etc/rc.d/nagios reload


Pronto, é isso, com este procedimento deveremos ter o Nagios recebendo os TRAPS dos equipamentos habilitados para enviar TRAP para o servidor Nagios.

Seguidores