Mostrando postagens com marcador Zabbix. Mostrar todas as postagens
Mostrando postagens com marcador Zabbix. Mostrar todas as postagens

terça-feira, 3 de abril de 2018

Instalação do SNMP Builder no Zabbix 3.4.6

Introdução

O SNMP Builder é um projeto do giapnguyen, que sofreu um fork pelo mickvav, que o atualizou para a versão 3.2. Esse projeto também já fez parte, e tenho esperanças que um dia volte a fazer, do EveryZ.

Eu resolvi testar ele no Zabbix 3.4.6, e obtive sucesso, sendo necessário apenas uma alteração à mais do que o tutorial inicial.

Como muitas pessoas perguntam sobre esse projeto, mas tem dificuldades com o inglês, eu resolvi fazer um tutorial em Português sobre o assunto.

Instalação

Por questão de organização eu sempre crio um diretório /install na máquina, e deixo todas as instalações lá. No meu caso o Zabbix está instalado no /var/www/html/zabbix/. Então faça as adaptações necessárias ao seu cenário.

# cd /install

# wget https://github.com/mickvav/snmpbuilder/archive/master.zip

# cd /var/www/html/zabbix/

# unzip /install/master.zip

# mv snmpbuilder-master/snmp_builder* .

# rm -rf snmpbuilder-master


Ajustes

O importante nesse arquivo é definir o path das MIBs:

# vi snmp_builder.php
define('MIBS_ALL_PATH', '/var/www/html/zabbix/snmp_builder/mibs:/usr/share/snmp/mibs');


No arquivo menu.inc.php, iremos criar a entrada do SNMP Builder no Zabbix:
# vi include/menu.inc.php
Na linha 220:

[
        'url' => 'snmp_builder.php',
        'label' => 'SNMP Builder'
],

Seu Código vai ficar assim:


                'popup_httpstep.php'
        ]
],
[        'url' => 'snmp_builder.php', 
        'label' => 'SNMP Builder'
],
[        'url' => 'maintenance.php',
        'label' => _('Maintenance')
],  

# vi jsLoader.php

Na linha 51:
        // snmp_builder
        '../snmp_builder/Tree.js' => '',
        '../snmp_builder/snmp_builder.js' => '',
        '../snmp_builder/DynTable.js' => '',
        // /snmp_builder


Ao acessar o menu Configuração, você vai ver o menu SNMP Builder. Ao tentar gravar o item no template surge o erro referente ao valor do campo history.
Erro ao adicionar item ao template

Para solucionar o problema, vamos editar o arquivo snmp_builder.php, essa foi a única alteração adicional que eu precisei fazer. Nesse caso eu configurei retenção de um dia (86400 segundos).

# vi snmp_builder.php
Na linha 240:

'history'               => 86400,


E agora é possível criar o item normalmente.
Item adicionado ao template

terça-feira, 6 de junho de 2017

Personalizando o Idioma da Interface Gráfica do Zabbix

Introdução

Demonstrarei nesse post como realizar a alteração do idioma do Zabbix. Pode-se alterar apenas alguns termos ou todos os termos.

Objetivo

O objetivo desse post é ser uma Prova de Conceito, é fazer com que as pessoas pensem fora da caixa. O Zabbix é uma ferramenta fantástica, que permite coletar dados, exibi-los em forma de gráficos e mapas, reagir às métricas coletadas, seja alterando um ícone no gráfico, enviando uma notificação, executando um comando, etc.

O problema é que as pessoas pensam no Zabbix apenas para redes Ethernet e Aplicações! Há algum tempo vemos algumas iniciativas, como do Luciano Alves (Unirede) expandindo isso para uma visão de negócios, o Norberto Rozas (Syspro) que propôs a ideia de usar o Zabbix como supervisório de redes industriais, O Luiz Sales com seus monitoramentos nada convencionais, etc.

No começo do ano eu iniciei o mestrado em Engenharia Elétrica, trabalhando com Redes de Sensores Sem Fio (RSSF), e claro minha proposta foi a de utilizar o Zabbix como ferramenta para o gerenciamento dessas redes, mas conforme as ideias foram surgindo, fui lendo os artigos, conversando com meu orientador, eu fui percebendo um imenso aumento do uso de conceitos como IoT, Smart Cities, Smart Campus, etc. E com isso novos interesses foram sendo despertados.

O Zabbix pode ser usado como Interface para os usuários finais, independente da área de atuação, porém será preciso fazer algumas modificações, pois cada área possui seu conjunto de jargões, sua definição de ícones, de interface, etc. Personalizar o Zabbix para que o usuário tenha uma visão que lhe seja familiar, é essencial. O que estou propondo é utilizar o que o Zabbix tem de melhor, e adaptar o que for necessário para que o usuário se sinta motivado a utilizá-lo.

O que essa solução é

Um Hack: Tenha isso em mente, o que estou fazendo não servirá para qualquer um, em qualquer ambiente, não é suportado pela Zabbix SIA e pode nem ser interessante no seu ponto de vista.
Uma Prova de Conceito: Esse post está longe de ser a palavra final sobre o assunto, eu tinha uma necessidade, achei uma maneira de executá-la e estou compartilhando com vocês.

O que essa solução não é

Prática: A cada nova versão da ferramenta, será preciso reaplicar o hack.
Universal: Veja que essa solução é ideal para ambientes, onde um ou dois idiomas são utilizados, mas não atende uma empresa global, também não atende dezenas de segmentos ao mesmo tempo.

Entendendo como funcionam os idiomas no Zabbix

Consultando a documentação oficial descobrimos que eles utilizam o GNU/gettext e o conceito de locales, que envolve uma série de normas internacionais e vai muito além da simples tradução de textos. Por isso é muito provável que esse hack nunca seja absorvido oficialmente pela Zabbix SIA.

Entendendo os os arquivos que controlam o idioma que é exibido na Interface Gráfica

Vamos analizar o diretório com o idioma do Brasil (pt_BR):
# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/
total 940
-rw-r--r-- 1 zabbix zabbix 309122 Mai 30 17:26 frontend.mo
-rw-r--r-- 1 zabbix zabbix 649043 Mai 30 17:20 frontend.po

