Utilizando a API do Zabbix com Python

Atualmente estou trabalhando em projeto de automatização com o Zabbix e por conta disso comecei a estudar a api do mesmo mais profundamente, estou utilizando um módulo para python que é mantido pela comunidade ou seja não é oficial mas é recomendado pelo pessoal do zabbix conforme o link anterior.
O módulo funciona perfeitamente para a versão 1.8 e para a versão 2.0 do zabbix e pode ser baixado através do github do projeto.

Nesse post vou mostrar como utilizar apenas algumas funções da api que são suficiente para acredito eu as funções mais básicas e utilizadas como a função host, hostgroup e template.

Primeiramente, devemos nos autenticar preferencialmente com a conta de admin ou alguma conta com permissão de escrita para poder realizar as alterações.
Lembrando que você deve colocar o módulo da api em algum path que o python reconheça, particularmente eu deixo o módulo no mesmo diretório em que o script que for utiliza-lo está.

Autenticação

from zabbix_api import ZabbixAPI

server = "http://zabbixserver.com" #Endereço ou Ip do servidor do zabbix
username = "admin"              #Usuário
password = "serverpassword"     # Senha

#Instanciando a API
zapi = ZabbixAPI(server = server, path="", log_level=6)
zapi.login(username, password)

Uma vez que estamos logados, podemos utilizar as funções do zabbix e realizar alterações ou simples consultas para visualizar hosts ou informações de hosts que já estejam adicionados no zabbix.

Host

Acredito que está seja a função mais útil, com ela podemos adicionar, remover, atualizar e obter informações dos hosts.
Veja no exemplo abaixo como obter uma lista dos hosts que já estão adicionados no zabbix com o módulo host.get


# Obtendo uma lista com os hosts que já estão no zabbix
hosts = zapi.host.get({"output": ["hostid","name"], "sortfield": "name"}) 

No exemplo acima eu utilizo a função host.get passando como parâmetros os dados que eu espero obter e o modo como devem estar classificados, percebam que a informação é passada em formato json, pois a api do zabbix é implementada em json-rpc

O output do comando acima será assim
 
>>> hosts
[{u'hostid': u'10147', u'name': u'Zabbix Server'},{u'hostid': u'10185',
u'name': u'Web Server'}, {u'hostid': u'10172', u'name': u'Mysql Zabbix server'}]

Uma lista contendo os hosts com seus respectivos ids e nomes.

Para adicionar um host utilizamos a função host.create

Veja o exemplo onde adicionamos um host em um determinado grupo e um template padrão.
 
zapi.host.create({"host": "Centos", 
                 "interfaces": [ {"type": "1",
                 "main": "1",
                 "useip": "1",
                 "ip": "19.168.0.1",
                 "dns": "",
                 "port": "10052"}],
                 "groups": [{ "groupid": "2"}],
                 "templates": [{ "templateid": "10001"}]})

Esse módulo é o que passamos mais informações e deve-se prestar atenção nos dados informados, por exemplo em host informamos o nome do host, em ip o ip do servidor, em port a porta que o agente está escutando no servidor, groupid é o id do grupo em que esse servidor irá pertencer no caso irá pertencer ao grupo Linux Servers, templateid o id do template que irá ser adicionado a esse host.

Para deletar um host a função utilizada é o host.delete  informando apenas o id do host que queremos deletar, lembrando que não tem como desfazer esse processo uma vez que o host é deletado não temos como reavê-lo sendo apenas possível adicionando manualmente. 


