Monitoramento de syslog-ng Server (Linux) com Zabbix

Da mesma forma que visto no Post sobre Monitoramento de Pools DHCP em servidores Linux, é comum que certas vezes esbarremos em necessidades que a ferramenta não oferece monitoramento de forma Nativa. Mas, como estamos falando do Zabbix, isto é só uma questão de vontade e pequenas adaptações. 😀

Primeiro: O que é Syslog?

O crescimento das redes de computadores (como se diz em todas as introduções de Monografias de T.I) se dá devido à adição de mais e mais componentes de Hardware. Estes componentes estão vindo cada vez mais inteligentes, inclusive gerando informações sobre seu estado (impressoras=tonner acabando, quantidade de páginas impressas, interrupções na impressão/papel preso. Switch=acesso às configurações, comandos executados em seu terminal, alteração no estado das portas e etc).

Estas informações geralmente ficam no equipamento em um armazenamento pequeno e temporário (geralmente entre 10 e 50 MegaBytes). Devido a essa baixa capacidade de armazenamento, os registros gerados são descartados em pouco tempo, fazendo com que dados históricos sejam perdidos, junto com a capacidade de acompanhar ou entender certos problemas.

Os sistemas operacionais (proprietários ou livres) também armazenam este tipo de informação em seus sistemas de arquivos. O Linux (em suas várias Distros), geralmente os coloca em /var/log.

Estes equipamentos e sistemas vão se multiplicando (junto com os problemas e famosos ‘causos do além’). Então, como recolher estas informações de maneira centralizada e persistente? Resposta: Servidor Syslog remoto.

Existem alguns servidores Syslog com esta finalidade. Este tutorial se foca no Syslog-NG.

Syslog-NG

O que é?

Servidor Syslog remoto com suporte ao padrão descrito na RFC 5424 que carrega o padrão Syslog de trabalhar os registros, sendo interoperável entre dispositivos e diferentes Sistemas. No servidor que o Hospeda, utiliza as Portas 514 (tanto TCP quanto UDP), gravando os arquivos no diretório configurado no arquivo /etc/syslog-ng/syslog-ng.conf (diretivas destination).

Considerações

  • Este tutorial não pretende cobrir a instalação ou manutenção do Syslog-NG, mas sim oferecer aos Administradores, uma ideia de como monitora-los com o auxílio do Zabbix;
  • Não são dadas garantias de funcionamento ou exata adaptação ao(s) cenário(s) do Leitor. São passos executados em uma instalação ‘do mundo real’, que funcionaram nas configurações descritas ao longo do Tutorial;
  • Sempre faça Backups dos arquivos de configuração, mesmo que em pequenas.

Cenário

  • Servidor Zabbix na versão 2.2.0;
  • Servidor a ser monitorado: Ubuntu 12.04.3 LTS com o Agente Zabbix versão 2.0.9 (a ser atualizado);
    • Os arquivos de configuração do zabbix_agentd estão em /etc/zabbix;
  • Aplicação alvo do monitoramento: Syslog-NG Versão 3.3.4 (apt-get install syslog-ng);
    • O servidor Syslog-NG recebe registros de Switchs, routers e diversos Servidores Linux;
    • Foi criada uma partição com um arranjo de discos utilizando LVM, totalizando 400GB montada em /data
    • Para cada host, o servidor Syslog cria automaticamente um conjunto de diretórios no padrão /data/log/$host/$ano/$mes/$dia/$arquivos_de_log
  • O usuário que roda o zabbix_agent tem que ter um shell válido (/bin/bash neste caso).

O que é importante monitorar em um Servidor deste tipo?

Bem, na verdade seus requisitos podem ser diferentes dos meus. Estes foram os mais importantes pra mim:

  1. portas UDP/TCP 514 e informações de um Template Linux padrão: memória, rede, discos, processos e etc (que não serão abordadas aqui);
  2. partição ou ponto de montagem do armazenamento de Logs;
  3. quantidade de hosts que estão utilizando o servidor para Logs;
  4. lista de hosts que estão utilizando o servidor para Logs;
  5. consumo de disco por host.

Passo a passo para o monitoramento

O monitoramento de dados “não padrão” geralmente é feito via UserParameter. Aqui, para o Syslog, utilizaremos essa técnica novamente.

Primeiro: configurar o sudoers, adicionando as seguinte linhas no fim do arquivo:

zabbix ALL=NOPASSWD:/bin/ls
zabbix ALL=NOPASSWD:/usr/bin/du

Elas “liberam” o usuário zabbix a executar os comandos ls e du como super-usuário, sem precisar informa a senha.

Segundo: editar o arquivo de configuração do Zabbix Agentd (zabbix_agentd.conf), adicionando (ou alterando/descomentando) a seguinte linha:

Include=/etc/zabbix/zabbix_agentd.d/

Isto fará com que o agente Zabbix considere o diretório zabbix_agentd.d como possível fonte de configuração adicional, lendo-o a cada inicialização.

Terceiro: criar um arquivo userparameter_SysLog.conf no diretório /etc/zabbix/zabbix_agentd.d com o seguinte conteúdo:

UserParameter=logged.hosts.list,sudo ls /data/log|sed 's/\t/\n/g'
UserParameter=logged.hosts.count,sudo ls /data/log|wc -w
UserParameter=logged.hosts.space.total,sudo du -s /data/log|sed 's/\t/;/g'|cut -d ";" -f1
UserParameter=logged.hosts.space.host[*],sudo du -s /data/log/$1|sed 's/\t/;/g'|cut -d ";" -f1

Quarto: reiniciar o processo Zabbix_agentd.

OBS: caso o processo não suba, verifique os arquivos de configuração alterados e veja se alguma linha está incorreta inclusive com o arquivo dos “UserParameter”.

Explicando os parâmetros criados

  • logged.hosts.list: traz a lista dos hosts (separados por “new lines”) que estão utilizando este servidor de syslog;
  • logged.hosts.count: quantidade (em número inteiro) de hosts utilizando estes servidor;
  • logged.hosts.space.total: total de dados em uso, do diretório principal na partição utilizada para guardar os logs;
  • logged.hosts.space.host[*]: espaço total ocupado por cada host que utiliza este servidor Syslog;
    • o parâmetro esperado neste item ( [*] ), é o nome/ip do host que se deseja saber o quando ocupa de espaço no Servidor Syslog.

Para o último item, cabe uma ressalva: quando um host ou ativo de rede é apontado para este servidor Syslog, é criada uma pequena árvore (como comentado à cima, em Cenário). Esta árvore tem como Base o Nome ou IP do host:

  • Nome: caso o Servidor Syslog consiga recuperar no servidor DNS, o registro PTR (ponteiro) para o IP que acaba de chegar;
  • IP: Caso o item anterior não funcione.

Criando os itens

Lista de hosts logados:

Item lista de hosts

Item resultante (Lastest data):

Lastest Data - lista hosts

Contador de hosts Logados:

Item qtd de hosts_

Resultado:

Resultado qtd de hosts

Espaço total utilizado pelos hosts:

Item espaço total

Resultado:

Item espaço total - Resultado

Espaço utilizado por um host específico:

Item Espaço do host

Resultado:

Item Espaço do host - Resultado

Implementando a auto-busca para novos hosts adicionados

O servidor Syslog-NG irá receber vários novos hosts ao longo de seu funcionamento na rede. Configura um novo item (logged.hosts.space.host[]) para cada host certamente não é nada prático.

Para resolver isto, iremos utilizar o LLD (Low Level Discovery).

Em resumo, ele fará uma busca, de tempos em tempos, para verificar se existem novos hosts utilizando o servidor Syslog e caso existam, criará automaticamente um item logged.hosts.space.host para cada um deles.

Aviso: O LLD apesar de super útil, pode não ser compreendido no primeiro momento. Para compreender dê uma olhada aquiaqui.

Utilizando LLD para verificar espaço em novos hosts

A continuação deste tutorial vem em breve.

Abraço a todos e feliz ano novo!

Monitoramento de pools ISC-DHCP com Zabbix

O Zabbix não possui nativamente uma forma de monitoramento para Servidores DHCP, então qual a solução? Resposta: fazer com que o Zabbix leia as informações de algum lugar no sistema operacional.

Obs: este tutorial cobre o monitoramento utilizando o Linux como servidor DHCP. Para monitoramento com Windows, veja esta postagem do Zilmar.