Enquanto o arquivo frontend.mo é um arquivo com uma codificação especial, descrita na documentação como uma "foto". E repleto de caracteres especiais:
# head -3 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
▒gGl▒▒▒/▒▒9▒5F [|▒▒▒!▒▒▒▒▒%▒,
3>Z
cn


O arquivo frontend.po é descrito na documentação como um arquivo texto, editável e utilizado para a tradução.
# head -3 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po
msgid ""
msgstr ""
"Project-Id-Version: Zabbix 3.2\n"


Observe esse trecho do arquivo frontend.po:
   4592 #: include/actions.inc.php:660 include/actions.inc.php:1061
   4593 msgid "Disable host"
   4594 msgstr "Desativar host"
   4595
   4596 #: include/views/configuration.host.list.php:116
   4597 msgid "Disable host?"
   4598 msgstr "Desabilitar host?"
   4599
   4600 #: app/views/administration.proxy.list.php:154
   4601 #: include/views/configuration.hostgroups.list.php:150
   4602 msgid "Disable hosts"
   4603 msgstr "Desativar hosts"
   4604
   4605 #: include/views/configuration.hostgroups.list.php:151
   4606 msgid "Disable hosts in the selected host groups?"
   4607 msgstr "Desabilitar os hosts nos grupos selecionados?"


Ele contém as strings que desejamos alterar, o problema é que alterar esse arquivo não surte efeito algum na interface gráfica. Pois se observarmos o arquivo que é chamado na linha 4596, por exemplo:
# vi /var/www/html/zabbix/include/views/configuration.host.list.php +116
                $confirm_message = _('Disable host?');


Verificamos que ele busca como referência a frase original, e, então aplica a tradução.

Observe esse trecho "^@Desabilitar host^@D" da linha 523 do arquivo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo

Veja o que acontece se eu troco a frase por outra com o mesmo número de caracteres:
"^@Desabilitar sens^@D"

E reinicio o apache:
# systemctl restart httpd
Hack 01 no arquivo frontend.mo
Agora veja o que acontece e eu troco a frase por outra com um número diferente de caracteres:
"^@Desabilitar sensor^@D"

E reinicio o apache:
# systemctl restart httpd

Hack 02 no arquivo frontend.mo
Lembra que a documentação diz que o arquivo .mo é como uma foto? É nesse sentido. A mensagem aparece correta, mas todo o resto da formatação da interface gráfica se perdeu.

Basta voltar o arquivo ao normal e reiniciar o apache, que a interface gráfica também volta ao normal.
Interface Gráfica intacta após a remoção do Hack

Conclusões Iniciais

Devemos utilizar o arquivo frontend.po para gerar um arquivo frontend.mo atualizado. Mas como?

Observando o diretório /var/www/html/zabbix/locale temos um README e três scripts:
# ls -l *.sh README
-rwxr-xr-x 1 zabbix zabbix  385 Dez 21 05:08 add_new_language.sh
-rwxr-xr-x 1 zabbix zabbix  164 Mai 30 17:29 make_mo.sh
-rw-r--r-- 1 zabbix zabbix  957 Dez 21 05:08 README
-rwxr-xr-x 1 zabbix zabbix 1434 Dez 21 05:08 update_po.sh


No arquivo README encontramos a seguinte instrução:
If you want to update po files with new strings in the sourcefile, run update_po.sh . It will gather translatable strings from all files that end with ".php"

Maravilha é exatamente o que pretendemos fazer!

Vou mover o arquivo frontend.mo para o /root:
# mv /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo /root

E editar o arquivo frontend.po:
# vi /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po
Alteramos as linhas 4592 até 4607, alterando as ocorrências de "host" para "sensor" e  de "hosts" para "sensores", e executamos o script:
# sh update_po.sh
Generating translation template...
Merging new strings in po files...
.
.
.
pt_BR
............................................................................................................................................................................................................................................................................................................................................. feito.
.
.
.
pt_BR/LC_MESSAGES/frontend.po   3316 mensagens traduzidas, 5 mensagens não traduzidas.
.
.
.


Mas... Não gerou um novo arquivo .mo:
# ls -l  /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.*
-rw-r--r-- 1 zabbix zabbix 649043 Mai 31 09:59 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po


Sem ele, mesmo com o idioma setado para Português (pt_BR)
Idioma setado como pt_BR
A interface gráfica fica em Inglês.
Interface Gráfica em Inglês

Basta trazer o arquivo de volta e reiniciar o apache:
# mv /root/frontend.mo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/
# systemctl restart httpd


Que a interface gráfica volta ao normal.
Intreface Gráfica em pt_BR

Teste 02: Vamos rodar o update_po.sh e ver se ele atualiza o arquivo frontend.mo

# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
-rw-r--r-- 1 zabbix zabbix 309122 Mai 31 09:53 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
 

# sh update_po.sh
 

# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
-rw-r--r-- 1 zabbix zabbix 309122 Mai 31 09:53 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo


E nada :-(

Teste 03: Vamos ver o que esse script faz ;-)

E na última instrução temos:
        # setting output file to /dev/null so that unneeded messages.mo file
        # is not created
        msgfmt --use-fuzzy -c --statistics -o /dev/null $translation

Achei!!! Esse script realmente não cria os arquivos.mo. Agora eu vou alterar ele para gerar os arquivos:
        #msgfmt --use-fuzzy -c --statistics -o /dev/null $translation
        msgfmt --use-fuzzy -c --statistics -o /root/$translation/frontend.mo $translation


Eu fiz a menor alteração possível, apenas substituindo "/dev/null" por "/root/$translation/frontend.mo". Isso poderia ficar bem mais elegante, mas preferi ser didático.

Vou criar apenas o diretório pt_BR, que será utilizado pela variável "$translation", os outros idiomas vão dar erro, mas nesse momento não tem problema:
# mkdir -p /root/pt_BR/LC_MESSAGES/frontend.po/

Vou guardar o antigo frontend.mo no /root
# mv /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo /root/

E rodar o script de update novamente:
# sh update_po.sh
Generating translation template...
Merging new strings in po files...
.
.
.
pt_BR
............................................................................................................................................................................................................................................................................................................................................. feito.
.
.
.
bg/LC_MESSAGES/frontend.po      msgfmt: erro ao abrir o arquivo "/root/bg/LC_MESSAGES/frontend.po/frontend.mo" para gravação: Arquivo ou diretório não encontrado
2052 mensagens traduzidas, 56 traduções aproximadas (fuzzy), 1213 mensagens não traduzidas.
.
.
.
pt_BR/LC_MESSAGES/frontend.po   3316 mensagens traduzidas, 5 mensagens não traduzidas.
.
.
.


E agora vamos colocar o novo frontend.mo na interface gráfica do Zabbix:
# cp /root/pt_BR/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/

Reiniciar o apache
# systemctl restart httpd

E Voilà:

Interface Gráfica com a mensagem alterada
Volte o arquivo que você salvou no /root e reinicie o apache. Pois agora vamos fazer o trabalho, de verdade, vamos ter o Zabbix em Português com a interface intacta, e mais 3 variações do Português aplicado à nichos específicos.

Primeiro vamos criar a estrutura de diretórios para os idiomas Italiano (it), Francês (fr) e Russo (ru):
# mkdir -p /root/{it,fr,ru}/LC_MESSAGES/frontend.po/

Abaixo uma pequena cola, das alterações que vamos fazer:
pt_br - Hosts / Itens - Administrador da Rede Ethernet
it - Sensores / Métricas - Administrador da Rede de Sensores
fr - Plantas / Características - Usuário da Rede de Sensores - Ramo Agrícola
ru - Pacientes / Sinais Vitais - Usuário da Rede de Sensores - Ramo Medicina

Vamos copiar o arquivo frontend.po de pt_BR para os idiomas que vamos alterar:
# cd /var/www/html/zabbix/locale

# cp pt_BR/LC_MESSAGES/frontend.po it/LC_MESSAGES/frontend.po
cp: sobrescrever “it/LC_MESSAGES/frontend.po”? y

# cp pt_BR/LC_MESSAGES/frontend.po fr/LC_MESSAGES/frontend.po
cp: sobrescrever “fr/LC_MESSAGES/frontend.po”? y

# cp pt_BR/LC_MESSAGES/frontend.po ru/LC_MESSAGES/frontend.po
cp: sobrescrever “ru/LC_MESSAGES/frontend.po”? y


Primeiro vamos trabalhar no idioma Italiano e trocar todas as ocorrências de hosts por sensores e depois de host por sensor:
# sed -i -e ':g;/^msgstr/s/hosts/sensores/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/sensor/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Sensores/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Sensor/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por métricas e depois de item por métrica:
# sed -i -e ':g;/^msgstr/s/itens/métricas/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/métrica/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Métricas/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Métrica/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po


Agora vamos ao idioma Francês, vamos trocar todas as ocorrências de hosts por plantas e depois de host por planta:
# sed -i -e ':g;/^msgstr/s/hosts/plantas/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/planta/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Plantas/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Planta/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por características e depois de item por característica:
# sed -i -e ':g;/^msgstr/s/itens/características/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/característica/g'  /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Características/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Característica/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po


E finalmente vamos ao idioma Russo, vamos trocar todas as ocorrências de hosts por pacientes e depois de host por paciente:
# sed -i -e ':g;/^msgstr/s/hosts/pacientes/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/paciente/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Pacientes/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Paciente/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por sinais vitais e depois de item por sinal vital:
# sed -i -e ':g;/^msgstr/s/itens/sinais vitais/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/sinal vital/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Sinais Vitais/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Sinal Vital/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po


Eentão gerar os nossos arquivos frontend.mo atualizados:
# sh update_po.sh

E coloca-los na interface gráfica do Zabbix:
# cp /root/fr/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.mo”? y

# cp /root/it/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.mo”? y

# cp /root/ru/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.mo”? y


Reiniciar o Apache
# systemctl restart httpd

E pronto:
Interface Gráfica com o Hack Aplicado

Conclusão:

Esse é apenas um pequeno exemplo de que com um pouco de criatividade e algum esforço, podemos levar o Zabbix a outros nichos e ampliar a nossa área de atuação, seja ela pessoal, acadêmica ou profissional.

sexta-feira, 13 de maio de 2016

Gerando uma Página Personalizada com Gráficos (Estáticos) do Zabbix sem uso de API

No post anterior eu demonstrei como gerar imagens dos seus mapas de maneira automatizada e respondi praticamente todas as dúvidas que eu mesmo propus a respeito do post do Mike Santangelo. O que faltou foi fazer uma página personalizada com os gráficos.

Muitas pessoas perguntam sobre isso, "não tem como eu gerar uma página para o cliente ver os gráficos dele? Eu queria algo personalizado com o logo do cliente e o gráfico", com certeza a API resolve esse problema, mas a maioria das pessoas que fazem esse questionamento não são desenvolvedoras, eu também não sou, mas resolvi aproveitar o post do Mike para ensinar como gerar as imagens (estáticas) dos gráficos em uma página, apenas como prova de conceito, eu já mencionei que não sou desenvolvedor? A ideia é apenas dar um help para quem não entende nada de programação, ok?

Vamos então resolver o problema de gerar as imagens automaticamente de forma cíclica.

Primeiro vamos criar o diretório onde serão armazenadas as imagens:
# mkdir -p /var/www/html/cliente/imagens/

Acesse seu servidor Zabbix, abra o gráfico que te interessa, clique com o botão da direita do mouse sobre a imagem e, escolha visualizar a imagem, vamos precisar das informações "chartX.php", onde "X" é um número que identifica o tipo de gráfico e "graphid=" que nos traz o ID do gráfico.

Agora vamos gerar as imagens:
# vi gera_graficos.sh

#!/bin/bash

######################################################################
# Variaveis de producao - Deve-se alterar de acordo com seu ambiente #
######################################################################

DIR_IMAGENS=/var/www/html/cliente/imagens #Diretorio que vai armazenar as imagens
NOME_IMAGEM=grafico #Nome das imagens a serem geradas
DIR_COOKIE=/root #Diretorio que vai armazenar o cookie
NOME_COOKIE=zabbix.cookie
ENDERECO='http://<IP-Servidor>/zabbix' #Url do Zabbix
USUARIO=admin # Usuario do Zabbix que tenha privilegio de visualizar todos os mapas
SENHA='zabbix'  # Senha do usuario acima
CHART=2 # ID do tipo de grafico
ID=523 # ID do grafico que sera gerada a imagem
PERIODO=3600 # Periodo (em segundos) que serao exibidos no grafico

######################################################################
# Logica do Script - Nao altere a menos que saiba o que esta fazendo #
######################################################################

# Gera o cookie
wget -q --save-cookies=$DIR_COOKIE\/$NOME_COOKIE -4 --keep-session-cookies 2> /dev/null -O - -S --post-data="name=

$USUARIO&password=$SENHA&enter=Sign in&autologin=1&request=" $ENDERECO\/index.php?login=1 > /dev/null

# Gera as imagens
wget -q -4 --load-cookies=$DIR_COOKIE\/$NOME_COOKIE -O $DIR_IMAGENS\/$NOME_IMAGEM.png "$ENDERECO/chart$CHART.php?graphid=$ID&period=$PERIODO"

# Remove o cookie
rm -rf $DIR_COOKIE/$NOME_COOKIE

# Ajusta as permissoes da imagem
chown apache:apache $DIR_IMAGENS\/$NOME_IMAGEM.png


Alterar as permissões do script:
# chmod 700 gera_graficos.sh

Pronto agora é só agendar no crontab de quanto em quanto tempo você quer gerar a imagem dos seus gráficos e automaticamente o cliente vai ter a página atualizada ;-)

