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