Cenário:

  • Servidor Zabbix Versão 2.0.7;
  • Servidor a ser monitorado: Ubuntu 10.04 com o Agente Zabbix versão 2.0.7;
  • Aplicação alvo do monitoramento: ISC-DHCP (apt-get install dhcp3-server);
  • O usuário que roda o zabbix_agent precisa ter um shell válido (/bin/bash).

No meu caso, além da funcionalidade padrão (servir configurações de rede de forma automática), meu DHCP server possui a função de servir múltiplas faixas diferentes que chegam nele através de DHCP-Relay feitos em alguns Switchs.

Mas, o que é importante monitorar em um Servidor deste tipo?

  1. Capacidade de IPs por pool DHCP;
  2. Quantidade de IPs sendo utilizados em cada pool;
  3. Quantidade de IPs “Tocados” em cada pool.

Estes IPs  “Tocados” representa a quantidade máxima de Máquinas diferentes que já foram endereçadas em cada pool. Servem, em linhas gerais, para ver o quão suficiente é este pool (ou seja, agora você tem como planejar!).

Agora, como fazer pra que o Zabbix leia estas informações no servidor DHCP?

Pesquisando uma forma de extrair os dados do DHCP Server, me deparei com esta alternativa.  O problema desta abordagem é que, para cada novo pool configurado, seria necessário, manualmente, fazer uma nova configuração individual no SNMP… Ou seja, nada prático. Continuando a pesquisa, achei a seguinte alternativa: http://dhcpd-pools.sourceforge.net/ A promessa era de ser mais rápido que os “concorrentes” (inclusive do que minha primeira alternativa), pois o arquivo de Leases é bem grande e qualquer “cat + grep + cut” levaria um bom tempo e consumiria recursos da máquina. Bem, só dá pra saber, testando:

Passos:

Instalação das dependências:

apt-get install -y -b  xz-utils gnulib uthash-dev

Criação de um diretório para os fontes:

mkdir /usr/src/dhcpd-pools

Download e descompactação dos fonte do dhcpd-pools:

cd /usr/src/dhcpd-pools

wget http://sourceforge.net/projects/dhcpd-pools/files/dhcpd-pools-2.23.tar.xz/download -O dhcpd-pools-2.23.tar.xz

tar xJf dhcpd-pools-2.23.tar.xz

Compilação e instalação:

./configure && make && make install

Depois de instalado, um teste básico pode ser feito com o seguinte comando:

dhcpd-pools -c local/do/dhcpd.conf -l local/do/dhcpd.leases

No caso do setup utilizado nesta instalação, o comando completo ficaria (procure os arquivos, conforme sua instalação):

dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases

A saída do comando, provavelmente será parecida com esta:

Ranges:
shared net name first ip last ip max cur percent touch t+c t+c perc
All networks 172.16.101.1 - 172.16.101.254 254 6 2.362 179 185 72.835

Shared networks:
name max cur percent touch t+c t+c perc

Sum of all ranges:
name max cur percent touch t+c t+c perc
All networks 254 6 2.362 179 185 72.835

Para cada instalação e configuração, a saída poderá ser diferente. Mas é possível ter uma noção através deste arquivo. Lendo o retorno do comando, temos o seguinte:

shared net name first ip last ip max cur percent touch t+c t+c perc
All networks 172.16.101.1 - 172.16.101.254 254 6 2.362 179 185 72.835

Dá pra tirar daí, que minha rede possui uma capacidade máxima de 254 endereços (da forma que foi configurada), está com 6 endereços em uso atualmente, o que representa 2.362% e que dela já foram utilizados 179 endereços diferentes (além dos outros campos que não comentarei). Porém se eu tiver várias redes preciso que, ao invés de ser mostrado “All networks”, seja mostrado o nome da rede. Para isso, será necessário executar alterações nos arquivos de configuração do Serviço DHCP. As alterações são pra “envolver” cada pool com um nome específico, através do uso da diretiva “shared-network”. Em minha instalação, editei o arquivo /etc/dhcp3/dhcpd.conf que estava assim:

subnet 172.16.100.0 netmask 255.255.253.0 {
 default-lease-time 7200;
 max-lease-time 10800;
 range 172.16.101.1 172.16.101.254;
 option routers 172.16.100.15;
 option domain-name-servers 172.16.100.15;
 option broadcast-address 172.16.101.255;
 option domain-name "dominio.local";
}

Deixando-o asim:

shared-network Minha-rede {
subnet 172.16.100.0 netmask 255.255.253.0 {
 default-lease-time 7200;
 max-lease-time 10800;
 range 172.16.101.1 172.16.101.254;
 option routers 172.16.100.15;
 option domain-name-servers 172.16.100.15;
 option broadcast-address 172.16.101.255;
 option domain-name "dominio.local";
}
}

Depois de salvar e reiniciar o serviço DHCPD, execute novamente o seguinte comando:

dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases

Veja que em “Shared networks”, agora o retorno é diferente:

Ranges:
shared net name first ip last ip max cur percent touch t+c t+c perc
All networks 172.16.101.1 - 172.16.101.254 254 6 2.362 179 185 72.835

Shared networks:
name max cur percent touch t+c t+c perc
Minha-rede 254 11 4.331 178 189 74.409

Sum of all ranges:
name max cur percent touch t+c t+c perc
All networks 254 6 2.362 179 185 72.835

O dhcpd-pools oferece um help, no estilo man page do Linux, e nele é importante observar o seguinte (man dhcpd-pools):

-L, --limit=NR
The NR will limit what will be printed. Syntax is similar to chmod(1) permission string. The NR limit string uses two digits which vary between
0 to 7. The first digit determines which headers to display, and the second digit determines which numeric analysis tables to include in the output.
The following values are "OR'd" together to create the desired output. The default is 77.

01 Print ranges
02 Print shared networks
04 Print total summary
10 Print range header
20 Print shared network header
40 Print total summary header

Aqui é possível ver que a utilização do parâmetro “-L”, limita a exibição conforme a tabela à cima, de acordo com a combinação escolhida. Então, se executarmos o comando incluindo o “-L 22”, ele retornará somente os dados das “Shared networks”:

dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22

Resultado:

Shared networks:
name max cur percent touch t+c t+c perc
Minha-rede 254 11 4.331 178 189 74.409

Você também poderia fazer algum malabarismo para separar o texto, pegar certa linha e etc mas, se o comando já fornece isto, para que reinventar a roda?

Fazendo o zabbix capturar os dados

Sabemos que para obter dados que o Zabbix não consegue nativamente, uma das possibilidades é a utilização de “UserParameters”. Estes, em resumo, são itens criados livremente pelo Administrador para que, quando consultados via Zabbix_agent, retornem algo útil, como o resultado de um comando, por exemplo. Para que isto funcione, é necessário editar o arquivo de configuração do agente. Nele, procure a diretiva “Include” que, provavelmente estará assim:

# Include=/usr/local/etc/zabbix_agentd.userparams.conf

Esta diretiva diz que, além do arquivo .conf padrão, o zabbix (quando iniciar) irá procurar outros arquivos. Nesta caso é possível indicar um arquivo direto (como à cima), ou uma pasta que conterá vários outros arquivos. Para nosso tutorial, ficou da seguinte forma (Claro que este diretório precisa existir e estar acessível para leitura.):

Include=/usr/local/etc/zabbix_agentd.conf.d/

Neste diretório será necessário criar o arquivo “UserParameters_dhcpd.conf”, contendo os itens customizados e seus respectivos comandos. Copie e cole o conteúdo à baixo no arquivo “UserParameters_dhcpd.conf” (antes de copiar, verifique a configuração dos parâmetros “-c” e “-l“):

UserParameter=dhcp.pool.all,dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22

UserParameter=dhcp.pool.max[*],dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f2

UserParameter=dhcp.pool.use[*],dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f3

UserParameter=dhcp.pool.percent[*],dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f4

UserParameter=dhcp.pool.touch[*],dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f5

Depois de criar o arquivo (sem os espaço entre as linhas), salve e reinicie o zabbix_agent. Cada linha de UserParameter possui dois elementos: o item e o comando. Exemplo:

Item

dhcp.pool.all

Comando

dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L22

O item é o que será configurado na interface do Servidor Zabbix. Quando o agente receber a solicitação do item (por exemplo, dhcp.pool.all), ele retornará os dados resultantes do comando. Depois disso, no servidor zabbix execute o seguinte comando:

zabbix_get -s ip.do.servidor.dhcp -k dhcp.pool.all

Se tudo estiver correto, um retorno como este será exibido (caso exista mais de um pool configurado):