Agora vamos gerar a nossa página com o gráfico

# vi /var/www/html/cliente/cliente.html

<html>
<head>
<body>
<center>
<p><b>Nome do Cliente</b></p>
<p>Gráfico do Cliente</p>
<img src=./imagens/grafico.png>
</center>
</body>
</html>

Exemplo de página gerada:

Referencias:

Tales of a Tech

Coletando uma imagem do Zabbix sem uso de API

Alguns dias atrás compartilhei um post do Mike Santangelo que achei muito interessante, ele demonstrou como usar o wget para gerar uma imagem dos mapas do ambiente dele.

Apesar do post exibir os comandos, ele não dava detalhes de como chegou naqueles endereços, por exemplo, ao acessar um mapa, o padrão de endereço é http://<IP-Servidor>/zabbix/maps.php?sysmapid=7, mas ele usava o endereço no padrão http://<IP-Servidor>/zabbix/map.php?sysmapid=7&severity_min=0. Por que map.php e não maps.php??

Ele dizia que tinha feito um script e que em 30 segundos gerou as imagens de 21 mapas, mas nada desse script, apesar de ser simples.

A imagem era de um Zabbix 3.0, mas será que isso funcionária para um Zabbix 2.4? Será que isso funcionaria para outros itens como Gráficos?

