Consumindo a API do Zabbix com Node-RED

Consumindo a API do Zabbix com Node-RED

Esse é um artigo para iniciantes e não cobrirá aspectos avançados da API do Zabbix, o intuito é ser uma porta de entrada para aqueles que não possuem familiaridade com alguma linguagem de programação, demonstrando que com conhecimentos básicos de lógica e utilizando o Node-RED, é possível fazer algumas coisas interessantes.

Introdução

O Zabbix possui uma API extremamente rica que permite estender suas funcionalidades através de ferramentas externas, existem diversos cenários onde o uso da API é necessário, seja para desenvolver funcionalidades externas ainda não existentes na ferramenta, integrar com alguma outra ferramenta utilizada pelo time ou para gerações de relatórios, essa última parte o Zabbix é bem pobre 😔.

Nesse artigo vou demonstrar o consumo da API do Zabbix utilizando a ferramenta Node-RED, essa ferramenta foi inicialmente desenvolvida pela IBM, atualmente faz parte da JS Foundation, é uma ferramenta considerada low code baseada em fluxos, onde você desenvolve toda a lógica da sua aplicação através de caixinhas que se comunicam umas com as outras, cada caixinha possui uma entrada e uma ou mais saídas, abstraindo o conceito de uma função de uma linguagem de programação.

O que é Node-RED?

O Node-RED foi originalmente desenvolvido para trabalhar com IoT, sendo muito leve e rodando sobre NodeJS, podendo ser embarcado em hardwares como Raspberry PI, permitindo fazer a integração do hardware (GPIO) a diversos serviços, como um broker MQTT ou APIs externas.

Atualmente ele tem sido utilizado para uma gama muito maior de aplicações, como integração entre sistemas, ETLs simplificados, construção de APIs, desenvolvimento de ChatBots e o que mais a sua imaginação permitir. Por ser baseado em javascript conta com o maior acervo de bibliotecas existentes atualmente, o ecossistema javascript e uma comunidade bem ativa que mantém uma série de nós externos para realizar as mais diversas atividades utilizando a ferramenta.

Vídeo de introdução ao Node-RED

Instalando o Node-RED

A instalação do Node-RED é extremamente simples, podendo ser realizada através do gerenciador de pacotes npm ou utilizada através de docker. Não vou entrar em maiores detalhes sobre o processo de instalação, pois a documentação oficial explica muito bem essa parte.

Após a devida instalação e inicialização da ferramenta, seja através de docker ou npm, sua interface web poderá ser acessada através do endereço http://localhost:1880, ou se estiver rodando ela em algum server, substitua pelo endereço IP adequado e garanta que possui as devidas liberações de firewall para acesso a porta 1880.

Tela inicial Node-RED

Consumindo a API do Zabbix

A comunicação com a API do Zabbix ocorre através do protocolo http/https utilizando um único endpoint api_jsonrpc.php, onde o método de consulta e demais parâmetros são passados via payload utilizando o verbo POST.

O primeiro passo para qualquer iteração com a API do Zabbix é autenticação, esse procedimento é necessário para obter o token que será utilizado nas próximas consultas, para isso utilizamos o método user.login, observar que a própria documentação recomenda realizar o user.logout após realizar todas as consultas necessárias.

Warning: When using this method, you also need to do user.logout to prevent the generation of a large number of open session records.

Autenticando na API

Vamos iniciar fazendo a autenticação na API do Zabbix, para isso vamos utilizar 2 nós do Node-RED, um change e um http request, vamos inserir outros 2 nós injection e debug apenas para podermos testar a configuração, o nó injection servirá como gatilho para iniciar a consulta e o debug exibe em um painel lateral as informações retornadas.

Processo de autenticação na API do Zabbix

Para o processo de autenticação utilizados o nó change para montarmos o payload e o nó http request para executar a requisição POST na API do Zabbix, o resultado como na imagem acima, é um token de autenticação que poderá ser utilizado para as próximas consultas, esse token tem a duração default de 15m.

Configuração do nó change

