terça-feira, 13 de junho de 2017

Usando Zabbix para monitorar seu ambiente Unifi

Boa Tarde!

Neste post vou tentar dar o caminho das pedras para quem tem um ambiente com antenas Unifi e deseja saber a saúde desses dispositivos.

Para os afobados que querem somente o script, pode baixá-lo aqui. E o template aqui.

Para quem não sabe, Unifi são os pontos de acesso da Ubiquiti, focados para ambiente empresarial, com a possibilidade de ter um controlador centralizado. Através deste controlador você configura os seus pontos de acesso, podendo separá-los por sites, com configurações específicas para cada ambiente.

Neste procedimento, monitoraremos a quantidade e o status das antenas já previamente adicionadas ao seu controlador. O exemplo aqui é feito com um Unifi Controller instalado em um Debian 8 x64.
Posto isto, mãos à obra:

1) Acesse seu controlador via ssh e baixe os arquivos do github. Ou use outra estação para baixar e copie os arquivos para dentro da sua máquina onde está seu controlador. O que preferir.


2) Copie o arquivo unifi.sh para /etc/zabbix/ e  unifi_sh_api para /usr/lib/unifi/bin/


3) Edite o arquivo unifi_sh_api, informando os dados do seu ambiente. Este ambiente é carregado toda vez que unifi.sh é chamado, e contém todas as configurações para login do script na aplicação para coleta dos dados.
username=
password=
baseurl=https://
site=default


4) Para testar o funcionamento do script, vamos executá-lo:
/etc/zabbix/unifi.sh

Executando descoberta

Veja que o retorno foi uma saída em formato JSON, que é o formato que o Zabbix utiliza para fazer o LLD, que é o processo de descoberta de itens de monitoramento, de forma dinâmica. Entenda mais sobre LLD aqui.

Caso queiramos outras informações a respeito de um site específico, devemos informar o nome do site e a informação que desejamos. É possível saber quantos APs temos ao total, offline e online.
Por exemplo, caso queira saber o total de pontos de acesso no site default, execute o comando abaixo:

/etc/zabbix/unifi.zabbix default total

A saída será a quantidade total de dispositivos.

Coletando valores de site específico


5) Agora vamos editar o arquivo de configuração do Zabbix, adicionando um parâmetro de usuário. Um parâmetro de usuário nada mais é do que uma forma customizada de uma chave de monitoramento. É uma chave que criaremos por conta para fazer um tipo de de coleta que nos interessa.
Essa é uma das melhores sacadas dessa solução, ao meu ver. É possível monitorar qualquer dado, desde que ele seja passível de coleta de alguma forma. Entenda mais sobre parâmetros de usuário aqui.

Vamos adicionar ao final do arquivo de configuração do Zabbix a configuração desse novo parâmetro de usuário. Se você leu a documentação, já deve saber que informa-se o nome da chave e depois o comando que ela executará, separado por vírgulas.
Execute o comando abaixo ou use o seu editor de texto preferido para criar a nossa nova chave:
echo 'UserParameter=unifi[*],/etc/zabbix/unifi.sh $1 $2' > /etc/zabbix/zabbix_agentd.conf

Para checar se o comando funcionou, execute o comando abaixo. O retorno deve ser o conteúdo do echo que executamos acima.

cat /etc/zabbix/zabbix_agentd.conf | grep ^UserParameter>
$1 e $2 são a declaração dos parâmetros que essa chave pode receber.

Isto feito, reinicie o serviço do agente Zabbix.

service zabbix-agent restart


6) Agora vamos testar através do Zabbix. Acesse seu servidor Zabbix via ssh e então vamos tentar coletar os dados manualmente.
Primeiramente tente executar o LLD:

zabbix_get -s SERVIDOR_UNIFI -p PORTA -k unifi

Agora tentemos coletar a quantidade de pontos de acesso no site default:

zabbix_get -s SERVIDOR_UNIFI -p PORTA -k unifi[default,total]


7) Finalmente, adicionaremos os itens ao Zabbix. Crie um novo template (ou configure direto em um host, como preferir) e vá em Regras de Descoberta e adicione uma nova regra conforme abaixo:

Criando regra de descoberta

Esta regra faz com que seja gerado o processo de descoberta periodicamente. Para o meu ambiente estipulei que a cada 6 horas é um bom número.
Após isto, vamos criar os itens em Protótipos de Itens:

Visão geral dos protótipos de item

Detalhes de um protótipo de item


Veja que agora montamos a chave inteira do Zabbix, usando a macro do site que é gerado na saída JSON. Dessa forma o processo irá criar um item deste para cada site encontrado na regra de descoberta.

Se tudo der certo, crie seus outros itens conforme a sua necessidade. No mesmo diretório onde estão os scripts eu disponibilizei um template para os dados abordados nesse tutorial.

Espero que possa ser útil.

Grande Abraço!

4 comentários:

  1. Quando executo o script aparece desta forma

    root@vtxubqt02:/etc/zabbix# ./unifi.sh
    ./unifi.sh: 42: ./unifi.sh: curl: not found
    ./unifi.sh: 217: ./unifi.sh: curl: not found
    Traceback (most recent call last):
    File "", line 1, in
    File "", line 1, in
    File "/usr/lib/python2.7/json/__init__.py", line 290, in load
    **kw)
    File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded
    ./unifi.sh: 217: ./unifi.sh: curl: not found
    Traceback (most recent call last):
    File "", line 1, in
    File "", line 1, in
    File "/usr/lib/python2.7/json/__init__.py", line 290, in load
    **kw)
    File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded
    {
    "data":[
    {"{#SITENAME}":"", "{#SITEDESC}":""}
    ]
    }
    ./unifi.sh: 47: ./unifi.sh: curl: not found

    ResponderExcluir
    Respostas
    1. Paulo,

      você adicionou o arquivo da API no local correto antes de executar? Qual versão de Unifi está utilizando?

      Excluir
  2. 2) Copie o arquivo unifi.sh para /etc/zabbix/ e unifi_sh_api para /usr/lib/unifi/bin/

    neste passo o caminho /usr/lib/unifi/bin/, não existe esta pasta unifi/bin no server. tem que criar correto?

    ResponderExcluir
    Respostas
    1. Mateus, esse é o caminho onde ficam os binários do unifi. Se no seu servidor for em outro local, altere.

      Abraço!

      Excluir