Ele disse que num próximo post pretendia fazer uma página com gráficos, triggers e mapas, sendo alimentada de forma cíclica. Bom, com essas dúvidas na cabeça eu comecei a destrinchar os comandos, tentar entender a questão das url's e fazer meus próprios testes. Vamos ao que eu descobri ;-)

Primeiro a questão das url's, se você abrir um mapa vai ver uma url no formato http://<IP-Servidor>/zabbix/maps.php?sysmapid=7 (Zabbix 2.4) ou http://<IP-Servidor>/zabbix/zabbix.php?action=map.view (Zabbix 3.0), mas se clicar com o botão da direita na imagem e escolher visualizar a imagem, vai ver o padrão de url http://<IP-Servidor>/zabbix/map.php?sysmapid=7&severity_min=0 (Em ambas as versões). E sim, o esquema funciona para ambas as versões do Zabbix.

Tendo testado isso, rapidamente percebemos que pode ser usado para qualquer imagem do zabbix (mapas e gráficos). Isso já me deu ideias.

Vamos então resolver o problema de gerar as imagens automaticamente de forma cíclica.

Primeiro vamos criar o diretório onde serão armazenadas as imagens:
# mkdir /root/imagens

Agora vamos gerar as imagens:
# vi gera_mapas.sh

#!/bin/bash

######################################################################
# Variaveis de producao - Deve-se alterar de acordo com seu ambiente #
######################################################################

MAPAS=7 # Quantidade de Mapas no seu ambiente
DIR_IMAGENS=/root/imagens #Diretorio que vai armazenar as imagens
NOME_IMAGEM=mapa #Nome das imagens a serem geradas
DIR_COOKIE=/root #Diretorio que vai armazenar o cookie
NOME_COOKIE=zabbix.cookie
ENDERECO='http://
<IP-Servidor>/zabbix' #Url do Zabbix
USUARIO=admin # Usuario do Zabbix que tenha privilegio de visualizar todos os mapas
SENHA='zabbix' # Senha do usuario acima
SEVERIDADE=0 #Severidade minima da trigger a ser exibida no mapa

######################################################################
# Logica do Script - Nao altere a menos que saiba o que esta fazendo #
######################################################################

# Gera o cookie
wget -q --save-cookies=$DIR_COOKIE\/$NOME_COOKIE -4 --keep-session-cookies 2> /dev/null -O - -S --post-data="name=$USUARIO&password=$SENHA&enter=Sign in&autologin=1&request=" $ENDERECO\/index.php?login=1 > /dev/null

# Gera as imagens
for ((i=1; i<=$MAPAS; i++))
do
         wget -q -4 --load-cookies=$DIR_COOKIE\/$NOME_COOKIE -O $DIR_IMAGENS\/$NOME_IMAGEM$i.png "$ENDERECO/map.php?sysmapid=$i&severity_min=$SEVERIDADE"
done

# Remove o cookie
rm -rf $DIR_COOKIE/$NOME_COOKIE


Alterar a permissão do script:
# chmod 700 gera_mapas.sh

Pronto agora é só agendar no crontab de quanto em quanto tempo você quer gerar a imagem dos seus mapas ;-)

Observação

Apesar do título do meu post, e como pode ser observado no post original, a API não tem função para coletar imagens.

Referencias:

Tales of a Tech

domingo, 24 de abril de 2016

1ª Zabbix Conference LatAM - Saiba como foi

Nos dia 15 e 16 tivemos a 1ª Zabbix Conference LatAM, eu gostaria de comentar um pouco sobre o que vi e vivenciei no evento.

O primeiro ponto que gostaria de destacar é o cuidado que a organização do evento teve com os participantes, translado do aeroporto para o hotel, translado para a churrascaria (Welcome Party), translado para Gramado, ou seja, tudo foi pensado para proporcionar conforto aos participantes.

O hotel era excelente, em um bairro de classe alta em Porto Alegre e muito bem localizado, próximo do centro, com parques e shopping a quadras de distância, acesso a transporte (Taxi, Uber e Ônibus) na mesma rua.

O evento seguiu os mesmos padrões da Conferencia Oficial em Riga, Letônia, essa foi a minha impressão, do Adail, do pessoal da Globo.com, que são pessoas que tiveram a oportunidade de ir para lá. Se não atingiu o mesmo nível, eu diria que atingiu mais de 90%, mas em minha opinião estava no mesmo nível.

O evento ocorreu em um auditório retangular, o que permite que todos fiquem próximo do palco principal, as pessoas estavam confortavelmente distribuídas em duplas ou trios, com mesa e cadeira, o que é excelente para quem queria levar o note, fazer anotações, etc. Três telões, filmagem, excelente sistema de som e de ar-condicionado completavam o ambiente.

Além do café da manhã servido pelo hotel, ocorreram os coffee breaks e almoço no mesmo espaço do evento, mesas que comportavam 8 a 10 pessoas permitiam conforto e interação entre os participantes.

A primeira festa foi em uma churrascaria tipicamente gaúcha, com shows tradicionais.

A segunda foi em um Pub em uma badalada rua do bairro, vale a pena destacar a quantidade de comida (inclusa na inscrição), simplesmente não paravam de abastecer a mesa.
 
E a última foi um café colonial em Gramado, pelo que vi das fotos, foi um exagero.

As palestras foram sensacionais, tivemos palestras técnicas, palestras voltadas à gestão e palestras para iniciantes, aliás, isso refletiu bem o público do evento, me surpreendi com a diversidade de participantes, tivemos vários participantes que estão começando com a ferramenta e estavam presentes no evento, o que tornou o evento ainda mais interessante.

Todos os mais de 100 participantes presentes, tiveram oportunidade de interagir entre sí, a própria maneira como o evento é realizado incentiva esse tipo de interação e, esse é um dos principais motivos da limitação do número de inscrições.

