:::: MENU ::::

quinta-feira, 3 de julho de 2014

Uma das grandes vantagens de se utilizar o Zabbix, é as suas infinitas possibilidades de expansão. O shellscript é um grande aliado na coleta de informações, visto que qualquer informação que você possa obter com o shellscript, ela pode ser jogada no Zabbix. 

Nesse post, vamos mostrar por etapas como consultar dentro da base de dados do GLPI, o número de tickets fechados no mês e jogar essas informações no Zabbix, e gerar também gráficos, porque chefe gosta é de gráfico! :D


Vamos dividir esse tutorial em:
1. Banco de dados
1.1 Criação de usuário no banco
1.2 Criação do select
2. Shell Script
2.1 Criação do script
2.2 Teste de script
3. Configuração do Zabbix
3.1 Inserção do shell script
3.2 Criação do template
3.2.1 Criação do item
3.2.2 Criação do gráfico

1. Banco de dados

1.1 Criação de usuário no banco

Primeiramente, vamos criar um usuário no banco de dados onde está o GLPI. Esse usuário precisará apenas do SELECT. Então, vamos criá-lo:

1. Logue no banco de dados:
mysql -u root -p -h ip.do.servidor.glpi

2. Crie o usuário. O usuário se chamará zabbix e sua senha será zabbix_passwd:
GRANT SELECT ON glpi.* TO 'zabbix'@'%' IDENTIFIED BY 'zabbix_passwd' WITH GRANT OPTION;


Usuário criado. Hora de testar:
mysql -u zabbix -pzabbix_passwd -h IP.DO.SERVIDOR -D glpi

Logou? Funcionou? Ok! Vamos ao próximo passo.

1.2 Criação do select

O segundo passo é saber o que queremos:
  • Tickets fechados (solucionados);
  • Tickets fechados no mês corrente;
  • Início do contrato (opcional)
  • Tickets fechados pelo técnico 'xyz'
  • ID do técnico

A tabela do banco de dados que contém essas informações é a glpi_tracking. As colunas são:
  • Tickets fechados (solucionados) - status
  • Tickets fechados no mês corrente - closedate
  • Início do contrato - date
  • Tickets fechados pelo técnico 'xyz' - assign

Por que o início do contrato é opcional?
Caso você esteja alocado em algum contrato (como é meu caso), você provavelmente vai querer obter somente os dados a partir do início de seu contrato, não importando os anteriores. Nesse campo vamos dizer que o nosso contrato teve início no dia 01 de Abril de 2010.

Você também terá que consultar a tabela glpi_users, para coletar os IDs dos técnicos. Faça uma lista. No meu exemplo, digamos que os técnicos da minha equipe sejam:
ID - NOME
011 - Ikki
331 - Yoga
337 - Chun
374 - Seya
500 - Shiryu

Dica:
Guarde isso. Digo mais: Coloque isso como um comentário no na sua query.sql

A par dessas informações, faremos nossa consulta ao banco de dados. Peço desculpas pela pouca informação na query, mas não manjo muito disso. Essa consulta foi feita por um amigo, o Allan Andrade (Obrigado!!!)
/* query.sql
Raul Libório, rauhmaru@opensuse.org
Allan Andrade
Consulta a base de dados do GLPI e retorna
  o nro de chamados fechados pelo técnico 'xyz'
 Tecnicos:
  011    Ikki
  331    Yoga
  337    Chun
  374    Seya
  500    Shiryu

*/

SELECT
 COUNT(*) AS QTD
FROM
    glpi_tracking
WHERE
    (glpi_tracking.status = 'old_done') AND
    (glpi_tracking.closedate BETWEEN 'INICIO' AND 'FIM') AND
    (glpi_tracking.date >= '2010-04-01') AND /* Início do Contrato */
    (glpi_tracking.assign IN (ID));

Entendendo o script
O status que queremos é o old_done. Ele é o status de ticket solucionado;
O glpi_tracking.closedate é o período dos tickets solucionados. Ele usa o padrão de formatação ano-mês-dia. Como queremos os tickets solucionados entre primeiro e o último dia do mês corrente, eu coloquei as palavras INICIO e FIM respectivamente. Isso será alterado com a ajuda de um shell script ;)
O glpi_tracking.date é o início do contrato;
O glpi_tracking.assign é o ID do técnico. Isso também será alterado por shell script;
As palavras INICIO e FIM serão substituídas pelos valores correspondentes do mês, via shellscript;
A palavra ID será substituída pelo ID do técnico, também via shellscript;

Script sql pronto? Sim, mas para testar precisamos inserir dados reais para a consulta.
Precisaremos:
Mudar a data na linha glpi_tracking.closedate
Definir a data de início do contrato
Definir o ID do técnico, em glpi_tracking.assign, no lugar do "ID"

Exemplo de como ficará
SELECT
 COUNT(*) AS QTD
FROM
    glpi_tracking