zapi.host.delete({"hostid": "10185"}

Se quisermos apenas desativar um host da monitoração sem remove-lo podemos utilizar a função host.update para alterar o status de um host informando seu id e o status que desejamos.

#Desativa a monitoração do Host
zapi.host.update({"hostid": "10099", "status": "1"})

#Ativa a monitoração do Host
zapi.host.update({"hostid": "10099", "status": "0"})

O status 1 significa desativado e o status 0 ativado. 

Com a função host.update podemos atualizar outras características do host, como o ip, o templateid etc. Leia a documentação para maiores informações.

Template

A função template possuí várias utilidades, com ela podemos criar templates, atualizar templates já existentes, remove-los e obter informações. Sua utilização é similar a função host, pois também dispõe das funções create, delete e update e por esse motivo irei apenas apresentar um exemplo, de como obter o id de um template pois ao meu ver é mais simples e lógico criar templates na interface web e apenas utilizar seu id para adiciona-lo em um host através da api.

Usaremos a função template.get para obter o id de um template informando seu nome.

id = zapi.template.get({"output": "shorten", 
                        "filter": { "host": "Template OS Linux"}})

#output
>>> id
[{u'templateid': u'10001'}]

Hostgroup

Com a função hostgroup também podemos realizar as ações de criar, atualizar e remover grupos,  irei apenas mostrar como obter o id e o nome dos grupos existentes, e claro você pode ver como realizar mais ações lendo a documentação.

Obtendo uma lista com o id e nomes dos grupos com a função hostgroup.get


#Obtendo lista dos hostgroup
hostgroups = zapi.hostgroup.get({"output": "extend", "sortfield": "name"})

#output do comando acima
>>> hostgroups
[{u'internal': u'0', u'groupid': u'2', u'name': u'Linux servers'},
 {u'internal': u'0', u'groupid': u'6', u'name': u'Windows servers'}]


A api funciona perfeitamente com a versão 2.0 do zabbix que é a que estou utilizando atualmente, portanto podem usar sem medo. 

Qualquer dúvida ou sugestão sinta-se livre para deixar um comentário.

6 Comentário(s) em “Utilizando a API do Zabbix com Python”

  1. Amigo. Estou me baseando nas suas orientações para testar o acesso a API do Zabbix com Python. Até consegui acessar. Mas estou penando com falta de exemplos. Como eu faria uma consulta para retornar um HOSTNAME baseado no ENDEREÇO IP. Imagine que temos o IP e queremos descobrir o Hostname. Pode ajudar? Obrigado.

    [Responder comentário]
  2. Boa noite Nelson,

    Como "hostname" você quer dizer o nome do host cadastrado no zabbix ou o hostname do sistema operacional do host?

    Caso queira obter o nome cadastrado no zabbix, primeiramente você deverá utilizar o método hostinterface.get para localizar o host pelo ip assim obtendo o 'hostid' desse host e com o método host.get obter o nome cadastrado no zabbix.

    Caso queira o hostname do sistema operacional, terá que utilizar o hostinterface.get também para obter o 'hostid' através do ip, e depois utilizar o método item.get para obter o item 'system.hostname' e assim pegar o hostname.

    Segue o código abaixo que fiz como exemplo para obter o nome cadastrado no zabbix e o hostname do sistema. Espero que te ajude.



    from zabbix_api import ZabbixAPI

    # Dados de acesso, do servidor do zabbix e o ip do host.
    SERVER = "http://localhost/zabbix"
    USER = "admin"
    PASSWD = "zabbix"
    HOST = "127.0.0.1"

    # Instância da api do zabbix
    zapi = ZabbixAPI(SERVER)
    zapi.login(USER, PASSWD)

    # Obter a interface do host pelo ip, para pegar o hostid
    host_interface = zapi.hostinterface.get({"output": ["hostid", "ip"],
    "filter": {"ip": HOST}})

    try:
    # Pegar o nome cadastrado no zabbix
    zabbix_name = zapi.host.get({"output": ["name", "hostid"],
    "hostids": host_interface[0]["hostid"]})

    # Pegar o hostname do sistema operacional
    hostname = zapi.item.get({"output": ["lastvalue", "hostid"],
    "hostids": host_interface[0]["hostid"],
    "filter": {"key_": "system.hostname"}})
    except IndexError:
    print("Host: %s não foi encontrado!" % HOST)

    print zabbix_name
    print hostname

    [Responder comentário]
  3. Muito legal a sua dica.

    Eu havia descobrido uma parte do que vc explicou. Fiz uma consulta que traz uma lista de Hosts. Segue o código:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    from zabbix_api import ZabbixAPI

    server = "http://monitor.ciasc.gov.br" #Endereço ou Ip do servidor do zabbix
    username = "username" #Usuário
    password = "senha" # Senha

    #Instanciando a API
    zapi = ZabbixAPI(server = server, path="", log_level=6)
    zapi.login(username, password)

    # Obtendo lista de hosts
    hosts = zapi.host.get({"output": ["hostid","name"], "sortfield": "hostid"})

    # Obtendo lista de endeços IP
    ip_hosts = zapi.hostinterface.get ({"output": ["hostid","ip"], "sortfield": "ip"})

    for x in hosts:
    item_number = x['hostid']
    for ip_vetor_item in ip_hosts:
    if ip_vetor_item["hostid"] == x['hostid']:
    ip_host = ip_vetor_item["ip"]
    print x['hostid'],x['name'],ip_host


    print "Total de Hosts no Zabbix.:",len(hosts)




    Vou testar sua sugestão de código. Outra hora eu critico. Obrigado pela ajuda por enquanto.


    Att.

    [Responder comentário]
  4. Amigo, estou tentando montar um relatórios personalizado com as informações coletadas via API, minha dificuldade está sendo a manipulações dos dados após os Gets. Não estou conseguindo fazer a decodificação usando o método json.loads(). Alguma dica?

    [Responder comentário]
  5. Olá George, o retorno do get geralmente é uma lista, com os objetos já no formato do dicionário do python, a própria lib em python já converte o json quando usamos o get, basta acessar os dados passando a chave para a lista ex: variavel_lista['d'], lembrando que você pode verificar as chaves disponíveis assim: variavel_lista.keys()

    [Responder comentário]

Deixe um comentário