O Alexei é uma atração a parte, acho que todos que tiveram a oportunidade de conhecê-lo pessoalmente pela primeira vez sentiram aquele friozinho na barriga, aquela sensação de "CARA É O ALEXEI" *risos*, mas ele é um cara simpático, super simples, eu visitei a Zabbix SIA, interagi um pouco com ele em 2013 (Na conferencia e no Latinoware) e agora novamente no evento, ele anda a pé, come o que você oferecer, ama guaraná, conversa, tira foto, aperta a mão e recebe abraços sem frescura, e o evento reflete isso.

Temos muito que agradecer o Luciano Alves, CIO da Unirede, pelo empenho, foram mais de 4 anos tentando convencer o Alexei de que era viável realizar uma conferencia na América Latina, e claro, a primeira seria no Brasil.

Demorou mas aconteceu e o Alexei foi embora de queixo caido, nós realmente causamos um excelente impressão, uma das últimas perguntas do evento foi se teríamos uma próxima e a resposta foi "Sure". E depois quando chegou a Riga fez um post no Facebook dizendo que era tempo de iniciar uma nova tradição, a conferencial LatAm.

O último ponto que gostaria de destacar são os frutos do evento, a questão do módulo da Unirede para monitoramento de Xen sempre foi algo complicado de se entender, o módulo estava disponível, mas o código fonte não, eles não falavam mais nada sobre isso, e na conferencia o Luciano Alves e o Thiago Melo esclareceram o por que: O módulo foi criado por administradores de rede e não por desenvolvedores, apenas como uma prova de conceito, eles queriam que as pessoas conhecessem mais sobre o uso de módulos e criaram esse módulo para isso, mas eles não tem braço para tocar o desenvolvimento e realizar as alterações necessárias a cada nova versão do Zabbix e/ou Xen, e acharam que as pessoas não tinham na realidade interesse no módulo, a conferencia demonstrou o contrário que as pessoas tinham sim interesse e estavam dispostas a tocar o projeto se o código fosse disponibilizado, então no segundo dia, o módulo foi disponibilizado no Github e hoje todos podem contribuir com seu desenvolvimento, o mesmo ocorreu com os scripts do pessoal da Globo.com, com o projeto Zabbix Security Insights do Alessandro Silva, só para citar os principais, o pessoal realmente teve um gás novo na conferencia, no sentido de usar mais o Share, compartilhar suas soluções e ajudar o produto e a comunidade a se tornarem ainda mais conhecidos.

Espero que quem não conseguiu ir esse ano, não importa o motivo, tenha a oportunidade de ir no próximo ano e vivenciar o que é participar de uma conferencia Zabbix.

Abraços a todos,
André Déo

segunda-feira, 21 de março de 2016

Coletando Estatísticas de E-mail do Postfix com Shell Script, Pflogsumm e Zabbix

Introdução

 Em muitas situações precisamos coletar indicadores, entre eles quantitativos de e-mails, nesse post demonstro como coletar esses dados de um servidor Postfix, tratá-los e enviá-los ao Zabbix.
Para melhor entendimento das filas e até alternativas de coleta, recomendo a leitura desse post do grande Guto Carvalho.

O responsável por gerar as estatísticas é o script em Perl pflogsumm.

Dependências

A única dependência do pflogsumm é o módulo Perl Date-Calc.
# yum install perl-Date-Calc

Download

Realizar o download do script
# wget http://jimsun.linxnet.com/downloads/pflogsumm-1.1.3.tar.gz

Descompactar o script
# tar -xzvf pflogsumm-1.1.3.tar.gz

Copiar o script para o diretório de binários
# cp pflogsumm-1.1.3/pflogsumm.pl /usr/local/bin/

Gerar 1ª remessa

Vamos gerar um primeiro arquivo contendo as estatísticas com base nos arquivos de log.
# pflogsumm.pl /var/log/maillog* > emails.txt

Separar o bloco de dados que me interessa

A linha 59 contém as informações da última data que me interessa (Mar  8 2016) e descontando 32 linhas eu chego na linha com a primeira data que me interessa (Feb  7 2016). Você deve adaptar os valores para a sua necessidade.
# head -59 emails.txt | tail -32
    Feb  7 2016        19         33         81          0          2
    Feb  8 2016        19         26
    Feb  9 2016        31         49
    Feb 10 2016        58         83          1
    Feb 11 2016       353       9975       1284        121
    Feb 12 2016      1321      21503      24157       5264
    Feb 13 2016        22        124       8878          0          1
    Feb 14 2016        18        129       6135
    Feb 15 2016       153       3839        216         49
    Feb 16 2016       279       7208       1048         75          1
    Feb 17 2016       101       2536        272         33          1
    Feb 18 2016       450      12107       1535        143
    Feb 19 2016       950      13594       5547       5176
    Feb 20 2016        17         36       5855          1          3
    Feb 21 2016        25         89       3445          1
    Feb 22 2016       215       5385        443        127
    Feb 23 2016        99       2176         83         23
    Feb 24 2016       562       8202       3850       2337
    Feb 25 2016       220       8551       3512        102
    Feb 26 2016       975      15136       6450       5462
    Feb 27 2016        23         39       5766          0          8
    Feb 28 2016        22         99       4082          0          2
    Feb 29 2016       462      12157        482        157
    Mar  1 2016       539       9674       1131        193
    Mar  2 2016       143       4899        975         57
    Mar  3 2016        20         98        422          0         11
    Mar  4 2016       978      16457       6621       5071          1
    Mar  5 2016        21         40       5977         14
    Mar  6 2016        22         88       4331          0          1
    Mar  7 2016       384      11030        446        196         10
    Mar  8 2016       266       8579        431        102

Converter as datas para o formato Unix Timestamp

O Zabbix possui um utilitário (zabbix_sender) que permite o envio em lote de informações, mas para isso as datas precisam estar no formato Unix Timestamp ou Epoch.

Para isso eu usei o site Epoch Unix Time Stamp Converter para converter as datas. Sim eu sei que poderia usar o comando date +%s, mas eram poucos dados e eu fiz por lá ;-). Abaixo o txt que eu montei com correlação de datas (datas2.txt) separando a data normal da convertida por um <tab>.
Feb 7 2016    1454832000
Feb 8 2016    1454918400
Feb 9 2016    1455004800
Feb 10 2016    1455091200
Feb 11 2016    1455177600
Feb 12 2016    1455264000
Feb 13 2016    1455350400
Feb 14 2016    1455436800
Feb 15 2016    1455523200
Feb 16 2016    1455609600
Feb 17 2016    1455696000
Feb 18 2016    1455782400
Feb 19 2016    1455868800
Feb 20 2016    1455955200
Feb 21 2016    1456041600
Feb 22 2016    1456128000
Feb 23 2016    1456214400
Feb 24 2016    1456300800
Feb 25 2016    1456300800
Feb 26 2016    1456473600
Feb 27 2016    1456560000
Feb 28 2016    1456646400
Feb 29 2016    1456732800
Mar 1 2016    1456819200
Mar 2 2016    1456905600
Mar 3 2016    1456992000
Mar 4 2016    1457078400
Mar 5 2016    1457164800
Mar 6 2016    1457251200
Mar 7 2016    1457337600
Mar 8 2016    1457424000

