segunda-feira, 30 de novembro de 2009

Nagios + NSClient++ + NagiosQL + NDOUtils no CentOS 5.3

Introdução:
Este material foi preparado para as minhas aulas de gerência de redes, mas resolvi compartilhar, pois pode ser útil para alguém.

Basicamente peguei vários tutoriais da internet (ver referências) e adaptei para minhas necessidades e realidade da distribuição escolhida.

Neste tutorial abordarei a instalação e configuração dos seguintes itens:
  • Nagios - Software de gerência de redes.
  • NagiosQL - Interface Web para administração das configurações do Nagios, armazena as configurações em uma base de dados.
  • NDOUtils - Addon que permite armazenar os as informações colhidas pelo Nagios em uma base de dados.
Sobre o Nagios:
Nagios é uma popular aplicação de monitoração de rede de código aberto distribuída sob a licença GPL. Ele pode monitorar tanto hosts quanto serviços, alertando-o quando ocorrerem problemas e também quando os problemas forem resolvidos.

O Nagios foi originalmente criado sob o nome de Netsaint, foi escrito e é atualmente mantido por Ethan Galstad, junto com um exército de desenvolvedores que ativamente mantém plugins oficiais e não-oficiais.

Nagios primeiramente foi escrito para o sistema operacional Linux, mas pode rodar em outros Unixes também.