WHERE
    (glpi_tracking.status = 'old_done') AND
    (glpi_tracking.closedate BETWEEN '2014-06-01' AND '2014-06-30') AND
    (glpi_tracking.date >= '2010-04-01') AND /* Início do Contrato */
    (glpi_tracking.assign IN (011));
Nesse exemplo, vamos consultar os tickets fechados no mês de Junho (2014-06-01 a 2014-06-30), pelo técnico Ikki (ID 011)
Feito isso, salve o arquivo como query.sql execute dessa maneira:
mysql -u zabbix -p -D glpi -h IP.DO.SERVIDOR < query.sql

Se tudo der ok, ele retornará algo assim:
QTD
72

A primeira linha é o título definido por nós e a segunda é o valor. Apenas ele nos importa de verdade.


2. Shell Script

2.1 Criação do script

Lá em cima dissemos que uma parte do query.sql seria alterada pelo shellscript. Então, vamos lá, acompanhem a explicação das variáveis.

  • DATA_INICIO=`date +%Y-%m-01`: Retorna o primeiro dia do mês atual;
  • DATA_FIM=`date +%Y-%m-31`: Retorna o último dia do mês atual.
  • SQLFILE="/etc/zabbix/scripts/query.sql": Local onde o script SQL da query feita acima está localizada. Recomendo deixar no mesmo local dos outros External Scripts do Zabbix;
  • SQLQUERY="/tmp/script.sql": Local onde será armazenada a cópia do script SQL para as alterações. O script SQL original não será alterado. Sempre trabalharemos com a cópia.
  • SERVER="192.168.1.5": Endereço IP do seu servidor de banco de dados do GLPI;
    DATABASE="glpi": Nome da base de dados do GLPI;
    USER="zabbix": Nome do usuário que fará a consulta a base de dados. É o mesmo criado anteriormente;
    PASSWD="zabbix_user_access": Senha do usuário que irá acessar a base de dados;
    MYSQL=$(which mysql): O comando which mostra aonde está localizado o binário
#!/bin/bash
# Script de consulta ao nro de chamados do GLPI/SDN
#--
# Data de inicio do mes corrente
DATA_INICIO=`date +%Y-%m-01`
# Data de fim do mes corrente
DATA_FIM=`date +%Y-%m-31`
# Localizacao do script .sql
SQLFILE="/etc/zabbix/scripts/query.sql"
# Como esse .sql será alterado, vamos sempre usar uma copia
SQLQUERY="/tmp/script.sql"
# Endereco ip do servidor onde está o glpi
SERVER="192.168.1.5"
DATABASE="glpi"
USER="zabbix"
PASSWD="zabbix_user_access"

# O comando which mostra aonde está localizado o binário
MYSQL=$(which mysql)

#------------------
#Script
## Crie uma copia do arquivo .sql
cp $SQLFILE $SQLQUERY

# Mude $DATA_INICIO para $DATA_FIM e depois altere também o campo ID.
sed -i "\
s/INICIO/$DATA_INICIO/;\
s/FIM/$DATA_FIM/;\
s/ID/$1/" $SQLQUERY

# Execute o comando mysql com as variáveis citadas acima
$MYSQL -u $USER -p$PASSWD -h $SERVER -D $DATABASE < $SQLQUERY | tail -1
Lembrem-se de alterar as variáveis para ficar de acordo com seu ambiente!

Se você entende um pouco de shellscript, pode estar se perguntando: 
Pergunta: Por que na linha do sed, no momento da substituição do ID (s/ID/$1/), o valor é o de $1, que é significa o primeiro argumento na linha de comando?
Resposta: Meu querido padawan, o primeiro argumento será enviado pelo Zabbix, com a criação do item. Lá na criação dos itens que vamos cadastrar cada técnico :)

Com isso, temos dois arquivos criados: query.sql e o glpi_conta_ticket.sh (sugestão de nomes heheheh)

2.2 Teste do script

Essa parte é moleza. Você vai executar o script e passar como primeiro parâmetro, o ID de um técnico. Exemplo:

sh glpi_conta_ticket.sh 11

O valor retornado será quantos tickets o cidadão fechou no mês até agora.


Com tudo funcionando, sua tarefa agora é verificar no arquivo zabbix_server.conf, para qual diretório aponta o parâmetro ExternalScripts. Recomendo que aponte para dentro do seu /etc/zabbix/scripts, dessa maneira:

ExternalScripts=/etc/zabbix/scripts

Mova os nossos dois arquivos criados ( o script SQL e o shellscript ) para dentro desse diretório. Não esqueça disso!

Então concluímos a primeira parte de nosso tutorial. Na parte 2, vamos mostrar como criar o template, criar os itens e também criar os gráficos.

Até a próxima!

Um comentário:

  1. Olá boa tarde; estava procurando mais ou menos o que você colocou aqui, queria coletar uma informação de um banco e soltar a informação na minha tela do zabbix..

    Só queria saaber onde está a segunda parte.. 'T_T

    òtimo tutorial, bem explicativo muito obrigado desde já!!

    ResponderExcluir

Só não vale xingar a mãe ou puxar cabelo nos comentários =)

Posts populares