Gerar os arquivos com datas e valores

Em seguida vou separar apenas a data no formato Unix Timestamp
# cat datas2.txt | tr '\t' ' ' | tr -s ' ' | cut -d ' ' -f4 > datas.txt

E agora vou gerar um arquivo para cada dado que vou coletar (received, delivered, deferred, bounced, rejected e total). A linha 58 contém a última informação que nos interessa e a linha 32 a primeira informação.
# head -58 emails.txt | tail -32 | tr -s ' ' | cut -d ' ' -f5 > received.txt
# head -58 emails.txt | tail -32 | tr -s ' ' | cut -d ' ' -f6 > delivered.txt
# head -58 emails.txt | tail -32 | tr -s ' ' | cut -d ' ' -f7 > deferred.txt
# head -58 emails.txt | tail -32 | tr -s ' ' | cut -d ' ' -f8 > bounced.txt
# head -58 emails.txt | tail -32 | tr -s ' ' | cut -d ' ' -f9 > rejected.txt


O total é um pouco mais complicado, pois temos linhas vazias, então vamos primeiro gerar o arquivo:
# paste received.txt delivered.txt deferred.txt bounced.txt rejected.txt | tr '\t' '+' | grep '+$' > total.txt

Mas como podemos observar, teremos problemas se enviarmos esses valores para a calculadora (bc)
# cat total.txt
++++
19+26+++
31+49+++
58+83+1++
353+9975+1284+121+
1321+21503+24157+5264+
18+129+6135++
153+3839+216+49+
450+12107+1535+143+
950+13594+5547+5176+
25+89+3445+1+
215+5385+443+127+
99+2176+83+23+
562+8202+3850+2337+
220+8551+3512+102+
975+15136+6450+5462+
462+12157+482+157+
539+9674+1131+193+
143+4899+975+57+
21+40+5977+14+
266+8579+431+102+


Para resolver o problema precisamos eliminar todos os sinais de “+” que estejam no final da linha, como pode ser observado, por exemplo, nas 5 primeiras linhas.
# sed -i 's/[+]*$//' total.txt

Agora o arquivo está pronto para ser enviado para a calculadora e, nos retornar o total.
# cat total.txt
19+26
31+49
58+83+1
353+9975+1284+121
1321+21503+24157+5264
18+129+6135
153+3839+216+49
450+12107+1535+143
950+13594+5547+5176
25+89+3445+1
215+5385+443+127
99+2176+83+23
562+8202+3850+2337
220+8551+3512+102
975+15136+6450+5462
462+12157+482+157
539+9674+1131+193
143+4899+975+57
21+40+5977+14
266+8579+431+102

A quantidade de linhas do arquivo, será necessário para o próximo passo, mas como usamos o comando tail -32, já sabemos que o arquivo tem 32 linhas ;-)

Automatizar a geração do arquivo que será usado para alimentar o Zabbix

Nada melhor que um Shell Script para automatizar as tarefas repetitivas do dia-a-dia. Troque o nome "Server" pelo nome do Host cadastrado no Zabbix
# vi gera_zabbix.sh

#!/bin/bash

# RECEIVED
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i received.txt | tail -1`
        echo "Server mails.received $data $valor" >> valores_zabbix.txt
done

# DELIVERED
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i delivered.txt | tail -1`
        echo "Server mails.delivered $data $valor" >> valores_zabbix.txt
done

# DEFERRED
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i deferred.txt | tail -1`
        echo "Server mails.deferred $data $valor" >> valores_zabbix.txt
done

# BOUNCED
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i bounced.txt | tail -1`
        echo "Server mails.bounced $data $valor" >> valores_zabbix.txt
done

