domingo, 3 de setembro de 2017

Monitoramento de Redes - Automatizando o descobrimento de redes pelo Zabbix

Contexto

O Zabbix possui uma ótima funcionalidade para a descoberta automática de equipamentos utilizando regras de descoberta. Nesta funcionalidade é necessário cadastrar em quais redes o sistema irá procurar, e quais verificações devem ser feitas em cada rede. Isto funciona muito bem quando você gerencia uma rede com poucos intervalos de endereços IPs, e quando ela sofre poucas alterações.

Mas e se você possui uma rede muito grande, quais são as alternativas?

Se a rede conta com uma ferramenta de gerenciamento de endereços (IPAM - IP address management), como o IPPlan, GLPI-IPAM ou phpIpam por exemplo, estes podem servir como uma boa fonte para realizar este cadastro. A análise de tabelas de roteamento também pode ser uma fonte valiosa de informações para o cadastro.

Mas e se eu precisar cadastrar centenas ou milhares de redes?

A idéia para o desenvolvimento de um script para automaticamente descobrir redes IPs e  cadastrá-las no Zabbix surgiu de uma necessidade que tive para cadastrar muitas centenas de redes, e também mantê-las atualizadas.

ipDiscovery

O script ipDiscovery busca via API no Zabbix todos os equipamentos de um grupo, preferencialmente roteadores e firewalls, e realiza consultas SNMP na variável ipAddrTable rfc1213-mib2.asn1. Estas redes são então cadastradas nas regras de descoberta, também utilizando a API, com base em uma regra previamente cadastrada e definida como template.

Instalando o script

Em sistemas baseados em debian:

apt-get install python-setuptools python-dev build-essential
easy_install pip
pip install --upgrade virtualenv
pip install pyzabbix
pip install ipaddress
pip install pysnmp


Configuração

Os parâmetros abaixo estão no início do arquivo de script ipDiscovery.py. Configure o usuário do Zabbix que irá acessar a API. Certifique-se de que este possui direitos suficientes para acessar os cadastros e também para criar as regras de descoberta:

user = "Admin"

Configure a senha para este usuário:

secret = "zabbix"

A URL para o acesso à API do Zabbix:

zapi = ZabbixAPI("http://127.0.0.1/zabbix")

A comunidade SNMP para acesso aos dispositivos:

community = "public"

O nome do grupo de equipamentos do Zabbix onde deve-se buscar as informações do dispositivo:

routersGroupName="Router"

O nome da regra de descoberta do Zabbix que será utilizado como padrão para a criação de outras novas:

templateDiscoveryRule="TEMPLATE"

Somente incluir redes IP que estejam dentro do intervalo(s) abaixo:

includeIfInRange=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"]

Não inclua redes IP que estejam no intervalo especificado abaixo. No caso da rede se encaixar na regra de inclusão e também de exclusão, ela não será incluída:

ignoreIfInRange=["127.0.0.0/8"]

Alguns dispositivos podem possuir centenas de interfaces, então você pode dividi-las em várias regras. Este atributo define o máximo do número de redes em cada regra. Você não deve configurar um número maior que 112, ou pode ser que atinja a restrição do Zabbix do número máximo de caracteres por regra.

maxNetPerRule = 10

Utilização

 ./ipDiscovery.py -h
Usage: ipDiscovery.py [options]

Options:
  -h, --help            show this help message and exit
  -t TYPE, --type=TYPE  output type: html, csv or api [default: html]

./ipDiscovery .py -t html

Isto irá produzir uma tabela em html utilizando o Ajax DataTables, conforme este exemplo.

./ipDiscovery.py -t csv

Isto irá produzir um arquivo csv no seguite padrão:

AdslRouter,1-lo,127.0.0.1/8
AdslRouter,12-ppp0,179.181.19.234/32
AdslRouter,4-br0,192.168.1.1/24

./ipDiscovery.py -t api

Esta opção irá criar as regras de descoberta conforme configurado no script.



Performance

No ambiente no qual realizei os testes foi possível o cadastro de 600 redes ips em menos de 3 minutos.

Seus comentários ou dúvidas são bem vindos!


Nenhum comentário:

Postar um comentário