Pular para o conteúdo principal

Primeiros passos com API do Zabbix

Bom galera,

Faz tempo que não posto nada sobre Zabbix. Então, quis presentear vocês com um conteúdo mais avançado. Espero que ao menos 1 vez por mês coloco mais assuntos como esse no blog.

Vou mostrar para vocês como utilizar a API do Zabbix.

Antes vou explicar de forma básica o que API para os que não sabem do que se trata. Programadores tem a obrigação de saber.  :P

- API - Application Programming Interface - é um conjunto de rotinas e padrões estabelecidos por um software. Isso permite que aplicações de terceiros utilizem as funcionalidades oferecidas pelo software.


A API do Zabbix permite recuperar e modificar a configuração do Zabbix via programação e fornece acesso a dados históricos. É amplamente utilizado para:

  • Criar novas aplicações para trabalhar com Zabbix
  • Integrar Zabbix com softwar de terceiros
  • Automatizar tarefas de rotina

Obs.: Não é o meu objetivo detalhar como funciona a estrutura da API do Zabbix. Isso é assunto para quem deseja desenvolver uma biblioteca para trabalhar com a API do Zabbix. Para uma explicação mais detalhada, sugiro a leitura do próprio manual do Zabbix que aborda esse conteúdo. https://www.zabbix.com/documentation/2.4/manual/api]https://www.zabbix.com/documentation/2.4/manual/api

Esse conteúdo aqui está focado em quem deseja ter o mínimo de esforço para utilizar uma biblioteca já pronta e usufruir dos métodos disponibilizados pela API do Zabbix.

A própria documentação do Zabbix sugera que você use bibliotecas que trabalham com a API do Zabbix para desenvolvimento de Aplicações. Este é o meu caso e vou demonstrar para vocês como utilizar a API do Zabbix com uma biblioteca escrita em Python. Para outras linguagens, acesse http://zabbix.org/wiki/Docs/api/libraries]http://zabbix.org/wiki/Docs/api/libraries


Vamos começar.

Instale o pacote python-pip

Debian e derivados


apt-get install python-pip

ou

Red Hat e derivados


yum install python-pip

Instale a biblioteca zabbix-api (mesmo comando para qualquer distribuição)

pip install zabbix-api


O código abaixo vai montar a parte do código essencial para você se conectar a interface Web do Zabbix, que é o canal por onde a API do Zabbix disponibiliza as informações.

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 27 12:50:18 2015