# REJECTED
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i rejected.txt | tail -1`
        echo "Server mails.rejected $data $valor" >> valores_zabbix.txt
done

# TOTAL
for ((i=1; i<=32; i++))
do
        data=`head -$i datas.txt | tail -1`
        valor=`head -$i total.txt | tail -1 | bc`
        echo "Server mails.total $data $valor" >> valores_zabbix.txt
done


Gerar o arquivo que vai alimentar o Zabbix
# sh gera_zabbix.sh

Como alguns valores estavam em branco, o arquivo ficou com algumas falhas, como essa
# cat valores_zabbix.txt
Server mails.received 1454832000
Server mails.received 1454918400 19


Vamos substituir esses espaços em banco, como na primeira linha, por 0 para que o Zabbix possa receber um valor para cada um os campos
# sed -i 's/00 $/00 0/g' valores_zabbix.txt

E agora o arquivo está correto
# cat valores_zabbix.txt
Server mails.received 1454832000 0
Server mails.received 1454918400 19

Criar os itens no Zabbix

Para que o Zabbix possa receber os dados, é preciso que sejam criados itens com as mesmas chaves que constam no arquivo. E o tipo do item deve ser Zabbix trapper.
Item E-mails Atrasados

Template Estatistica E-mail Postfix

Se você não quiser perder tempo criando os itens, eu disponibilizei o template aqui. Esse template contem os 6 itens que vamos precisar e um gráfico com todos os itens.

Populando o Zabbix com os dados

# zabbix_sender -z Proxy -T -i valores_zabbix.txt
info from server: "processed: 192; failed: 0; total: 192; seconds spent: 0.001544"
sent: 192; skipped: 0; total: 192

Coletando os valores diários

O pflogsumm.pl possui o parametro "-d yesterday" que gera as informações do dia anterior, então minha estratégia será a de todos os dias às 08:00 popular o Zabbix com os dados consolidados do dia anterior.

Esse parametro permite utilizar os totais do dia ou os valores de hora em hora, eu vou utilizar os valores totais, mas nada te impede de adaptar o script para coletar os valores por hora.

# /usr/local/bin/pflogsumm.pl -d yesterday /var/log/maillog* | more
Postfix log summaries for Mar  9

Grand Totals
------------
messages

     79   received
   1648   delivered
      0   forwarded
     11   deferred  (188  deferrals)
     34   bounced
     10   rejected (0%)
      0   reject warnings
      0   held
      0   discarded (0%)

   2790k  bytes received
  29781k  bytes delivered
     18   senders
      5   sending hosts/domains
   1514   recipients
     73   recipient hosts/domains


Per-Hour Traffic Summary
------------------------
    time          received  delivered   deferred    bounced     rejected
    --------------------------------------------------------------------
    0000-0100           0          0         16          0          0
    0100-0200           0          0         16          0          0
    0200-0300           0          0         12          0          0
    0300-0400           0          0         14          0          0

Automatizando o envio diário de informações

Primeiro vamos criar um diretório para armazenar nossos scripts
# mkdir /Scripts_Servicos

Vamos criar o script que coleta as estatísticas e  envia automaticamente para o Zabbix
# vi /Scripts_Servicos/estatisticas_email.sh

#!/bin/bash
 
# Todos dos dias gera um novo arquivo
/usr/local/bin/pflogsumm.pl -d yesterday /var/log/maillog* > /Scripts_Servicos/yesterday

# Separa as informacoes que nos interessam
received=`head -12 /Scripts_Servicos/yesterday | grep received | tr -s " " | cut -d " " -f2`
delivered=`head -12 /Scripts_Servicos/yesterday | grep delivered | tr -s " " | cut -d " " -f2`
deferred=`head -12 /Scripts_Servicos/yesterday | grep deferred | tr -s " " | cut -d " " -f2`
bounced=`head -12 /Scripts_Servicos/yesterday | grep bounced | tr -s " " | cut -d " " -f2`
rejected=`head -12 /Scripts_Servicos/yesterday | grep rejected | tr -s " " | cut -d " " -f2`
total=`echo $received+$delivered+$deferred+$bounced+$rejected | bc`
data=`date --date yesterday +%s`

# Apaga o arquivo do dia anterior
rm -rf /Scripts_Servicos/valores_zabbix

# Monta o arquivo
echo "Server mails.received $data $received" >> /Scripts_Servicos/valores_zabbix
echo "Server mails.delivered $data $delivered" >> /Scripts_Servicos/valores_zabbix
echo "Server mails.deferred $data $deferred" >> /Scripts_Servicos/valores_zabbix
echo "Server mails.bounced $data $bounced" >> /Scripts_Servicos/valores_zabbix
echo "Server mails.rejected $data $rejected" >> /Scripts_Servicos/valores_zabbix
echo "Server mails.total $data $total" >> /Scripts_Servicos/valores_zabbix

# Envia os dados para o Zabbix
zabbix_sender -z Proxy -T -i /Scripts_Servicos/valores_zabbix


Tornar o script executável
# chmod +x /Scripts_Servicos/estatisticas_email.sh

Agendar a execução do Script
# crontab -e

# Todos os dias as 08:00 envia os dados estatisticos de e-mail para o Zabbix
00      08      *       *       *       /Scripts_Servicos/estatisticas_email.sh

Referências

Guto Carvalho
Epoch Unix Time Stamp Converter
Pflogsumm
Zabbix Sender

sexta-feira, 13 de fevereiro de 2015

O livro já está sendo vendido no site da Novatec!

Bom dia, pessoal!

Há poucas horas, o livro começou a ser vendido na Novatec com 25% de desconto até o dia 28/02/2015.

Acesse o link abaixo para saber como comprar o livro com o desconto.
http://zabbixone.com/?p=151

Boa leitura!

quarta-feira, 21 de janeiro de 2015

Livro “De A a Zabbix” será publicado pela Novatec


Desde 2011 Eu, Adail Spínola e Aécio Pires estávamos escrevendo um livro sobre Zabbix. Graças a Deus, já temos uma previsão de que ele seja publicado no mês que vem. :-)

Saibam mais sobre o livro aqui: http://zabbixone.com/?p=68

O site da Novatec já está divulgando o livro no final da página inicial, na seção de próximos lançamentos. http://www.novatec.com.br/


O livro tem o apoio de Alexei Vladishev, criador do Zabbix, e Luciano Alves, proprietário e fundador da UNIREDE, empresa representante do Zabbix na América Latina e que aplica a certificação Zabbix no Brasil.

Ainda não é possível comprar o livro através da pré-venda e também não sei a estimativa de preço, mas logo logo você saberá. Aguarde e acompanhe as novidades no site do livro http://zabbixone.com.
 
Se você é aluno ou professor na área de Redes de Computadores, saiba que o livro pode ser utilizado na disciplina de gerenciamento e monitoramento de redes de computadores. O conteúdo do livro também vai de encontro ao assunto ensinado na certificação Zabbix.

terça-feira, 4 de novembro de 2014

LLD no Zabbix com Shell Script - Entendendo e utilizando esse recurso

Introdução

O recurso de LLD (Low Level Discovery) tem ganhado cada vez mais importância, uma vez que teoricamente é possível monitorar qualquer coisa utilizando esse recurso, apesar da documentação oficial, de artigos nacionais e internacionais, mensagens no fórum oficial, etc. O recurso continua desconhecido por muitos, eu queria compilar um pouco de tudo que encontrei, e da minha própria experiência e criar um artigo onde as pessoas entendessem a lógica do LLD e pudessem se basear para criar seus próprios LLDs.

Termos Técnicos

Antes de entrarmos na solução propriamente dita, precisamos entender alguns termos e soluções envolvidas nesse recurso.

LLD - Low Level Discovery: Função do Zabbix responsável por detectar determinadas características de um objeto, de forma dinâmica. Por exemplo, o Zabbix vai achar sozinho (dinamicamente) todas as partições da sua máquina (o objeto são as partições), e coletar dados como tamanho da partição, espaço livre, espaço utilizado (essas são as características do objeto).

JSON - JavaScript Object Notation: É uma formatação para intercâmbio de dados computacionais, que para seres humanos é fácil de ler e escrever e, para as máquinas é fácil de interpretar e gerar. Se você entende como um XML funciona, entende como um JSON funciona ;-)

PARSER: Em Português conhecemos como Análise Sintática, mas a maioria das pessoas usa o termo em inglês, de maneira simples, significa ler uma entrada de dados, nesse caso um arquivo JSON, e interpretar a sua estrutura gramatical. O software jq, no nosso caso, vai receber um arquivo texto com marcações específicas que ele sabe interpretar e extrair os dados.

Como funciona o LLD no Zabbix

O LLD no Zabbix de maneira muito resumida funciona da seguinte forma:
Você gera um arquivo no formato JSON com a entrada de dados utilizando o padrão de macros do Zabbix "{#VAR}", essas macros serão os objetos, por exemplo, a lista de placas de rede, a lista de partições, a lista de base de dados, a lista de tabelas de uma base de dados, a lista de antenas sem fio, etc. Isso é a Regra de Descoberta.
Em seguida você tem que dizer ao Zabbix o que coletar de cada um desses objetos da lista, isso é o Protótipo de itens. Por exemplo, para cada partição do sistema colete o tamanho da partição, o espaço livre e o espaço utilizado. Com esses itens gerados, podemos criar outros protótipos como Triggers e Gráficos.
Isso pode ser feito utilizando as Chaves suportadas pelo Zabbix, OIDs SNMP ou Scripts Personalizados.

Pré-requisitos

O único pré-requisito no Servidor Zabbix é a instalação do jq, que é um parser de JSON. No CentOS:
# yum -y install jq

Objetivo

Eu procurei criar a solução da maneira mais simples possível, para isso eu usei apenas Shell Script, nada de Perl, Python, Ruby, Awk, Expressões Regulares, apesar de tudo isso ser muito importante, eu queria que um administrador de redes iniciante tivesse condições de entender a solução, queria que pessoas que possuem ambientes críticos pudessem utilizar a solução tendo que realizar o mínimo possível de alterações no ambiente, apenas instalar o jq.

Arquivos envolvidos na solução

lld_passwd.sh: Script responsável por coletar os dados, neste exemplo, esses dados serão coletados do /etc/passwd, gerar o arquivo JSON com as macros que o Zabbix precisa e gerar um arquivo JSON comum de onde extrairemos os dados com o jq.
/tmp/lld_passwd.txt: Arquivo no formato JSON com as macros que o Zabbix necessita para interpretá-lo.
/tmp/lld_passwd_2.txt: Arquivo no formato JSON de onde extrairemos os dados para alimentar o Zabbix.

Estrutura da solução

O script coleta os dados do arquivo /etc/passwd e gera um aquivo JSON com as entradas "{#USER}", "{#NOME}", "{#HOME}" e "{#SHELL}" para cada um dos registros encontrados. No nosso exemplo, para o Zabbix só interessa a entrada "{#USER}", pois em cima da lista de usuários, solicitaremos os outros dados, o Nome do usuário "{#USER}", o Home do usuário "{#USER}", o Shell do usuário "{#USER}".

Você deve estar se perguntando: Se para o Zabbix só interessa a entrada "{#USER}" por que eu criei as outras entradas, certo? E também porque eu gerei o arquivo lld_passwd_2.txt se os dados já estão no /etc/passwd? Calma jovem gafanhoto...

O objetivo do artigo é ensinar a criar uma solução para qualquer tipo de dados, certo? Imagine que para coletar os dados que você precisa seja necessário executar um comando qualquer, nesse caso você precisaria executar o comando uma vez para montar o JSON, e depois executar o mesmo comando (ou outro) para coletar cada um dos dados referentes aos objetos do JSON, isso vai onerar o Servidor Zabbix e também o equipamento de onde os dados estão sendo coletados. Na solução aqui proposta nós vamos coletar todos os dados de uma única vez (podem ser necessários vários comandos para gerar o arquivo inteiro), e depois coletar os dados referentes aos objetos de um arquivo texto que está no próprio Servidor Zabbix, o que é muito menos custoso.

Variáveis do Script

O script foi projetado para receber as variáveis via passagem de parâmetros, porque o Zabbix vai passar esses parâmetros para ele.

Alguns detalhes devem ser observados nas variáveis do script:
Não podemos acrescentar " (aspas) ao arquivo JSON, a não ser as que ele espera encontrar e onde ele espera encontrar, então na variável $NOME, utilizei o comando tr -d \"`, para remover qualquer " (aspas) do arquivo /etc/passwd. Elas existem no user saslauth, como pode ser conferido abaixo:

