Zabbix API + Python – Host com IP Dinâmico

Zabbix API + Python – Host com IP Dinâmico

Passei por uma situação atualmente na empresa, onde algumas máquinas que ficam hospedadas na AWS, não possuem IP fixo, e esporadicamente o endereçamento é alterado, perdendo assim a comunicação com o Zabbix Server e por sua vez gerando um alerta falso de falha de comunicação com o host, perdendo também toda a monitoria em tempo real que é feita, gerando um transtorno caso algum dos serviços monitorados esteja com problema.

Zabbix Logo

Devido a isso, vi nesse cenário a possibilidade de utilizar a API do Zabbix aliada com o Python para fazer a atualização do IP.

Quando acontecia essa situação, manualmente é feito a alteração do IP do Host no Frontend do Zabbix, retornando a comunicação e também mantendo todo o histórico de coleta que já foi feita naquele host.

Com a ajuda da documentação oficial do Zabbix e aliado com o software Postman, identifiquei quais são as requisições que eu deveria fazer para chegar a atualização da informação que eu precisava.

Sabendo que essa situação poderia ser resolvida com um DNS ou até mesmo com IP fixo, pensei na possibilidade de resolver essa situação de outra forma, onde tornaria as coisas interessantes.

Agora indo para o python, utilizo as seguintes bibliotecas:

  • zapi: Biblioteca de conexão com a API do Zabbix
  • re: Biblioteca de expressão regular onde faço é utilizada para filtro da informação retornada.
  • requests: Biblioteca de conexão HTTP

Informo a url de conexão da API do Zabbix, o usuário e senha respectivo.

Utilizando o try/except faço essa conexão com o servidor, setando um timeout de 4 segundos, caso aconteça com falha irá retornar a mensagem descrita no except e também irá imprimir a exceção.

Como o script será executado no Host, no qual o IP foi perdido. Primeiramente preciso saber qual é o Hostname dessa máquina para fazer a consulta na API do Zabbix.

Pesquiso no arquivo de configuração do Zabbix Agent zabbix_agentd.conf, primeiramente faço a abertura do mesmo e dentro de um loop leio o seu conteúdo. Busco “Hostname=” dentro do conteúdo.

A variável host_name1, ela me retorna exatamente como vai estar no arquivo de configuração porém preciso apenas da informação que fica após o sinal de igual, é aonde entre a próxima variável o host_name2, filtro utilizando reggex todo o conteúdo que está após o sinal de igual. Me retornando o nome do Host dentro de uma Lista, indexo essa variável na posição 0, onde irá me devolver o valor final no caso o nome do Host.

Com o nome do Host, faço uma requisição do tipo host.get utilizando o Hostname encontrado anteriormente, e em seguida utilizando o index filtro o resultado, coletando o primeiro conteúdo após ‘hostid’, onde terei exatamente o hostid dessa máquina monitorada.

Faço o mesmo processo, utilizando o host_id pela requisição hostinterface.get, para pegar o IP do Host no Zabbix.

Faço o mesmo processo, utilizando o host_id pela requisição hostinterface.get, para pegar o ID da interface, onde possui as informações de conexão com o Host, como IP / DNS / Porta.

Nesse trecho, utilizo a API disponível do IPIFLY para me retornar o endereço IP público atual do host.

Com os dados disponíveis, faço a comparação do endereço IP que está atualmente configurado no Zabbix Server para o Host com o endereço de IP público, caso forem diferentes, o endereço será atualizado utilizando a requisição hostinterface.update.

No meu cenário cada host possui um IP público diferente, por esse motivo foi utilizado a coleta do IP público, seguindo essa mesma lógica, poderá ser utilizado também para IP local, porém será necessário fazer alteração na forma que o Python irá coletar essa informação.

Esse Script está disponível via Github.

Tags: , , ,