@author: Janssen dos Reis Lima
"""
from zabbix_api import ZabbixAPI

zabbix_server = "http://xxx.xxx.xxx.xxx/zabbix" #Endereço ou IP ou FQDN do servidor do Zabbix.
username = "admin" #Informe usuário para acessar. Usuário com perfil de administrador do Zabbix, não necessáriamente o 'admin' padrão.
password = "zabbix" #Senha

#Instanciando a API
conexao = ZabbixAPI(server = zabbix_server, log_level=6)
conexao.login(username, password)

Obs. 1: Essa é a vantagem do uso da API, pois não precisamos fazer scripts mirabolantes para pegar a informação diretamente na base de dados (o que também não é muito seguro  :-X).
Obs. 2: Experimente retirar o parâmetro log_level=6, removendo também a ',' antes do mesmo. O retorno será apenas dos valores que serão consultados, e não no formato JSON.

Agora vamos incrementar o código para  uma consulta simples da versão da API do Zabbix. Copie o código abaixo e salve como consulta_api_zabbix.py (use o nome que quiser  ;))

versao = conexao.api_version()
print "Versão do Zabbix Server: ", versao

Para finalizar, vou demonstrar como pegar a lista dos hosts cadastrados no Zabbix informando a disponibilidade do Zabbix Agent, o ID do host e seu nome. Adicione o seguinte código ao arquivo criado:

hosts = conexao.host.get({"output": "extend", "sortfield": "name"})
for x in hosts:
    print x['available'], "-", x['hostid'], "-", x['name']

Para executar o script executa no Shell do Linux:

python consulta_api_zabbix.py

O Resultado da execução do script será o seguinte:

Versão do Zabbix Server:  2.4.1
0 - 10112 - JBoss
1 - 10105 - AmaxonEC2
0 - 10113 - Tomcat
2 - 10108 - Windows
1 - 10084 - Zabbix server

É isso aí galerinha do Zabbix. Aproveitem a imaginação para que possam tirar todo o proveito que a API do Zabbix disponibiliza. Na próxima semana vou mostrar para vocês como damos um ACK em um evento do Zabbix através do uso da API.

Comentários

  1. Janssen, estou com problemas para instalar o pacote "zabbix-api" usando o pip. O comando retorna um erro que copio abaixo.

    "Cannot fetch index base URL https://pypi.python.org/pypi/
    Could not find any downloads that satisfy the requirement zabbix-api
    Cleaning up...
    No distributions at all found for zabbix-api"

    Já viu algo parecido?

    ResponderExcluir
  2. Janssen, existe alguma diferença na programação para a versão 3 do Zabbix ?
    Fiz o teste como no tutorial e apareceu algumas mensagens de json.

    ResponderExcluir
    Respostas
    1. Em geral não. Alguns métodos que foram adicionados. Mostra as mensagens que retornaram.

      Excluir
    2. Vi aqui que é por causa do log_level, qual o caminho do arquivo para fazer a alteração que vc propõe ?

      Excluir
  3. Estou com o seguinte erro ao instalar api do zabbix:

    [root@ap-zabbix-des tmp]# pip install zabbix-api
    Collecting zabbix-api
    Could not fetch URL https://pypi.python.org/simple/zabbix-api/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:765) - skipping
    Could not find a version that satisfies the requirement zabbix-api (from versions: )
    No matching distribution found for zabbix-api

    Versão do python:

    [root@ap-zabbix-des tmp]# python --version
    Python 2.7.5

    Versão do zabbix:

    [root@ap-zabbix-des tmp]# zabbix_server --version
    zabbix_server (Zabbix) 3.2.1
    Revision 62890 30 September 2016, compilation time: Oct 3 2016 04:57:19

    Copyright (C) 2016 Zabbix SIA
    License GPLv2+: GNU GPL version 2 or later .
    This is free software: you are free to change and redistribute it according to
    the license. There is NO WARRANTY, to the extent permitted by law.

    ResponderExcluir
  4. Janssen, esse erro parece que é corriqueiro né,

    Cannot fetch index base URL https://pypi.python.org/simple/
    Could not find any downloads that satisfy the requirement zabbix-api
    Cleaning up...
    No distributions at all found for zabbix-api
    Storing debug log for failure in /root/.pip/pip.log

    dados: pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

    ResponderExcluir
  5. boa tarde, Janssen

    Tem algum passo para criar configurar código para conectar a interface Web do Zabbix?

    ResponderExcluir
  6. Boa tarde. Quando executo retorna o seguinte erro:

    [root@localhost ~]# python consulta_api_zabbix.py
    Traceback (most recent call last):
    File "consulta_api_zabbix.py", line 18, in
    versao = conexao.api_verson()
    TypeError: 'ZabbixAPISubClass' object is not callable


    Pode ajudar? Obrigado.

    ResponderExcluir
  7. Esse é o Jansen, o cara do Zabbix, já comprei seu livro. Força e Honra!

    ResponderExcluir
  8. Janssen, utilizo a API para criar algumas tarefas, como criar webcenários e testes. Isso está funcionando ok.
    Porém, estou tentando utilizar o Python para criar Hosts. Mas não está funcionando...
    Abaixo o código:

    # -- coding: utf-8 --
    import sys, logging, json
    from pyzabbix import ZabbixAPI

    stream = logging.StreamHandler(sys.stdout)
    stream.setLevel(logging.DEBUG)
    log = logging.getLogger('pyzabbix')
    log.addHandler(stream)
    log.setLevel(logging.DEBUG)

    print 'Logando...'
    zapi = ZabbixAPI("ServidorZabbix")
    zapi.login("user", "senha")
    print 'Logado com sucesso! #############'


    #----------------------------------------
    # Criar servidor
    #----------------------------------------

    zapi.host.create({"host": "teste",
    "interfaces": [ {"type": "1",
    "main": "1",
    "useip": "1",
    "ip": "endereçoipvalido",
    "dns": "",
    "port": "10052"}],
    "groups": [{ "groupid": "0"}],
    "templates": [{ "templateid": "10930"}]
    })



    /////////// A saída com o erro é essa:


    Logando...
    JSON-RPC Server Endpoint: Servidorzabbix/api_jsonrpc.php
    Sending: {
    "params": {
    "password": "senha",
    "user": "usuario"
    },
    "jsonrpc": "2.0",
    "method": "user.login",
    "id": 0
    }
    Response Code: 200
    Response Body: {
    "jsonrpc": "2.0",
    "result": "c8572580a3fa014eda8f4123ba8e2b18",
    "id": 0
    }
    Logado com sucesso! #############
    Sending: {
    "params": [
    {
    "templates": [
    {
    "templateid": "10930"
    }
    ],
    "host": "teste",
    "interfaces": [
    {
    "ip": "endereçoipvalido",
    "useip": "1",
    "dns": "",
    "main": "1",
    "type": "1",
    "port": "10052"
    }
    ],
    "groups": [
    {
    "groupid": "0"
    }
    ]
    }
    ],
    "jsonrpc": "2.0",
    "method": "host.create",
    "auth": "c8572580a3fa014eda8f4123ba8e2b18",
    "id": 1
    }
    Response Code: 200
    Response Body: {
    "jsonrpc": "2.0",
    "id": 1,
    "error": {
    "message": "Application error.",
    "code": -32500,
    "data": "No permissions to referred object or it does not exist!"
    }
    }
    Traceback (most recent call last):
    File "criaservidor.py", line 37, in
    "templates": [{ "templateid": "10930"}]
    File "/usr/lib/python2.7/site-packages/pyzabbix/__init__.py", line 157, in fn
    args or kwargs
    File "/usr/lib/python2.7/site-packages/pyzabbix/__init__.py", line 134, in do_request
    raise ZabbixAPIException(msg, response_json['error']['code'])
    pyzabbix.ZabbixAPIException: (u'Error -32500: Application error., No permissions to referred object or it does not exist!', -32500)




    Alguma dica?

    Obrigado!!!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Integração Zabbix + GLPI

Versão atualizada Essa atualização é em consequência de pedidos vindo dos gringos e também a pedido da Zabbix SIA por ser o 4.º conteúdo mais popular no recém criado  https://share.zabbix.com/  e o 1.º entre os brasileiros.   Para conferir a lista dos mais populares, acesse  https://share.zabbix.com/popular Há um tempo que eu queria desenvolver algo para integrar o Zabbix a algum outro sistema. Esse ano surgiu uma oportunidade de implementação de alguns sistemas de inventário e gerenciamento de chamados. Logo pensei em fazer uma integração para abertura e fechamento automático dos tickets quando ocorresse algum problema que o Zabbix identificasse. Porém, o meu entusiasmo foi logo caindo quando eu percebi que não era uma coisa tão trivial de se fazer. Pesquisei várias fontes em busca de informações a respeito dessa integração, porém não passavam de tutoriais ensinando como abrir tickets no GLPI enviando um e-mail. Estudando mais um pouco o GLPI, percebi que não era possível

Usando LSOF para verificar porta usada por determinado processo

Outro dia fui realizar alguns testes em aplicações rodando no JBoss e verifiquei que nenhuma aplicação estava funcionando. Verifiquei no log do JBoss que o serviço iniciava e ocorria vários erros, informando que não conseguia fazer o deploy das aplicações. Mesmo parando o serviço do JBoss, verifiquei com a ferramenta nmap que a porta 8080 continuava aberta.