# cat /etc/passwd | grep saslauth
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin


Outro detalhe importante é referente às "/", elas precisam ser escapadas assim "\/", para isso usei o sed (eu sei que falei que não ia usar Expressões Regulares, mas é só um sed de nada..) nas variáveis $HOME e $SHELL.

A variável $LINHAS é utilizada para sabermos o número de entradas que serão geradas no arquivo JSON, isso porque todas as entradas acabam com uma ",", com exceção da última entrada. Por esse mesmo motivo o "for" foi configurado para ser executado até o "i<$LINHAS" e não "i<=$LINHAS".

Opções do Script

O script possui 4 opções, mas você pode adaptá-lo para ter quantas opções forem necessárias ao seu cenário. São elas:
discovery: Gera o arquivo lld_passwd.txt que será utilizado pela regra de descoberta do Zabbix.
Você pode (e deve) validar seus arquivos JSON no JSONLint.

user: Dado determinado usuário retorna o seu usuário, sim ela é inútil, foi apenas uma piadinha nerd para relaxar, qual será o user do user root?

nome: Dado determinado usuário retorna o nome do usuário.

home: Dado determinado usuário retorna o diretório home do usuário.

shell: Dado determinado usuário retorna o shell do usuário.

Arquivo lld_passwd_2.txt

Depois de montar o arquivo lld_passwd.txt, eu utilizo o sed para trocar todas as ocorrências de macros para itens normais de um arquivo JSON:
{#USER} -> user, {#NOME} -> nome, {#HOME} -> home e {#SHELL} -> shell.
E armazeno tudo nesse arquivo, quando eu realizo as operações user, nome, home e shell, o comando jq é invocado, entende o conteúdo do arquivo JSON e faz a extração dos dados que nos interessa.

Configuração no Zabbix Server

O script deve estar no seu diretório "ExternalScripts", se você estiver na dúvida, veja no arquivo /usr/local/etc/zabbix_server.conf  a localização do mesmo. Ele também deve possuir permissão para ser executado pelo usuário zabbix, que também deve ser capaz de criar os arquivos no /tmp.

Configuração na Interface Gráfica do Zabbix Server

 Crie um novo template com o nome LLD Passwd, depois na linha do nome do template clique em Autobusca // Criar regra de descoberta, preencha os dados da regra.
Regra de Descoberta

Na linha da regra clique em Protótipos de itens // Criar protótipo de item, preencha os dados dos protótipos.

Protótipo de Item Home

Protótipo de Item Nome

Protótipo de Item Shell

Protótipo de Item Usuário
 Clone o seu host Zabbix server com o nome de Zabbix server LLD.
Zabbix server LLD
 Vincule o template LLD Passwd no host.
Template LLD Passwd
Espere 5 minutos e acesse Configuração // Hosts, observe os itens criados automaticamente. Na figura abaixo eu usei um filtro para mostrar apenas os itens do usuário root.
Itens criados dinamicamente pelo LLD
Acesse Monitoramento // Dados recentes e visualize a leitura dos dados, neste exemplo eu filtrei apenas os itens do root.

Dados recentes

 

Conclusão

Com as explicações acima e os código disponíveis acredito que você seja capaz de entender o funcionamento do LLD no Zabbix, gerar seus próprios scripts e tirar o máximo proveito desse recurso fantástico.


Anexos

lld_passwd.sh
Template LLD_Passwd

 

Agradecimentos

Queria deixar aqui meus agradecimentos ao Ronei Xavier da Silva e Ederson Frasnelli Ribeiro que me deram uma força para entender o funcionamento do JSON!

Referências

Zabbix Manual
json.org
JSON Wikipedia
Análise Sintática Wikipedia
jsonlint.com
XModulo
JQ Manual
JQ FAQ