segunda-feira, 26 de outubro de 2015

INTEGRAÇÃO ZABBIX E GLPI



Essa atualização é em consequência de pedidos vindo dos gringos e também a pedido da Zabbix SIA por ser o 4.º conteúdo mais popular no recém criado https://share.zabbix.com/ e o 1.º entre os brasileiros. Para conferir a lista dos mais populares, acesse https://share.zabbix.com/popula

Há um tempo que eu queria desenvolver algo para integrar o Zabbix a algum outro sistema. Esse ano surgiu uma oportunidade de implementação de alguns sistemas de inventário e gerenciamento de chamados. Logo pensei em fazer uma integração para abertura e fechamento automático dostickets quando ocorresse algum problema que o Zabbix identificasse.


Porém, o meu entusiasmo foi logo caindo quando eu percebi que não era uma coisa tão trivial de se fazer. Pesquisei várias fontes em busca de informações a respeito dessa integração, porém não passavam de tutoriais ensinando como abrir tickets no GLPI enviando um e-mail. Estudando mais um pouco o GLPI, percebi que não era possível fazer o fechamento do ticket por outro e-mail. Num dos fóruns que eu participo, surgiu a idéia de tentar fazer essa integração atráves do plugin Webservicesque tem disponível para o GLPI. Em outra mensagem, uma pessoa enviou um link onde foi feito a integração do GLPI com a ferramenta Nagios utilizando esse plugin. Foi aí que eu ressolvi atacar e comecei a estudar como essa integração foi feita para que eu pudesse desenvolver para integrar com o Zabbix.



A partir desse momento surgiram várias dúvidas e também a necessidade de utilização de outros recursos, como a API do Zabbix. Pois, além da abertura do ticket, eu queria reconhecer o evento gerado pelo Zabbix de forma automática. Sendo assim, esse projeto iniciou com os seguintes propósitos:

  • Identificar uma trigger com status PROBLEM no Zabbix e executar uma ação.
  • Disparar a execução de um script PHP para abrir o ticket no GLPI usando o plugin Webservices.
  • Enviar o número de evento gerado pela ação juntamente com o identificador da trigger e o nome do host onde o problema aconteceu. Essas informações serão gravadas no ticket criado no GLPI.
  • Reconhecer o evento no Zabbix executando um script Python que faz uso da API do próprio Zabbix.
  • Identificar uma trigger com status OK no Zabbix e disparar a execução de um script PHP para fechar o ticket no GLPI, além de incluir um followup no ticket informando que o problema foi resolvido.
  • Utilizar o recurso de notificação de chamados disponível no GLPI.

Para seguir este tutorial, você deverá ter o Zabbix e o GLPI instalados. Não vou comentar sobre a instalação desses dois sistemas. Existem muitos tutoriais de instalação na web. Porém, os que eu recomendo são:


As seguintes versões de software foram usadas nesta integração:

  • Zabbix 2.2
  • GLPI 0.84.3
  • Python 2.6.6
  • MySQL 5.1.69
  • PHP 5.3.3
  • Plugin Webservices 1.4

Creio não ter problemas de funcionar com a versão do Zabbix 2.x, pois a biblioteca Python API foi desenvolvida para funcionar a partir da versão 1.8. Mas quem vai querer usar versão anterior depois do lançamento da 2.2? A única dependência para o zabbix-glpi funcionar é a versão do GLPI e do plugin Webservices, que devem ser no mínimo as versões listadas acima.

Instalando o plugin Webservices no GLPI.


Antes de instalarmos o plugins, devemos suprir as dependências instalando os seguintes pacotes:

  • php-soap
  • php5-xmlrpc

Obs.: Se o Zabbix estiver instalado em servidor separado do GLPI, você deverá instalar o pacote php5-xmlrpc também no servidor do Zabbix.

  • apt-get install php-soap php-xmlrpc -y
  • service apache2 reload
Baixar e descompactar o plugin webservices dentro do diretório plugins do GLPI.

  • cd /var/www/html/glpi/plugins
  • wget https://forge.indepnet.net/attachments/download/1623/glpi_webservices-1.4.0.tar.gz
  • tar xf glpi_webservices-1.4.0.tar.gz