Shared networks:
name max cur percent touch t+c t+c perc
Minha-rede01 356 260 73.034 87 347 97.472
Minha-rede02 422 0 0.000 0 0 0.000
Minha-rede03 782 539 68.926 232 771 98.593
...
Minha-redeN 250 43 17.200 206 249 99.600

Lembre-se: Para cada pool (Minha-rede01, Minha-rede02, Minha-rede03), serão cadastrados todos os parâmetros (max, use, percent e touch).

Outros testes pode ser feitos, utilizando os outros itens no UserParameter:

dhcp.pool.max[Minha-rede01]
Retorno (exemplo): 200

dhcp.pool.use[Minha-rede01]
Retorno (exemplo): 20
dhcp.pool.percent[Minha-rede01]
Retorno (exemplo): 12.4
dhcp.pool.touch[Minha-rede01]
Retorno (exemplo): 23

Pronto, parâmetros configurados! Agora é hora de ir ao zabbix server (via interface web) e cadastrar os itens para o Servidor DHCP, como no exemplo à baixo:

Conf_itens_DHCP01

No exemplo dos pools dado anteriormente, é possível ver o tipo de dado retornado por cada item. Cadastre um por um, e vá vendo em “Lastest data” se o resultado aparece. Depois, configure os gráficos a seu gosto e pronto, você tem os dados que queria! 😀

Até este ponto, é possível monitorar os pools DHCP tranquilamente. Agora, se você já trabalhou no zabbix com LLD (Low Level Discovery) e sabe que seria mais interessante pegar os pools automaticamente, siga pro próximo parágrafo.

Utilizando LLD para buscar os pools DHCP:

Este LLD precisa de um Script rodando localmente para trazer os nomes dos pools e popular os 4 itens. Para isso, escolhi o diretório /usr/local/etc/zabbix/scripts/ para adicionar o script que retornará os dados no formato JSON. Lá, criei o script dhcppolls.sh com o seguinte conteúdo:

#!/bin/bash
pools_all=`dhcpd-pools -c /etc/dhcp3/dhcpd.conf -l /var/lib/dhcp3/dhcpd.leases -L02|egrep -io "^[a-z]*(\-|\_)?[a-z]*"`
pools_qtd=`echo $pools_all|wc -w`
retorno=`echo -e "{\n\t\t"\"data\"":["`
for p in $pools_all
do
 if [ "$pools_qtd" -le "1" ]
 then
 retorno=$retorno`echo -e "\n\t\t{\"{#DHCPPOOL}\":\"$p\"}"`
 else
 retorno=$retorno`echo -e "\n\t\t{\"{#DHCPPOOL}\":\"$p\"},"`
 fi
 pools_qtd=$(($pools_qtd - 1))
done
retorno=$retorno`echo -e "]}"`
echo -e $retorno

Salve e saia do arquivo. No arquivo UserParameters_dhcpd.conf adicione o seguinte “UserParameter”:

UserParameter=dhcp.pool.discovery,/usr/local/etc/zabbix/scripts/dhcppolls.sh

Reinicie o agente zabbix no servidor DHCP.

Para teste, execute o seguinte no servidor Zabbix:

zabbix_get -s ip.do.servidor.dhcp -k dhcp.pool.discovery

Os dados serão parecidos com estes:

{ "data":[ {"{#DHCPPOOL}":"Minha-rede01"}, {"{#DHCPPOOL}":"Minha-rede02"}, {"{#DHCPPOOL}":"Minha-rede03"}]}

Se tudo correr como descrito, estaremos a um passo de concluir a configuração. Se não, volte ao começo do tutorial e revise as configurações feitas.

Agora, na interface web, vá ao Host Servidor DHCP e cadastre um novo item do Tipo “Discovery rules”, da seguinte forma:

LLD_DHCP

Veja que o parâmetro em “Macro” é o mesmo retornado na execução de “dhcp.pool.discovery”. Agora, será preciso criar os itens a serem populados com o dado trazido pelo LLD. Para isso, depois de criar a “Discovery Rule”, clique em “Item prototype” e crie o item como segue:

LLD_DHCP_item

Crie os 4 itens, conforme vimos anteriormente e, se desejar Triggers, gráficos e o que mais for necessário.

Pronto, fim do tutorial! 😀

Se precisar de algum suporte, é possível me encontrar (e vários outros membros) na lista Brasileira de discussão sobre Zabbix, através deste link.

Abraço!