Como na imagem acima, estamos configurando o payload a ser enviado com o conteúdo JSON abaixo, esse é o payload necessário para realizar a autenticação na API, conforme a documentação.

{  
    "jsonrpc": "2.0",  
    "method": "user.login",  
    "params": {  
        "user": "Admin",  
        "password": "zabbix"  
    },  
    "id": 1,  
    "auth": null  
}

Esse payload será passado para o nó http request que efetivamente irá realizar a requisição a API, na imagem abaixo é possível ver a configuração desse nó.

Configuração do nó http request

Como a API do Zabbix é composta por um único endpoint, poderemos utilizar esse mesmo nó para as demais requisições, alterando apenas o payload a ser enviado com o nó change.

Consumindo informações de um host com host.get

Como o objetivo é apenas demonstrar a possibilidade, vamos utilizar um método bem simples e amplamente utilizado, utilizaremos o método host.get para recuperar os atributos de um determinado host.

Utilizaremos o payload abaixo, para obter os atributos do host com nome Zabbix server.

{  
    "jsonrpc": "2.0",  
    "method": "host.get",  
    "params": {  
        "filter": {  
            "host": \[  
                "Zabbix server"  
            \]  
        }  
    },  
    "auth": "",  
    "id": 1  
}

Vamos adicionar mais um nó do tipo change, onde vamos pegar o token retornado pelo nó anterior e construir nosso payload como na imagem acima. Na sequência de imagens abaixo, podemos ver essa ligação entre os nós e as configurações realizadas nesse nó change.

Consumindo API com host.get

Abaixo como ficou a configuração do nó change incluído, foi adicionado mais um nó http request que é uma copia exata do nó configurado anteriormente. Na imagem bem a direita é possível verificar a resposta da API com todos os atributos do host consultado.

Configuração para o método host.get

Existem diversas configurações desse payload de consulta que podem ser realizadas, permitindo filtrar os atributos retornados ou mesmo incluir interfaces e outras configurações do host, a documentação do Zabbix é bem completa e deve ser consultada sempre que necessário. Não é objetivo aqui, cobrir todas essas opções.

Fazendo logout na API

Vamos adicionar mais 2 nós agora que serão responsáveis por fazer o logout na API do Zabbix, conforme recomendado pela documentação. Será utilizado o payload abaixo em um nó change e no mesmo nó a chave auth será substituída com o token obtido no nó de autenticação, essa informação esta armazenada no na key msg.token que se mantém preservada entre a passagem pelos nós.

{  
    "jsonrpc": "2.0",  
    "method": "user.logout",  
    "params": \[\],  
    "id": 1,  
    "auth": ""  
}

Usaremos o nó change com esse payload e modificaremos a key auth, como abaixo.

Configuração para logout

E posteriormente ligamos ao nó de http request para efetivamente efetuar o logout na API.

Juntando todas as partes

Após juntarmos todas as partes, obtemos um exemplo completo de consumo da API do Zabbix, cobrindo as 3 principais etapas:

  1. User login
  2. Consumo de métodos, nesse exemplo (host.get)
  3. User logout

Conclusão

A proposta era demonstrar uma forma diferente de consumir a API do Zabbix, usando uma ferramenta mais amigável para o usuário que não se sente confortável em utilizar uma linguagem de programação tradicional, o Node-RED possui diversos pacotes de nós desenvolvidos pela comunidade para se conectar aos mais diversos serviços, é uma ferramenta madura suficiente para manter um ambiente em produção.

O que foi demonstrado aqui é uma abordagem simplificada para iniciação na ferramenta, existem diversas formas diferentes de obter o mesmo resultado, cada cenário deve ser pensado individualmente, não possui um uso prático, apenas didático.

O JSON para ser importado diretamente na ferramenta e realizar as alterações necessárias pode ser obtido abaixo, sendo necessário parametrizar os nós conforme o ambiente e necessidade.

Referências

Zabbix Documentation 5.0
Zabbix API allows you to programmatically retrieve and modify the configuration of Zabbix and provides access to…
zabbix.com

Node-RED
Node-RED provides a browser-based flow editor that makes it easy to wire together flows using the wide range of nodes…
nodered.org