Ajustar as permissões do diretório que foi descompactado.

  • chown -R apache.apache webservices

Acessar o menu Configurar > Plugins na interface web do GLPI, aparecerá a tela conforme figura abaixo:



Após, clique no botão Instalar e em seguida no botão Habilitar.

O próximo passo é realizar a configuração do plugin, no qual fazemos acessando o menu Plugins > Web Services.

Será exibida apenas uma configuração com o nome Local. Clique no link para abrir a configuração, conforme tela abaixo:




Aqui, só precisamos informar o IP ou faixa de IP que terá acesso ao Webservice. No campo IPv4 address range, informe o IP do servidor Zabbix. Altere o campo Nome para Zabbix, apenas para ficar mais organizado.

Observando a imagem acima, você verá que eu coloquei a range 192.168.0.169-192.168.0.170. Isto porque eu utilizo servidores separados para o Zabbix e o GLPI. Se você utiliza apenas um único servidor, informe apenas o IP desse servidor nos dois campos.

O restante dos campos pode ficar sem alteração.


zabbix-glpi - Instalação e configuração

Baixe os scripts de intregração disponíveis em https://github.com/janssenlima/zabbix-glpi
Recomendo a instalação do pacote git para clonar o repositório.

# apt-get install git

Após, clone o repositório:

# cd /tmp/

# git clone https://github.com/janssenlima/zabbix-glpi.git

Mova os scripts para o diretório externalscripts da instalação do Zabbix (ou um diretório de sua preferência).

# mv *zabbix* /opt/zabbix/externalscripts/