Características:
  • Monitora serviços de rede (SMTP, POP3, HTTP, NNTP, ICMP, SNMP)
  • Monitora recursos de computadores ou equipamentos de rede (carga do processador, uso de disco, logs do sistema) na maioria dos sistemas operacionais com suporte a rede, mesmo o Microsoft Windows com o uso de plugins.
  • Monitoração remota suportada através de túneis criptografados SSH ou SSL.
  • Desenvolvimento simples de plugins que permite aos usuários facilmente criar seus próprios modos de monitoração dependendo de suas necessidades, usando a ferramenta de desenvolvimento da sua escolha (Bash, C, Perl, Python, PHP, C#, etc.)
  • Checagem dos serviços paralelizadas, ou seja, se você tiver muitos ítens monitorados não há risco de alguns deles não serem checados por falta de tempo.
  • Capacidade de definir a rede hierarquicamente definindo equipamentos "pai", permitindo distinção dos equipamentos que estão indisponíveis daqueles que estão inalcançáveis.
  • Capacidade de notificar quando um serviço ou equipamento apresenta problemas e quando o problema é resolvido (via email, pager, SMS, ou qualquer outro meio definido pelo usuário por plugin).
  • Capacidade de definir tratadores de eventos que executam tarefas em situações pré-determinadas ou para a resolução pró-ativas de problemas.
  • Rotação automática de log.
  • Suporte para implementação de monitoração redundante.
  • Excelente interface web para visualização do atual status da rede, notificações, histórico de problemas, arquivos de log, etc…
  • Versão atual, estável: 3.2.0
Instalação:
Primeiro vamos instalar os pré-requisitos do Nagios. Os pré-requisitos são:
  • Apache
  • GD Development Libraries
  • GCC compiler and development libraries
# yum install httpd gd gd-devel gcc

Depois de instalados os pré-requisitos criaremos um usuário e grupo para o Nagios conforme abaixo.

Criação do usuário:
# adduser nagios
# passwd nagios

Obs.: Após executar o comando "passwd nagios", crie uma senha para o usuário nagios.

Agora é preciso criar um grupo que chamaremos de "nagcmd" para permitir que comandos externos sejam passados pela interface web.
# groupadd nagcmd
# usermod -G nagcmd nagios
# usermod -G nagcmd apache

Download, Descompactação e Instalação do Nagios e dos Plugins:
# cd /install/
# mkdir nagios
# cd nagios/
Fazer o download do Nagios e dos plugins (www.nagios.org/download) para o diretório acima:
# wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-*.tar.gz
# wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-*.tar.gz
Obs.: Onde "*" corresponde a versão do nagios.

Descompactar os arquivos:
# tar xzvf nagios-*.tar.gz

Entrar no diretório do Nagios:
# cd nagios-*

Rodar o script de configuração do Nagios (Para ver as opções: #./configure --help):
#./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios --with-htmurl=/nagios --with-cgiurl=/nagios/cgi-bin --with-command-group=nagcmd --with-gd-lib=/usr/lib --with-gd-inc=/usr/include

Compilar o Nagios:
# make all (Compila os fontes)
# make install (Instala o programa principal, as CGIs e os arquivos HTML)
# make install-init (Instala o script de inicialização em /etc/rc.d/init.d)
# make install-config (Instala arquivos de configuração de exemplo [*SAMPLE*] em /usr/local/nagios/etc)
# make install-commandmode (Instala e configura permissões para o diretório que conterá o arquivo de comandos externos)

Descompactar os arquivos:
# cd /install/nagios/
# tar xzvf nagios-plugins-*.tar.gz

Entrar no diretório dos Plugins do Nagios:
# cd nagios-plugins-*

Rodar o script de configuração dos plugins (Para ver as opções: #./configure --help):
#./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios

Compilar os plugins:
# make
# make install

Configuração da Interface Web – Apache:
Por padrão o Nagios não possui controle de usuários, por isso vamos criar uma autenticação simples através do apache.

Editar o arquivo httpd.conf e inserir as linhas abaixo.
# vi /etc/httpd/conf/httpd.conf

###############################################################################
# HTML (http://localhost/nagios) AND CGI APACHE AUTHENTICATION
###############################################################################
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
<Directory "/usr/local/nagios/sbin">
AllowOverride AuthConfig
Options ExecCGI
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
require valid-user
</Directory>

Alias /nagios "/usr/local/nagios/share"
<Directory "/usr/local/nagios/share">
AllowOverride AuthConfig
Options None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
require valid-user
</Directory>
###############################################################################

Criando usuário e senha para autenticar na interface web:
# htpasswd -c /usr/local/nagios/etc/htpasswd.users usuario1

Reiniciando o Apache:
# service httpd restart

Após isso, já deve ser possível visualizar a interface web do Nagios a partir do endereço http://localhost/nagios no navegador. Entretanto, as CGIs não fornecerão informação alguma (ainda é necessário configurar corretamente o Nagios).

Verificando se há erros nas configurações do Nagios:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Iniciando o Nagios:
# service nagios start

Iniciando nagios automáticamente:
# chkconfig --add nagios
# ntsysv
Verifique que a opção nagiso já está marcada:


Arquivos de configuração do Nagios:
# cd /usr/local/nagios/etc/
# ls -las *.cfg

nagios.cfg: Arquivo de configuração principal do Nagios, responsável por iniciar os serviços de monitoramento, é neste arquivo que fazemos referência aos demais arquivos de configuração (.cfg).
cgi.cfg: Arquivo de configuração dos programas CGIs localizados na pasta sbin.
resource.cfg: Macros definidas pelos usuários.

# cd /usr/local/nagios/etc/objects/
# ls -las *.cfg

commands.cfg: Definição dos comandos que podem ser executados pelo Nagios.
contacts.cfg: Contatos que deverão ser notificados caso ocorra algum problema, definição de grupos de contatos.
timeperiods.cfg: Informações sobre o período de monitoramento, podem ser definidos vários períodos de monitoramento diferentes.
templates.cfg: Definição dos modelos e exemplos de diversos tipos de configuração como hosts, serviços, contatos, etc.

Nagios.cfg:
# vi /usr/local/nagios/etc/nagios.cfg
Verifique se a seguinte linha está descomentada:
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg

Localhost.cfg:
# vi /usr/local/nagios/etc/objects/localhost.cfg
Adicionar as linhas referente as imagens:
# Localhost
define hostextinfo{
host_name localhost
icon_image linux40.png
icon_image_alt Localhost
vrml_image linux40.png
gd2_image linux40.gd2
register 1
}

Adicionar/Alterar as linhas referente a serviços:
# Serviço de checagem do espaço em disco na partição root da máquina local.
# Warning se <> 20 usuários, Critical se > 50 usuários.
define service{
use local-service ; Name of service template to use
host_name localhost
service_description Current Users
is_volatile 0
check_period 24x7
max_check_attempts 4
normal_check_interval 5
retry_check_interval 1
contact_groups admins
notification_options w,u,c,r
notification_interval 960
notification_period 24x7
check_command check_local_users!20!50
}

# Serviço de checagem do número de processos correntemente rodando na máquina local.
# Warning se > 250 processos, Critical se > 400 processos.
define service{
use local-service ; Name of service template to use
host_name localhost
service_description Total Processes
is_volatile 0
check_period 24x7
max_check_attempts 4
normal_check_interval 5
retry_check_interval 1
contact_groups admins
notification_options w,u,c,r
notification_interval 960
notification_period 24x7
check_command check_local_procs!250!400
}

# Serviço de checagem da carga na máquina local.
define service{
use local-service ; Name of service template to use
host_name localhost
service_description Current Load
is_volatile 0
check_period 24x7
max_check_attempts 4
normal_check_interval 5
retry_check_interval 1
contact_groups admins
notification_options w,u,c,r
notification_interval 960
notification_period 24x7
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
}

# Serviço de "ping" da máquina local
define service{
use local-service ; Name of service template to use
host_name localhost
service_description PING
is_volatile 0
check_period 24x7
max_check_attempts 4
normal_check_interval 5
retry_check_interval 1
contact_groups admins
notification_options w,u,c,r
notification_interval 960
notification_period 24x7
check_command check_ping!100.0,20%!500.0,60%
}

Cgi.cfg:
# vi /usr/local/nagios/etc/cgi.cfg
Realizar as alterações (e descomentar, se for o caso):
use_authentication=1
authorized_for_system_information=usuario1
authorized_for_configuration_information=usuario1
authorized_for_system commands=usuario1
authorized_for_all_services=usuario1
authorized_for_all_hosts=usuario1
authorized_for_all_service_commands=usuario1
authorized_for_all_host_commands=usuario1

Timeperiods.cfg:
# vi /usr/local/nagios/etc/objects/timeperiods.cfg
Verificar as opções existentes e criar novos agendamentos se houver necessidade (esquemas de plantão por exemplo).

Commands.cfg:
# vi /usr/local/nagios/etc/objects/commands.cfg
Verificar as opções existentes e criar novos comandos se houver necessidade.

Contacts.cfg:
Realizar as alterações:
# vi /usr/local/nagios/etc/objects/contacts.cfg
define contact{
contact_name usuario1
alias Usuario 1
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email email@localhost.localdomain # Endereco de e-mail do usuario1.
}

define contactgroup{
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin, usuario1
}

Observação:
service_notification_options:
w,u,c,r ( w=warning / u=unknown / c=critical / r=recoveries / n=none)
host_notification_options:
d,u,r ( d=down / u=notify / r=recoveries / n=none )

Verificando se há erros nas configurações do Nagios:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Reiniciando o Nagios:
# service nagios restart

Agora o Nagios já esta funcionando e monitorando o host local, os mesmos procedimentos podem ser utilizados para monitorar outros hosts com SO GNU/Linux, o próximo passo será a instalação do agente em um host com SO MS-Windows e a configuração necessária para o Nagios monitorar este host.

Utilizando Nagios NSClient++ para Monitorar Servidores Windows Remotos:

Introdução:
Como utilizar o Nagios para monitorar minhas estações e servidores com SO MS-Windows?
Utilizando o addon NSClient++ para executar o Nagios plugins no host e retornar as informações para o Nagios.

Instalação:
Faça o download da última versão do arquivo NSClient++.
Dê um dulo clique no arquivo NSClient++.msi, surge a tela inicial, clique em Next


Tela da licença, marque a opção "I accept the terms int the License Agreement" e clique em Next


Escolha o local de instalação e as opções de instalação e clique em Next


Escolha "Use the new configuration file" e clique em Next


Coloque o IP do servidor de Nagios e a Senha para este host, marque todas as opções exceto a opção "Enable NSCA Client"*, clique em Next


* NSCA - Nagios Service Check Acceptor é um puglin para receber dados dos clientes no modo passivo, ou seja, você acessa a máquina do cliente e faz ela enviar as informações para seu servidor Nagios, que já estará aguardando para receber as informações.

Isto é muito útil quando precisamos monitorar vários servidores e não podemos mexer no firewall de nenhum deles, pois o NSCA envia as informações dos servidores sem a necessidade de liberação de portas no firewall.

Na última tela desmarque a opção "Start Service" e clique em finish


Clique em Iniciar // Executar // services.msc e clique em OK


Localize o serviço "NSClient++" e dê um duplo clique para abrir as propriedades do serviço.


Na guia "Log On" marque a opção "Allow service to interact with desktop", clique em OK e inicie o serviço.


Habilitar o suporte a hosts MS-Windows:
# vi /usr/local/nagios/etc/nagios.cfg
Descomentar a linha abaixo:
cfg_file=/usr/local/nagios/etc/objects/windows.cfg

Configurar a senha de acesso ao NSClient++:
# vi /usr/local/nagios/etc/objects/commands.cfg
Altere a entrada do comando check_nt para incluir o argumento de senha “-s”. Altere “yourpassword” para a senha que você configurou durante a instalação do NSClient++:

define command{
command_name check_nt
command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -s yourpassword -v $ARG1$ $ARG2$
}

Editar o template do Windows:
# vi /usr/local/nagios/etc/objects/windows.cfg
define host{
use windows-server ; Inherit default values from a Windows server template (make sure you keep this line!)
host_name mywinserver
alias Windows Server
address 192.168.1.100
}

define service{
use generic-service
host_name mywinserver
service_description NSClient++ Version
check_command check_nt!CLIENTVERSION
}

Verificando se há erros nas configurações do Nagios:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Reiniciando o Nagios:
# service nagios restart

Instalando e configurando o NagiosQL:
Introdução:
O NagiosQL é uma interface web onde através dela é possível configurar o Nagios sem a necessidade de acessarmos configurações via linha de comando. Através de formulários é possível criar hosts, services e groups para monitoramento e notificação. Ótima ferramenta para ser integrada no nosso kit do Nagios.

Download, Descompactação e Instalação do Nagios e dos Plugins:
# cd /install
# mkdir nagiosql
# cd nagiosql

Fazer o download do Nagios para o diretório acima:
# wget http://sourceforge.net/projects/nagiosql/files/nagiosql/NagiosQL*/nagiosql*.tar.gz/download

Descompactar os arquivos:
# tar xzvf nagiosql*.tar.gz

Mover o diretório para o diretório padrão do apache:
# mv nagiosql nagiosQL
# mv nagiosQL/ /var/www/html/

Criar o arquivo que permite o início da instalação (ENABLE_INSTALLER):
# touch /var/www/html/nagiosQL/install/ENABLE_INSTALLER

Alterar as permissões do diretório:
# chown -R apache:apache /var/www/html/nagiosQL/config/

Suprir as dependências:
# yum install php-pear
# pear install HTML_Template_IT

Iniciar o Apache e o MySQL:
# service httpd restart
# service mysqld start

Instalando o NagiosQL:
Aponte o navegador para http://IP/nagiosQL/
Tela Inicial, escolha o idioma e clique em “Start New Installation


Tela de checagem de pré-requisitos, você pode ver os detalhes clicando em “+”, clique em Next:


Tela de configuração da Base de Dados, lembre-se de colocar uma senha para a base e também para o usuário Admin, clique em Next:


Resumo da instalação, clique em Finish:


O NagiosQL não inicia enquanto o arquivo “ENABLE_INSTALLER” não for removido


Remova o arquivo “ENABLE INSTALLER”:
# rm -rf /var/www/html/nagiosQL/install/ENABLE_INSTALLER

Atualize a tela (F5), o login então é disponibilizado:


Configurações Pós Instalação:
Criar os diretórios:
# mkdir -p /etc/nagiosql/{hosts,services,backup/{hosts,services}}

Alterar as permissões:
# chgrp apache /usr/local/nagios/
# chgrp apache /usr/local/nagios/etc/nagios.cfg
# chgrp apache /usr/local/nagios/etc/cgi.cfg
# chmod 775 /usr/local/nagios/
# chmod 664 /usr/local/nagios/etc/nagios.cfg
# chmod 664 /usr/local/nagios/etc/cgi.cfg
# chmod 6755 /etc/nagiosql/
# chown apache.nagios /etc/nagiosql/
# chmod 6755 /etc/nagiosql/hosts/
# chown apache.nagios /etc/nagiosql/hosts/
# chmod 6755 /etc/nagiosql/services/
# chown apache.nagios /etc/nagiosql/services/
# chmod 6755 /etc/nagiosql/backup/
# chown apache.nagios /etc/nagiosql/backup/
# chmod 6755 /etc/nagiosql/backup/hosts/
# chown apache.nagios /etc/nagiosql/backup/hosts/
# chmod 6755 /etc/nagiosql/backup/services/
# chown apache.nagios /etc/nagiosql/backup/services/
# chown apache.nagios /usr/local/nagios/bin/*
# chown apache.nagios /usr/local/nagios/etc/resource.cfg
# chown apache.nagios -R /usr/local/nagios/var/spool/checkresults/
# chown apache.nagios /usr/local/nagios/var/rw/nagios.cmd

Finalizando:
Por padrão o NagiosQL busca a informações do Nagios em /etc/nagios, porém esse não é o diretório onde se encontram os arquivos de configuração do Nagios. Para corrigir isso deve-se criar um link simbólico de /usr/local/nagios/etc para /etc/nagios:
# ln -s /usr/local/nagios/etc /etc/nagios

Criar o diretório de importação:
# mkdir /etc/nagios/import

Realizar a importação dos arquivos para o NagiosQL:
Faça o login na interface do NagiosQL:


Clique em Tools // Data Import:


Selecione os arquivos segurando o CTRL, clique em Import:


Se tudo ocorreu bem, você recebe mensagens em verde com as informações:


Clique em Tools // Nagios Control e clique nos botões “Do It” das opções “Write monitoring data” e “Write additional data”:


Clique em Administration// Domains e clique no botão “Modify” (Botão de Ferramentas):
Confira o caminho das opções abaixo:

Nagios command file /usr/local/nagios/var/rw/nagios.cmd
Nagios binary file /usr/local/nagios/bin/nagios
Nagios process file /usr/local/nagios/var/nagios.lock
Clique em Save

Depois de realizados os procedimentos na interface gráfica, precisamos finalizar as configurações nos arquivos de configuração:
# vi /usr/local/nagios/etc/nagios.cfg

Em OBJECT CONFIGURATION FILE(S) comente os "cfg_file" e "cfg_dir" e insira o seguinte bloco de comandos:
cfg_file=/etc/nagiosql/contacttemplates.cfg
cfg_file=/etc/nagiosql/contactgroups.cfg
cfg_file=/etc/nagiosql/contacts.cfg
cfg_file=/etc/nagiosql/timeperiods.cfg
cfg_file=/etc/nagiosql/commands.cfg
cfg_file=/etc/nagiosql/hosttemplates.cfg

cfg_file=/etc/nagiosql/hostgroups.cfg
cfg_file=/etc/nagiosql/servicegroups.cfg
cfg_file=/etc/nagiosql/servicetemplates.cfg

cfg_dir=/etc/nagiosql/hosts
cfg_dir=/etc/nagiosql/services

Verifique a configuração do Nagios:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Agora você pode configurar e controlar suas alterações via interface Web, sem a necessidade de ficar editando comandos e com a vantagem de que todas as configurações estão armazenadas em uma base de dados.

Instalando NDOutils (MySQL Connector) em ambiente CentOs 5.3:
Introdução:
NDOUtils é um addon que permite armazenar dados do Nagios (informações sobre o estado atual, histórico do estado, a histórico de notificação, etc) em um banco de dados MySQL. Este addon é composto por um módulo de corretor de eventos e um daemon.

Pré-Requisitos:
  • GCC-C++
  • MySQL
  • MySQL-Devel
  • MySQL-Server

Criar a base de dados:
# mysql -u root
(no password)

mysql>create database nagios;
Query OK, 1 row affected (0.00 sec)

mysql>show databases;
+-----------+
| Database |
+-----------+
| database |
| mysql |
| nagios |
| test |
+----------+
4 rows in set (0.01 sec)

Criar o usuário e senha para que possa ter os seguintes privilégios na base de dados: "SELECT, INSERT, UPDATE, DELETE":
mysql> GRANT ALL ON nagios.* TO nagios@localhost IDENTIFIED BY "nagios";
Query OK, 0 rows affected (0.00 sec)


mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)


mysql> quit

Download, Descompactação e Instalação do NDOUtils:
# cd /install/nagios/
# mkdir ndoutils
# cd ndoutils

Fazer o download do NDOUtils:
# wget http://sourceforge.net/projects/nagios/files/ndoutils-1.x/ndoutils-*/ndoutils-*.tar.gz/download

Descompactar os arquivos:
# tar zxfv ndoutils-*.tar.gz

Entrar no diretório do ndoutils:
# cd ndoutils-*

Compilar o NDOUtils:
# ./configure
# make

Ndomod
Existem duas versões diferentes do módulo NDOMOD que são compilados, assim certifique-se de utilizar o módulo que corresponde à versão do Nagios que você está executando, e ajustar as instruções indicadas abaixo para o nome da versão que você está usando.

ndomod-2x.o módulo NDOMOD = para Nagios 2.x
ndomod-3x.o = módulo NDOMOD para Nagios 3.x (instável)

No nosso exemplo usamos a versão 3.x
# cd /install/nagios/ndoutils-*/src/

Copie o módulo NDOMOD para sua instalação do Nagios:
# cp ndomod-3x.o /usr/local/nagios/bin/ndomod.o

Ndo2db
Existem duas versões diferentes do daemon NDO2DB que são compilados, assim certifique-se de usar o daemon que corresponde à versão do Nagios que você está executando, e ajustar as instruções indicadas abaixo para o nome do servidor que você está usando.

ndo2db-2x.o daemon NDO2DB = para Nagios 2.x
ndo2db-3x.o = daemon NDO2DB para Nagios 3.x (instável)

Copie o daemon NDO2DB para sua instalação do Nagios:
# cp ndo2db-3x /usr/local/nagios/bin/ndo2db

Criação de banco de dados NDO:
# cd ../db/
# ./installdb -u nagios -p nagios -h localhost -d nagios
Obs: -u = usuário; -p = senha; -h = nome do computador; -d = MySQL DB

Alterações dos arquivos CFG:
ndo2db.cfg
# cd ../config
# cp ndo2db.cfg-sample /etc/nagios/ndo2db.cfg
# chown nagios:nagios /etc/nagios/ndo2db.cfg
# cd /etc/nagios/

# vi ndo2db.cfg

# SOCKET TYPE
socket_type=unix
. . .
# SOCKET NAME
socket_name=/var/run/nagios/ndo.sock
. . .
# DATABASE USERNAME/PASSWORD
db_user=nagios
db_pass=nagios

Verifique se existe o diretório /var/run/nagios. Se não existir, crie-o:
# mkdir /var/run/nagios

E tenha certeza de que o NDO tem permissão de acessar este diretório para criar o socket:
# chown -R nagios:nagios /var/run/nagios

ndomod.cfg
# cd /install/nagios/ndoutils-*/config/
# cp ndomod.cfg-sample /etc/nagios/ndomod.cfg
# chown nagios:nagios /etc/nagios/ndomod.cfg

Adicionar linhas semelhante as abaixo no arquivo de configuração principal do Nagios (geralmente /usr/local/nagios/etc/nagios.cfg):
# vi /etc/nagios/nagios.cfg
broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg
event_broker_options=-1

Esta diretiva fará com que o daemon do Nagios passe a enviar dados para o módulo NDOMOD. Sem essa opção, o NDOMOD não vai obter qualquer informação.

Finalmente certifique-se que o parâmetro de saída ndomod.cfg está configurado:
# vi /etc/nagios/ndomod.cfg
output=/var/run/nagios/ndo.sock

É muito importante que o parâmetro output tenha exatamente o mesmo valor do parâmetro socket_name do arquivo ndo2db.cfg. Se não, você receberá esta mensagem ao iniciar o daemon nagios.
[1192222122] ndomod: Error writing to data sink! Some output may get lost...

Iniciando o NDO2DB daemon:
# /usr/local/nagios/bin/ndo2db -c /etc/nagios/ndo2db.cfg

Verificando a execução do processo:
# ps -ef | grep ndo2db
nagios 24003 23088 0 14:24 ? 00:00:01 /usr/local/nagios/bin/ndo2db -c /etc/nagios/ndo2db.cfg
root 24597 23526 0 14:55 pts/2 00:00:00 grep ndo2db

Verifique a configuração do Nagios:
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Reiniciando o Nagios:
# service nagios restart

Verificando o funcionamento:
# tail /usr/local/nagios/var/nagios.log
[1258993445] ndomod: NDOMOD 1.4b9 (10-27-2009) Copyright (c) 2009 Nagios Core Development Team and Community Contributors
[1258993445] ndomod: Successfully connected to data sink. 0 queued items to flush.
[1258993445] Event broker module '/usr/local/nagios/bin/ndomod.o' initialized successfully.

Se não estiver funcionando aparecerá algo como:
[1258993322] ndomod: NDOMOD 1.4b9 (10-27-2009) Copyright (c) 2009 Nagios Core Development Team and Community Contributors
[1258993322] ndomod: Could not open data sink! I'll keep trying, but some output may get lost...

Referências:
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=8861
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=7963
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=10122
http://www.nagioswiki.com/wiki/index.php/Nagios_and_NagiosQL_on_CentOS_4.x
http://www.nagioswiki.com/wiki/index.php/NDOutils_on_CentOS
http://www.vivaolinux.com.br/artigos/impressora.php?codigo=5357

quarta-feira, 25 de novembro de 2009

Instalando MRTG no CentOS 5.3

Introdução:
Este material foi preparado para as minhas aulas de gerência de redes, mas resolvi compartilhar, pois pode ser útil para alguém.
Basicamente peguei vários tutoriais da internet (ver referências) e adaptei para minhas necessidades, realidade da distribuição escolhida.

Sobre o MRTG:
O Multi Router Traffic Grapher (MRTG) é uma ferramenta de monitoração que gera páginas HTML com gráficos de dados coletados a partir de SNMP ou scripts externos. É conhecido principalmente pelo seu uso na monitoração de tráfego de rede, mas pode monitorar qualquer coisa desde que o host forneça os dados via SNMP ou script.

Foi desenvolvido por Tobias Oetiker e Dave Rand. Foi escrito em Perl mas utiliza um módulo em C para gerar os gráficos.

Características:
  • Mede sempre 2 valores, no caso de tráfego, pode ser Entrada e Saída.
  • Faz as leituras via SNMP ou através de script que retorne um formato padrão.
  • Coleta dados a cada 5 minutos por padrão, mas este tempo pode ser aumentado.
  • Cria uma página HTML com 4 gráficos (diário, semanal, mensal e anual). Se algum deles não for necessário pode ser suprimido.
  • O MRTG pode avisar caso o valor do gráfico atinja um valor pré-estabelecido. Por exemplo: se determinado servidor atinge 95% do espaço do disco, o MRTG pode mandar um e-mail para o administrador informando o ocorrido.
  • Possui uma ferramenta para gerar os arquivos de configuração: o CFGMAKER.
  • Possui uma ferramenta para gerar um página de índice para os casos em que muitos ítens são monitorados: o INDEXMAKER.
  • O MRTG é software livre distribuído nos termos da GNU General Public License.
Instalação:
# yum install mrtg perl-IO-Socket-INET6 perl-Socket6

Criando o primeiro gráfico:
Primeiramente vamos criar um shell script para obter dois valores de uma determinada interface de rede plugada ao seu computador, entrada e saída de dados. Vou usar como exemplo eth0, pois é a minha interface de rede com acesso a internet, porém você poderá usar qualquer outra interface na qual queira gerar os gráficos.
Com base em outros scripts encontrados na internet, criei o meu e estarei explicando como funciona.

Vamos analisar:
# cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 1109 17 0 0 0 0 0 0 1109 17 0 0 0 0 0 0
eth0: 6686671 9549 405223 0 0 405223 0 0 532591 5906 4 0 0 0 0 0

Bom, no nosso exemplo é preciso obter os valores que estão nas posições 1 e 9 após o eth0, pois eles representam a quantidade de bytes recebidos e enviados respectivamente. Então vamos automatizar esta tarefa da seguinte forma:

Crie um arquivo chamado "eth0.sh" no diretório /etc/mrtg, lugar onde ficam por padrão as configurações, irei explicar mais a frente. Dentro do arquivo eth0.sh adicione as seguintes linha:
#!/bin/bash
cat /proc/net/dev | grep eth0 | cut -d : -f 2 | awk '{ print $1; print $9 }'
Salve o arquivo

Entendendo o script:
cat /proc/net/dev | grep eth0
Exibe apenas as informações da interface eth0

cat /proc/net/dev | grep eth0 | cut -d : -f 2
cut comando para cortar as informações usando como separador (delimitador "-d") o :, e exibindo apenas o campo 2, ou seja, o : é o separador, o que está antes dele é o campo1 (eth0), o que está depois dele é o campo 2 (Informações da interface), o resultado será:
6686671 9549 405223 0 0 405223 0 0 532591 5906 4 0 0 0 0 0

cat /proc/net/dev | grep eth0 | cut -d : -f 2 | awk '{ print $1; print $9 }'
Através do comando (linguagem de programação) awk, será exibido apenas os campos 1 e 9, que correspondem a quantidade de bytes recebidos e enviados respectivamente. O resultado será:
6686671
532591

Dê permissão de execução da seguinte forma:
# chmod +x eth0.sh

Para testar se ocorreu tudo de forma correta, vamos testar o script:
# ./eth0
6887836
591145
Tudo ocorreu como o esperado, caso você tenha algum problema, revise o script e faça as alterações necessárias.

Configurando e rodando:
Esta é a parte mais importante do processo, o arquivo de configuração. Edite o arquivo "mrtg.cfg" na pasta /etc/mrtg, dentro do mesmo adicione as linhas:

# Estas duas linhas indicam onde a página com os gráficos e as imagens serão salvas,
# eu coloquei como destino a pasta padrão do meu Apache, mas você tem
# total liberdade de escolha, pois o resultado é gravado em linguagem
# HTML, não necessitando diretamente do Apache.
HtmlDir: /var/www/html/monitoramento/
ImageDir: /var/www/html/monitoramento/

# Diretório onde o MRTG armazena as imagens default que ele usa para montar as
# páginas dos gráficos e tambem os logs
LogDir: /var/lib/mrtg
# Diretório onde o MRTG faz o controle de alertas, você pode realizar configurações para
# ser alertado caso um disco atinja determinado tamanho/porcentagem, se o processador
# atingir um determinado valor de processamento, etc; Este controle é escrito neste diretório
ThreshDir: /var/lib/mrtg
# Nesta linha é definido em qual idioma será gerado o resultado
Language: brazilian

# Define qual o intervalo de tempo entre cada atualização, o valor é dado em
# minutos, sendo o valor mínimo 5 minutos
Interval: 5

# Esta linha se encarregará que a atualização seja automática e o
# processo irá rodar como um daemon qualquer, sendo possível
# iniciá-lo junto com o sistema
RunAsDaemon: Yes

# Esta linha é onde ficará o script que criamos, pois sempre que for chamado
# ele atualizará os valores de dados recebidos e enviados de forma automática,
# onde a palavra "trafego" é o nome da seção. Procure manter o mesmo nome para
# todos os comandos, evitando problemas mais a frente, a página gerada terá o mesmo nome da seção.
Target[trafego]: `/etc/mrtg/eth0.sh`

# Aqui é informado o título da página, usei simplesmente "Tráfego da rede", que
# já resume muito bem minha intenção
Title[trafego]: Trafego da rede

# As duas próximas linhas representam no gráfico, o máximo suportado pelo seu link
# para um resultado mais preciso, os valores são dados em bytes.
MaxBytes[trafego]: 32000
AbsMax[trafego]: 32000

# Esta linha força o gráfico a mostrar no valor máximo o valor setado em
# MaxBytes seguido pelas iniciais de quais quadros este parâmetro vai ser
# aplicado, onde d = diário, w = semanal, m = mensal e y = anual.
Unscaled[trafego]: dwmy

A configuração está pronta para por em funcionamento, basta dar o comando:
# mrtg /etc/mrtg/mrtg.cfg

O programa alerta que se a variável de ambiente estiver setada em UTF-8 ele provavelmente não irá funcionar adequadamente e manda rodar da seguinte maneira:
# env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg
Daemonizing MRTG ...

Está tudo pronto e funcionando, com esta configuração a cada 5 minutos o gráfico será atualizado de forma automática, bastando abrir o local onde está o documento, que no mrtg é "trafego.html".

Se precisar parar o serviço utilize o comando:
# killall mrtg

Acessando as páginas:
Como eu coloquei para o resultado ser gerado no diretório do Apache, visualizo no meu navegador com o endereço:
http://localhost/monitoramento/trafego.html

Scripts adicionais:
uptime.pl
#!/usr/bin/perl
$uptime = `uptime`;
$uptime =~ /up (.*?) day/;
$up = int($1);
print "$up\n";
print "$up\n";

dsk-snmp.sh
#!/bin/bash
snmpget -v 1 -c public localhost dskTotal.1 | cut -f4 -d:
snmpget -v 1 -c public localhost dskUsed.1 | cut -f4 -d:

Entradas no /etc/mrtg.cfg:

# Uptime.pl
Target[uptime]:`/etc/mrtg/uptime.pl`
Title[uptime]: Dias com o servidor no ar (Uptime)
PageTop[uptime]: <h1>Dias com o servidor no ar (Uptime)</h1>
Options[uptime]: growright,gauge
MaxBytes[uptime]: 365
Legend1[uptime]: Dias com o servidor no ar (Uptime)
Legend2[uptime]: Dias com o servidor no ar (Uptime)
LegendI[uptime]: Dias com o servidor no ar (Uptime)
LegendO[uptime]: Dias com o servidor no ar (Uptime)

# Dsk-snmp.sh
Target[disco]: `/etc/mrtg/dsk-snmp.sh`
Title[disco]: Uso do Disco
PageTop[disco]: <h2>Utilização do disco</h2>
Options[disco]: gauge, growright, transparent, nopercent
MaxBytes[disco]: 7010530
kMG[disco]: G,G
ShortLegend[disco]: B
LegendI[disco]: Tamanho do Disco
LegendO[disco]: Utilizacao do Disco

Utilizando SNMP no MRTG:
Nos sentimos tentados a realizar scripts como o dsk-snmp.sh, e realmente eles funcionam, porém não estamos utilizando MRTG com SNMP, estamos utilizando MRTG com um script em Shell que faz uso de comandos SNMP. Para utilizarmos MRTG com SNMP devemos colocar os OIDs diretamente no campo Target. Como no Exemplo abaixo:

# Disco 2
Target[disco2]: .1.3.6.1.4.1.2021.9.1.6.1&.1.3.6.1.4.1.2021.9.1.8.1:public@localhost
Title[disco2]: Uso do Disco
PageTop[disco2]: <h2>Utilização do disco</h2>
Options[disco2]: gauge, growright, transparent, nopercent
MaxBytes[disco2]: 7010530
kMG[disco2]: G,G
ShortLegend[disco2]: B
LegendI[disco2]: Tamanho do Disco
LegendO[disco2]: Utilizacao do Disco

Como vocês podem perceber as entradas das seções "disco" e "disco2" são idênticas, a diferença está apenas no campo "Target", mas como cheguei nestes OIDs? Bom se você pretende usar MRTG com SNMP, você precisa conhecer SNMP, mas de qualquer forma vou dar algumas instruções básicas.
# snmptranslate -On -IR dskTotal.1
.1.3.6.1.4.1.2021.9.1.6.1
# snmptranslate -On -IR dskUsed.1
.1.3.6.1.4.1.2021.9.1.8.1

Os comandos acima transformam a informação que eu quero ler (dskTotal.1 e dskUsed.1) em OID numérica, de posse destes OIDs eu configurei as informações do Target.

A sintaxe é a seguinte:
Target[Nome da Seção]: OID da primeira informação que eu quero ler&OID da segunda informação que eu quero ler:nome da comunidade@IP do host que eu quero ler as informações

Outro exemplo, agora de uma máquina Windows:
Target[DSK_C]: ((((4096 * .1.3.6.1.2.1.25.2.3.1.5.2&.1.3.6.1.2.1.25.2.3.1.6.2:public@10.72.220.2)/1024)/1024)/1024)
MaxBytes[DSK_C]: 48074785792
Options[DSK_C]: growright, gauge, nopercent
YLegend[DSK_C]: Utilizacao do Disco
kMG[DSK_C]: G,G
ShortLegend[DSK_C]: B
Legend1[DSK_C]: C Drive total
Legend2[DSK_C]: D Drive % Used
LegendI[DSK_C]: C Drive total
LegendO[DSK_C]: C Drive used
Title[DSK_C]: Utilizacao do Disco
PageTop[DSK_C]: <h1>Utilização do disco</h1>

Este exemplo é interessante, você deve estar se perguntando porque multiplicar por 4096 e depois dividir por 1024 três vezes? A resposta é simples, vamos analisar o que aconteceu, primeiramente vamos ler as informações da máquina windows através do comando snmpwalk:
# snmpwalk -c community-name -v1 IP

Olhando as informações cuidadosamente, você encontrará este resultado:
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: G:\ Label:Local Disk Serial Number e8eed18c
HOST-RESOURCES-MIB::hrStorageAllocationUnits.6 = INTEGER: 4096 Bytes
HOST-RESOURCES-MIB::hrStorageSize.6 = INTEGER: 7861801

HOST-RESOURCES-MIB::hrStorageUsed.6 = INTEGER: 871398

Então a string #6 do hrStorage é o drive G no Windows.
A capacidade total do disco é 7861801 * 4096 = 32201936896 bytes = 29.99 GB (Windows usa GB para informações de capacidade)
E o espaço usado é 871398 * 4096 = 3569246208 bytes = 3.32 GB (3569246208/1024 = 3485592; 3485592/1024 = 3403,8984375 ; 3403,8984375/1024 = 3,32411956787109375)

Entendeu? Não? Vamos lá:
O SNMP nos informou que ele está armazenando as informações em Unidades de Alocação de 4096 bytes e que o tamanho total do disco é de 7861801 UNIDADES, Ah bom... Agora entendi!!! ;-)

Mas porque 4096 bytes??? De onde ele tirou este valor??? Você nunca deve ter reparado, mas ao formatar um disco no Windows ele te mostra essa informação:


Referências
As informações de "Criando o primeiro gráfico:" até "Acessando as páginas:", foram criadas com base no artigo "Gerando gráficos para interfaces de rede com MRTG" de Joaquin Joao Juze, utilizei a referência mudando algumas informações para que ficassem mais didáticas para o uso em sala de aula, também acrescentei detalhes do CentOS, todos os direitos reservados ao autor original do artigo (http://www.vivaolinux.com.br/artigo/Gerando-graficos-para-interfaces-de-rede-com-MRTG).
http://pt.wikipedia.org/wiki/Multi_Router_Traffic_Grapher
http://jehiah.cz/download/mrtg-uptime.pl.txt
As informações do exemplo de MRTG com SNMP para ler as informações de uma máquina Windows foram encontradas no Blog de Anthony Fajri:
http://fajri.freebsd.or.id/index.php/2007/01/30/check-the-disk-space-using-snmp/

Referências Adicionais:
Instalação passo-a-passo do MRTG em Ambiente Windows:
http://www.netmon.org/dummies.htm
Documentação Oficial:
http://oss.oetiker.ch/mrtg/doc/mrtg.en.html
Tutorial NET-SNMP com MRTG:
http://net-snmp.sourceforge.net/tutorial/tutorial-5/mrtg/index.html
Exemplo de leitura de informações do Windows usando SNMP e Scripts Windows Power Shell:
http://snmpboy.msft.net/
Exemplo de Scripts em Perl e C:
http://pointless.nl/~peter/code/mrtg/