Ajuste a permissão para o usuário zabbix e dê permissão de execução para os scripts.
chown zabbix.zabbix /opt/zabbix/externalscripts/*

# chmod +x /opt/zabbix/externalscripts/*

O conteúdo do diretório ficará assim:

# tree /opt/zabbix/externalscripts/

/opt/zabbix/externalscripts/
├── ack_zabbix_glpi.py
└── tickets_zabbix_glpi.php


Onde:

ack_zabbix_glpi.py é o script que faz o reconhecimento do evento no Zabbix via API.
tickets_zabbix_glpi.php é o script que faz abertura e fechamento de tickets no GLPI utilizando o plugin Webservices.

Instale a API Zabbix com o seguinte comando:
pip install zabbix-api



Agora, está faltando criarmos as ações para disparar a abertura e fechamento dos tickets.
Acesse o menu Configuração > Ações na interface web do Zabbix.

Criaremos duas ações. A primeira para abrir o ticket. Clique no botão Criar ação. Na tela seguinte dê o nome da ação. Vou chamá-la "Abrir Chamado". Na aba Ação não é preciso alterar os demais campos. Na aba Condições, podemos deixar como está, pois já vai satisfazer o que precisamos. Vale lembrar que a condição Valor da trigger = PROBLEMA é obrigatória. Na aba Ações criaremos uma nova operação com os seguintes dados:

  • Duração padrão do passo da operação: 60
  • Tipo da opração: Comando remoto
  • Lista alvo: Host: Zabbix server 
  • Tipo: Script personalizado
  • Executar em: Agent Zabbix
  • Comandos: php /opt/zabbix/externalscripts/tickets_zabbix_glpi.php eventhost="{HOSTNAME}" event="DOWN" state="{TRIGGER.STATUS}" hostproblemid=0 lasthostproblemid=0 servico="{TRIGGER.NAME}" triggerid="{TRIGGER.ID}" eventzabbix="{EVENT.ID}"

Algumas observações das configurações acima: A lista alvo deverá ser o host onde os scripts de integração se encontram; Não altere os parâmetros do campo comando, com exceção do caminho onde você gravou o script.
Crie outra ação com o nome "Fechar chamado". As únicas configurações que você precisa fazer são:

  • Na aba Condições, remova a condição de problema da trigger e inclua Valor da trigger = OK.
  • Altere o comando na aba Ações para: php /opt/zabbix/externalscripts/tickets_zabbix_glpi.php eventhost="{HOSTNAME}" event="UP" state="{TRIGGER.STATUS}" hostproblemid=1 lasthostproblemid=1 servico="{TRIGGER.NAME}" triggerid="{TRIGGER.ID}" eventzabbix="{EVENT.ID}"Novamente. Não altere os parâmetros do comando, apenas o caminho do script no seu servidor, caso for diferente do que está.
Dica: Clone a ação para não precisar fazer tudo novamente, já que são apenas duas alterações a fazer, além de trocar o nome da ação.

Neste primeiro momento não se preocupe com as condições. Vá testanto aos poucos. Uma dica é você filtrar por grupo de hosts. Por exemplo, você deseja abrir chamados automaticamente apenas dos servidores, impressoras e roteadores, deixando fora equipamentos como desktop.

O parâmetro EnableRemoteCommands do arquivo zabbix_agentd.conf deve estar com o valor 1, que habilita a execução de comandos remotos.

Toda a configuração para fazer a integração entre o Zabbix e o GLPI foi realizada. 

Isso funciona mesmo?


O teste que eu vou fazer é forçar a parada do serviço SSH do próprio servidor do Zabbix. A imagem foi tirada da tela de Dashboard após o Zabbix identificar a que o serviço parou.



Observe na figura que após o incidente ser reconhecido, ele já executou uma ação e foi reconhecido. Isso significa que o ticket foi aberto. Temos outras formas de verificar o evento através do menu Monitoramento > Eventos. Clicando na data e horário do evento, obtemos informações detalhadas sobre o mesmo, conforme pode ser visualizado na figura abaixo:




Agora, vamos verificar o ticket criado no GLPI.





A figura acima exibe o ticket de ID 5 aberto e com status de novo e a descrição do problema com o número do evento gerado no Zabbix. É através desse número que o script ack_zabbix_glpi.py faz o reconhecimento do evento no Zabbix via API.


Ao abrirmos o ticket, podemos verificar outros campos, tais como a descrição do problema que exibe informações como nome do host, ID da trigger e seu status. Outra informação importante é a Origem da requisição, onde informa que este ticket foi criado por Webservices. Observe na figura abaixo:




Agora vamos iniciar o serviço SSH para o ticket ser fechado automaticamente. Acesse o menuMonitoramento > Eventos no Zabbix e verifique que o serviço já está OK.



Voltamos para o GLPI e verificamos que o ticket foi fechado.



Observe na coluna Status que mudou para Solucionado.

Clicando no ticket, veremos que o Followup foi inserido no registro após o seu fechamento automático. Observe a figura abaixo:


E assim a integração está realizada. Você poderá verificar os tickets abertos automaticamente quando uma trigger for disparada e ser fechado quando a trigger voltar ao normal. Existe um pluginde relatórios que podemos ver de forma gráfica a quantidade de registros que foram abertos e solucionados via Webservices. Mas isso é um assunto para outro post.

A respeito do recurso de notificação por e-mail, já está incluído e funcionando. Se você utiliza esse recurso do GLPI mas não quer receber os e-mails dos tickets abertos via Webservice, deverá comentar a linha no código do arquivo tickets_zabbix_glpi.php. Quando eu automatizar a instalação essa opção poderá ser escolhida no momento da instalação.

O próximo passo será empacotar o zabbix-glpi nos formatos RPM e DEB e automatizar a instalação. Atualizações e correções de erros serão informadas em posts neste blog.

Eu gostaria muito da opinião de vocês para que possamos manter esse projeto sempre atualizado, buscando melhorias de qualidade e performance, alterando opções que são geradas automaticamente etc. Para isso, preciso do feedback, tanto de crítica como de sugestões.

FONTE:

http://blog.janssenlima.com/2013/11/integracao-zabbix-glpi.html

https://github.com/janssenlima/zabbix-glpi

http://blog.janssenlima.com/2014/08/atualizacao-zabbix-glpi.html




Quem é Almir JR