Buscar

Consumindo a API do Zabbix com Python - anssen dos Reis Lima

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 102 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

criadordoZabbix! 
.,. ~ASPORT 
• ... !151 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Janssen dos Reis Lima 
Consumindo a 
API doZabbix 
comPython 
Prefácio de Alexei Vladishev criador do Zabbixl 
., ~SPORT 
** " 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Copyr.ight© 2016 por Brasport Livros e Multimídia Ltda. 
Todos os direitos reservados. Nenhuma parte deste livro poderá ser 
reproduzida, sob qualquer meio, especialmente em fotocópia (xerox), 
sem a permissão, por escrito, da Editora. 
Para uma melhor visualização deste e-book sugerimos que mantenha 
seu software constantemente atualizado. 
Editor: Sergio Martins de Oliveira 
Diretora Editorial: Rosa Maria Oliveira de Queiroz 
Gerente de Produção Editorial: Marina dos Anjos Martins de Oliveira 
Editoração Eletrônica: SBNigri Artes e Textos Ltda. 
Capa: Trama Criações 
Produçao de e-pub: SBNigri Artes e Textos Ltda. 
Técnica e muita atenção foram empregadas na produção deste livro. 
Porém, erros de digitação e/ou impressão podem ocorrer. Qualquer 
dúvida, inclusive de conceito, solicitamos enviar mensagem para 
brasport@brasport.com.br, para que nossa equipe, juntamente com o 
autor, possa esclarecer. A Brasport e o(s) autor(es) não assumem 
qualquer responsabilidade por eventuais danos ou perdas a pessoas 
ou bens, originados do uso deste livro. 
ISBN Digital: 978-85-7452-781-9 
BRASPORT Livros e Multimídia Ltda. 
Rua Pardal Mallet, 23 - Tijuca 
20270-280 Rio de Janeiro-RJ 
Tels. Fax (21) 2568.1415/2568.1 507 
e-mails: 
marketing@brasport.com.br 
vendas@brasport.com.br 
editorial@brasport.com.br 
site: www.brasport.com.br 
Filial 
Av. Paulista, 807 - conj. 915 
01311-100- São Paulo-SP 
Con sumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Agradecimentos 
Agradeço principalmente a Deus, por me dar forças para que eu 
conseguisse ter calma e paciência para concluir este projeto. Foram 
longas noites dedicadas a este trabalho. 
A minha esposa Carla, por toda a sua dedicação e carinho que 
tem pela nossa família. Agradeço de coração por sempre me 
incentivar nos meus estudos e por compreender minha ausência 
em certos momentos. Você é muito especial. 
Agradeço também à equipe de desenvolvimento do Zabbix, não 
apenas por manter esta excelente ferramenta em constante 
atualização, mas também por mantê-la bem documentada, 
sobretudo a parte da API. 
Agradeço também ao editor da Brasport, Sergio Martins, e à 
gerente de produção editorial, Marina, por acreditarem no meu 
trabalho e terem me dado mais uma oportunidade de publicar outro 
livro. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
O todo é maior do que a simples soma das suas parles. 
(Aristóteles) 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Apresentação 
A API do Zabbix permite recuperar e modificar configurações do 
ambiente de monitoramento, além de fornecer acesso a dados 
históricos. Ela pode ser utilizada tanto por profissionais de 
infraestrutura como por desenvolvedores. 
Para profissionais de infraestrutura que já dominam a ferramenta, 
o uso da API se faz necessário para automatizar tarefas rotineiras, 
com o propósito de acelerar a execução dessas tarefas e diminuir 
as probabilidades de configurações incorretas. Já o uso da API 
para desenvolvedores se dá pela necessidade de gerar novas 
aplicações e emitir relatórios personalizados para a área gerencial, 
devido ao fato de a ferramenta não disponibilizar isso por meio da 
sua interface web. 
Sabemos que, em muitos casos, o departamento de TI é visto 
como burocrático e sempre trabalhando na parte operacional. Em 
vez de ficar apenas na resolução de problemas e na 
implementação de novas tecnologias, esse departamento pode 
disponibilizar dados sobre o negócio através do monitoramento do 
ambiente, para que a área gerencial possa consumir esses dados 
com os relatórios e tomar decisões através das informações 
obtidas. Isso vai transformar o departamento de TI em uma 
plataforma de negócios, pois irá assumir um papel estratégico e, ao 
mesmo tempo, será visto como um departamento que agrega valor 
ao negócio, e não apenas como um que opera a tecnologia. 
Esta obra apresentará a API do Zabbix e tentará passar aos 
leitores como utilizar os métodos disponibilizados pela API para 
gerar seus próprios relatórios e integrar o Zabbix com outras 
ferramentas. Serão demonstrados exemplos práticos de como 
utilizar os métodos e como formatar a saída das requisições para 
serem usadas em relatórios. O objetivo principal da API do Zabbix 
não é desenvolver dashboards, e sim entregar informações 
requisitadas através da utilização dos métodos. Para fazer 
dashboards você terá que possuir habilidades de desenvolvimento 
web, passando as informações consumidas pela API para exibir 
nesses sistemas. Portanto, não desanime se você chegou até aqui 
achando que ao utilizar a API do Zabbix você iria desenvolver um 
dashboard. A API é mais que isso. Ela permite que você estenda e 
potencialize o uso dos serviços disponibilizados pela ferramenta. 
Resolvi escrever este livro após ter lançado o curso 
"Programação com a API do Zabbix", que teve uma grande 
repercussão na comunidade. Por conta disso, vi que não eram 
poucas as pessoas com interesse em aprender a API do Zabbix, 
haja vista que não temos documentação sobre o assunto na língua 
portuguesa. 
Espero que os leitores tirem proveito das informações aqui 
apresentadas e consigam explorar ao máximo os recursos 
fornecidos pela API do Zabbix e desenvolvam seus próprios 
produtos, sejam eles relatórios ou integrações. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Sobre o Livro 
Este livro está dividido em 11 capítulos: 
)> Visão Geral: neste capítulo serão apresentadas informações 
básicas sobre a API do Zabbix, sua estrutura e funções 
fornecidas, além de uma rápida passagem sobre JSON. 
)> Bibliotecas: neste capítulo veremos como preparar o 
ambiente para o desenvolvimento dos nossos códigos e com 
qual biblioteca da API do Zabbix trabalharemos. 
)> Primeiros Passos: neste capítulo teremos o nosso primeiro 
contato com uma requisição à API do Zabbix. 
)> Referências e Notações: este capítulo apresentará os tipos 
de dados que são suportados pela API do Zabbix. 
)> Classes e Métodos da API: neste capítulo veremos alguns 
métodos disponíveis na API do Zabbix. Em todos os métodos 
veremos exemplos práticos de consumo de dados da API. 
)> Ferramentas para Formatação e Validação de JSON: este 
capítulo apresentará algumas ferramentas para a formatação 
das requisições no formato JSON, para que o código fique 
mais limpo e de fácil leitura. 
)> Formatando a Saída das Requisições: neste capítulo 
aprenderemos como formatar as saídas das requisições, com 
o objetivo de consumir os valores dos objetos da API. 
)> Automatizando Tarefas: neste capítulo veremos exemplos 
práticos que irão lhe garantir um tempo extra na execução de 
suas tarefas. 
)> Gerando Relatórios: mais um capítulo de exemplos práticos 
mostrando a geração de alguns relatórios com os dados 
consumidos da API. 
)> Dicas de Projetos com a API: este capítulo visa discutir 
ideias para projetos com a API do Zabbix e também 
apresentar algumas bibliotecas que serão úteis no 
desenvolvimento desses projetos. 
)> Dicas Importantes: este capítulo fecha o livro com algumas 
dicas que não podem ser ignoradas e que irão ajudar o leitor 
a buscar mais informações para se aperfeiçoar na API do 
Zabbix. 
Configurações e versões 
Todos os testes e comandos mostrados nesta obra foram 
executados nas seguintes configurações de sistema: 
)> Processador: Intel Core i7 
)> Memória: 8 GB 
)> Sistema operacional: Debian 8 64 bits 
)> Kemel: 3.1 .1.1 
)> versão do Python: 2.7.9 
)> Versão do Zabbix: 2.4.6 
Reprodução de testes e comandos 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Os testes e comandos propostos nesta obra devem ser 
executados comextrema cautela e não é recomendado reproduzi-
los em ambientes de produção, haja vista que muitos dos 
comandos são usados para demonstrar alterações de 
configurações no ambiente usando a API do Zabbix. 
Portanto, recomendo criar um ambiente de testes para executar 
os comandos e códigos demonstrados nesta obra. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Sobre o Autor 
Janssen dos Reis Lima possui 18 anos de experiência na área 
de TI. Bacharel em Sistemas de Informação pela FeMASS/UFF, 
especialista em Administração em Redes Linux pela UFLA e 
mestrando em Sistemas Computacionais pela UFF. Atualmente 
ocupa o cargo de Analista de Sistemas no Grupo de Inferência de 
Reservatório, no LENEP/UENF. Utiliza Python como ferramenta de 
desenvolvimento e pesquisa. Fundou a empresa Conectsys, 
especializada em treinamentos, consultoria e suporte técnico em 
Zabbix, tendo lançado cursos exclusivos de programação com API 
do Zabbix e API do Zabbix para Sysadmin. Possui especial 
interesse em computação de alto desempenho, gerência de redes e 
virtualização, sempre trabalhando com software open source. É 
autor do livro "Monitoramento de Redes com Zabbix", também 
publicado pela Brasport. 
Con sumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Prefácio 
Dear .readers, 
Zabbix is a well-known open source enterprise level monitoring 
solution. The word "enterprise" means that Zabbix can be easily 
integrated with third party systems and may co-exist nicely with 
other platforms. Undoubtedly, Zabbix API is the most important 
functionality when it comes to implementation of integration plans. 
The API plays a major role in any automation logic by allowing to 
communicate with Zabbix not only from higher levei languages like 
Java, Perl, Python, Go, but also doing direct API calls from 
command line. 
The book describes Zabbix API in great details and provides 
numerous examples on how to get most of the API. 1 am sure that 
the book will be a great help for those wanting to bring use and 
understanding of Zabbix to the next level. 
A lexei Vladishev, creator of Zabbix 
TRADUCÃO: 
Caros leitores, 
Zabbix é uma solução open source de monitoramento de nível 
empresarial bem conhecida. O termo "empresarial" significa que 
Zabbix pode ser facilmente integrado com sistemas de terceiros e 
pode coexistir muito bem com outras plataformas. Sem dúvida, a 
API do Zabbix é a funcionalidade mais importante quando se trata 
de execução de planos de integração. A API desempenha um papel 
importante em qualquer lógica de automação, permitindo que se 
comunique com Zabbix não apenas a partir de linguagens de alto 
nível, como Java, Perl, Python, Go, mas também fazendo 
chamadas diretas à API a partir de linha de comando. 
O livro descreve a API do Zabbix em grandes detalhes e fornece 
inúmeros exemplos de como extrair o máximo da API. Tenho 
certeza de que o livro vai ser uma grande ajuda para aqueles que 
querem levar o uso e a compreensão do Zabbix para o próximo 
nível. 
Alexei Vladishev, criador do Zabbix 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Sumário 
Introdução 
1. Visão Geral 
1.1. API do Zabbix 
1.2. Estrutura 
1.3. Funções fornecidas pela API 
1.3.1. Monitoramento 
1.3.2. Configuração 
1.3.3. Administração 
1.3.4. Informação da API 
1.4. Execução das requisições 
1.5. Um pouco sobre JSON 
2. Bibliotecas 
2.1 . Vantagens de usar uma biblioteca 
2.2 . Qual biblioteca escolher? 
2.3. Preparando o ambiente para 
desenvolvimento em Linux 
2.4. Preparando o ambiente para 
desenvolvimento em Windows 
2.5. Biblioteca zabbix-api 
2.5.1 . Ambiente Linux 
2.5.2. Ambiente Windows 
3. Primeiros Passos 
3.1. Criando usuário para acessar a API 
3.2. Montando a estrutura padrão 
3.3. Obtendo IDs e nomes dos hosts 
3.4. Organizando os dados 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
4. Referências e Notações 
4.1. Etiquetas de propriedades 
4.2. Objetos 
4.3. Parâmetros comuns do método "get" 
5. Classes e Métodos da API 
5.1. API lnfo 
5.1.1. Referências do objeto 
5.1.2. Métodos disponíveis 
5.1.2.1. apiinfo.version 
5.2. Host 
5.2.1. Referência do objeto 
5.2.2. Métodos disponíveis 
5.2.2.1. host.create 
5.2.2.2. host.massadd 
5.2.2.3. host. isreadable 
5.3. Host Group 
5.3.1. Referências do objeto 
5.3.2. Métodos disponíveis 
5.3.2.1. hostgroup.delete 
5.3.2.2. hostgroup.massupdate 
5.4. Template 
5.4.1. Referências do objeto 
5.4.2. Métodos disponíveis 
5.4.2.1. template.update 
5.4.2.2. template.massremove 
5.5. Item 
5.5.1. Referências do objeto 
5.5.2. Métodos disponíveis 
5.5.2.1. item.update 
5.6. Trigger 
5.6.1. Referências do objeto 
5.6.2. Métodos disponíveis 
5.6.2.1. trigger.adddependencies 
5.7. History 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
5.7.1. Referências do objeto 
5.7.2. Métodos disponíveis 
5.7.2.1. history.get 
5.8. Event 
5.8.1. Referências do objeto 
5.8.2. Métodos disponíveis 
5.8.2.1. event.get 
5.8.2.2. event.acknowledge 
5.9. Alert 
5.9.1. Referências do objeto 
5.9.2. Métodos disponíveis 
5.9.2.1. alert.get 
5.1 O. lt Service 
5.10.1. Referências do objeto 
5.10.2. Métodos disponíveis 
5.10.2.1. service.getsla 
6. Ferramentas para Formatação e Validação 
de JSON 
6.1. Zapix 
7. Formatando a Saída das Requisições 
7.1. Formatando a saída da requisição do 
exemplo mostrado no tópico 5.7.2.1 
7.2. Formatando a saída de requisições que se 
relacionam 
7.3. Convertendo datas 
8. Automatizando Tarefas 
8.1 . Desabilitar automaticamente itens não 
suportados 
8.2 . Cadastrar hosts automaticamente a partir 
de uma lista em arquivo 
8.3. Montar árvore de serviços de TI 
automaticamente 
8.3.1. Função obterGrupos 
8.3.2. Função obterGrupold 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
8.3.3. Função obterHosts 
8.3.4. Função obterHostld 
8.3.5. Função obterTriggersHosts 
8.3.6. Função obterltens 
8.3.7. Função obterltemTriggerld 
8.3.8. Função criarServicosPai 
8.3.9. Função obterServicosPai 
8.3.1 O. Função criarServicosFilho 
8.3.11. Função obterServicosFilho 
8.3.12. Função criarltensServicos 
8.3.13. Função obterServicos 
8.3.14. Função removerArvoreServicos 
8.3.15. Função criarArvoreServicos 
9. Gerando Relatórios 
9.1. Relatório de itens não suportados 
9.2. Relatório de agentes do Zabbix 
desatualizados 
9.3. Relatório top 1 O CPU 
9.4. Relatório dos incidentes não resolvidos 
1 O. Dicas de Projetos com a API 
10.1. Integração com software de terceiros 
10.2. Geração de gráficos e relatórios em PDF 
10.2.1. Matplotlib 
10.2.2. Bokeh 
10.2.3. Reportl ab 
10.2.4. PyGal 
10.3. Envio de relatórios por e-mail 
11. Dicas Importantes 
11.1. Habilitando o log da biblioteca zabbix-api 
11.2. Timeout das requisições 
11.3. Procure threads em fóruns e listas de 
discussão 
11.4. Leia a documentação oficial 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Referências Bibliográficas 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Introdução 
API (Applícatíon Programmíng Interface) é uma forma simples de 
prover serviços em um formato comum e de fácil entendimento. 
Apesar de seu uso ser comum na comunidade de desenvolvedores, 
qualquer indivíduo com conhecimento básico de programação pode 
se aventurar em utilizar uma API. 
Seja qual for a necessidade, desde uma simples integração para 
autenticação de um site com uma rede social, passando por uma 
plataforma de pagamentos integrada a uma loja virtual até a 
emissão de relatórios gerenciais em um sistema interno de uma 
empresa, tudo isso é possível porque uma API é composta por uma 
serie de métodos e funções que permitem utilizar as 
funcional idades de um software sem a necessidade de conhecer a 
sua implementação, como, por exemplo, em que linguagem de 
programação foi desenvolvida, como é a estrutura da base de 
dados etc. Portanto, ao utilizaruma API, estamos apenas 
interessados em consumir os serviços disponibilizados pela 
aplicação, seja para integrar com software de terceiros, automatizar 
rotinas ou criar novas aplicações. 
Resumindo, uma aplicação que disponibiliza uma API abre portas 
para novos mercados e permite o desenvolvimento de novos 
produtos e serviços. 
Alguns exemplos típicos de uso de uma API: 
)> Permitir a geração de relatórios customizados a partir dos 
dados do sistema. 
)> Integrar uma loja virtual com uma plataforma de pagamento 
para que o processo seja transparente para o usuário. 
)> Monitorar a audiência da empresa em redes sociais: quantas 
curtidas, quantos comentários etc. 
)> Entre outros. 
Nesta obra o leitor aprenderá a consumir a API do Zabbix com a 
linguagem de programação Python. Portanto, nem todos os 
exemplos citados anteriormente aplicam a API do Zabbix. 
Con sumindo a API do Zabbix com Python - Janssen dos Reis Lima 
1 
Visão Geral 
A API do Zabbix foi introduzida a partir da versão 1.8. Uma das 
vantagens em utilizar a API do Zabbix é estender as possibilidades 
criadas pelo armazenamento dos dados coletados em sua base de 
dados. E uma dessas possibilidades inclui a emissão de relatórios 
personalizados que não estão presentes em sua interface web. 
Assim como desenvolvedores poderão tirar proveito da API, 
administradores de sistemas também poderão utilizá-la para 
automatizar tarefas repetitivas e ganhar um extra de seu precioso 
tempo. 
1.1. API do Zabbix 
A API do Zabbix permite recuperar e modificar configurações do 
Zabbix via programação, além de fornecer acesso a dados 
históricos. 
É amplamente utilizado para: 
)> Criar novas aplicações para trabalhar com Zabbix. 
)> Fazer integração com software de terceiros. 
)> Automatizar tarefas rotineiras. 
A API do Zabbix é baseada na web e é fornecida como parte da 
interface web. A imagem a seguir mostra onde a API do Zabbix está 
presente em sua arquitetura. 
Interface do 
, . 
usuano 
1 , 
Frontend API 
Zabi 
Servidor Web 
,.- -....... 
.......__ _,, 
- -,. SGBD ~ 
Para utilizar a API, é preciso que a interface web do Zabbix esteja 
disponível. Uma vez que o usuário invoque um método da API, o 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Zabbix se encarrega de obter os dados ou executar processos de 
acordo com o método utilizado. 
A API do Zabbix utiliza o protocolo JSON-RPC 2.0 e consiste em 
um conjunto de métodos separados que são usados para fazer 
requisições e receber respostas, ambas codificadas usando o 
formato JSON. 
Mais informações sobre o protocolo JSON podem ser 
encontradas na página de especificação do protocolo, disponível 
em http://www.jsonrpc.org/specification, e na página de introdução 
ao formato JSON, disponível em http://json.org/. 
A seguir, um exemplo de requisição no formato JSON: 
"j sonrpc": "2. O", 
"met hod": "user.login", 
" p arams": { 
} I 
"user": "Adrnin", 
"password": "zabbix" 
"id ": 1, 
"auth": nul l 
E um exemplo de resposta no formato JSON: 
" j sonrpc": "2. O", 
"result": "0424bd59b807674191e7d77572075f33", 
" id" : 1 
O diagrama a seguir representa o fluxo de dados de requisição à 
API do Zabbix: 
Interface do 
usuário 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
L user.login > 
Token de auten~ 
[ host.get > 
Ustqem dos hosts 
Outros métodos 
[User.logout > 
--------reGjuisição, no qual receberemos a listagem com os dados dos 
ob{etos requisitados, ou seja, uma listagem com os hosts 
cailastrados no Zabbix. Caso não seja invocado outro método, a 
seI
1 
são deverá ser finalizada com o método user.logout. 
J ntes da implementação da API do Zabbix, não existia nenhuma 
ferramenta para controlar o Zabbix fora da interface web, exceto 
executar consultas diretamente na base de dados, o que não é 
mJito seguro. 
ZABBIX 
API 
1 .. Estrutura 
t API consiste em métodos que são nominalmente agrupados 
e"l APls separadas, também referenciadas como classes. Cada 
método executa uma tarefa específica. Por exemplo, o método 
hoÍ1st.create pertence à classe host e é usado para criar novos 
ho ts. 
maioria das classes contém pelo menos quatro métodos: get, 
cryate, update e detete para recuperar, criar, atualizar e excluir 
da~os , mas algumas das APls podem fornecer um conjunto 
totr lmente diferente de métodos. 
t estrutura completa de todas as APls disponibilizadas pelo 
Zar bix é encontrada na URL https://www.zabbix.com 
/d~cumentation/2 .4/manual/api , onde são mostradas em árvore as 
re_frências dos métodos. A figura a seguir exibe a listagem com 
--------tõêlas as classes disponíveis na API do Zabbix: 
A autenticação (método user.login) é um passo obrigatório para 
obter o token de autenticação. Com o token de autenticação, 
teremos a permissão de invocar qualquer método fornecido pela 
API. Na imagem do fluxo de dados, o método host.get é uma nova 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
B ·17. API 
1 é Method reference 
m Actioo 
m Alert 
r:b- API lnfo 
f!!-Appllcation 
!B- Configuration 
&Oiscovered host 
E!I Discovered service 
m Discovery ched 
e Oisw11erv rule 
1&-E11ent 
m Gr.iph 
IB Graph item 
E!J-Graph prototvpe 
~Hístorv 
ffi..Host 
m- Host group 
m- Host interface 
r:b- Host prototype 
IB lcon map 
E!l-lmage 
&Item 
1±1-Rem prototype 
oo- rr service 
ei UD rule 
fB Maintenance 
ijrMap 
IB Media 
&Media tvpe 
& Proxy 
rB Screen 
~Screen Item 
fil S<rlpt 
r:b- Template 
m- Template screen 
00-Template screen item 
&Tngger 
& Trlgger prototype 
&User 
s-User group 
e-user macro 
m Web scenarlo 
. - Appendlx 1. Reference coou» 
f....Appendix 2. Changes from 2 .. 
L_zabbix API changes in 2.4 
1.3. Funções fornecidas pela API 
Neste tópico, teremos uma visão geral sobre as funções 
fornecidas pela API. As funções são as seguintes: 
)> Monitoramento 
)> Configuração 
)> Administração 
)> Informação da API 
1.3.1. Monitoramento 
Esta função nos permite ter acesso ao histórico e a outros dados 
recolhidos durante o monitoramento. Podemos recuperar: 
)> Dados históricos: 
o Obter dados para apresentação ou processamento 
adicional. 
)> Eventos: 
o Obter eventos para um gerenciamento mais flexível ou 
o Integrar com ferramentas de terceiros. 
)> Monitoramento de serviços: 
o Obter informações sobre disponibilidade de qualquer 
serviço de TI (SLA). 
Podemos associar esta função ao menu Monitoring da interface 
web do Zabbix, exibido na imagem a seguir: 
1.3.2. Configuração 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Esta função nos permite gerenciar a configuração de 
monitoramento do sistema, como: criar, atualizar, configurar, 
habilitar/desabilitar, associar/desassociar etc. Podemos gerenciar: 
)- Hosts e grupos de hosts 
)- Itens e aplicações 
)- Trigger 
)- Gráficos 
)- Templates 
)- Exportação e importação 
)- Descoberta de baixo nível (low-/eve/ discovery- LLD) 
)- Telas (screens) 
)- Ações e alertas 
)- Serviços de TI 
)- Mapas 
> Monitoramento web 
)- Descoberta de rede (network discovery) 
Podemos associar esta função ao menu Configuration da 
interface web do Zabbix, exibido na imagem a seguir: 
o Configurar tipos de mídia. 
o Maneiras como o usuário receberá alerta etc. 
> Geral: 
o Alertar para configurações globais do sistema. 
)- Proxies: 
o Gerenciar proxies utilizados na configuração do 
monitoramento. 
)- Scripts: 
o Configurar e executar scripts para ajudar em tarefas 
pontuais. 
Podemos associar esta função ao menu Administration da 
interface web do Zabbix, exibido na imagem a seguir: 
1.3.4. Informação da API 
Esta função nos permite obter a versão da API do Zabbix, cujos 
recursos específicos podem ser utilizados por uma aplicação. A 
partir da versão 2.0.4 do Zabbix, a versão da API equivale à mesma ..... ~~~~~~~~~~~~~--~--. 
1.3.3. Administração 
Esta função nos permite alterar configurações da administração 
do sistema. Podemos manipular configurações de: 
suários:o Atribuir grupos e conceder permissões. 
ver.são do Zabbix que estiver em execução em seu servidor. 
1.4. Execução das requisições 
Uma vez que você configura a interface web, você pode usar 
requisições HTTP para chamar a API. Para fazer isso, você precisa 
enviar solicitações HTTP POST para o arquivo api_jsonrpc.php, 
localizado na raiz do frontend do Zabbix. Vejamos um exemplo para 
invocar o método apiinfo.version, que nos retorna a versão do 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Zabbix instalado no sistema: 
POST http://localhost/zabbix/api_jsonrpc.ph p 
HTTP/1.1 
Content-Type: application/json-rpc 
{"jsonrpc":"2. 0","method":"apiinfo.version","id":l,"auth" : null, 
"params": { } } 
O pedido deve ter o cabeçalho Content-Type definido como um 
desses valores: 
);> application/json-rpc 
);> application/json 
);> application/jsonrequest 
Lembre-se de que a sua interface web deverá estar acessível; 
caso contrário, você não obterá respostas para as requisições 
solicitadas. 
Você pode usar qualquer cliente HTTP ou uma ferramenta de 
teste JSON-RPC para executar as requisições à API manualmente. 
Vejamos um exemplo usando o comando curl: 
# curl -X POST -H 'Content-Type: 
application/ j son' - d ' {"params": {"password" : 
Vamos explicar algumas opções da requisição feita: 
);> params: parâmetros que serão passados para o método da 
API. 
);> jsonrpc: versão do protocolo utilizado pela API. 
);> method: o método da API que será chamado. 
);> id: identificador arbitrário do pedido. 
);> auth: token de autenticação para o usuário. 
Como vimos no tópico 1.1 , o método user.login é o primeiro que 
devemos usar antes de invocar qualquer outro método da API, pois, 
da mesma forma que precisamos fazer login para ter acesso à 
interface web do Zabbix, faz-se necessário fazer login via API para 
obter um token de autenticação, que será necessário para realizar 
as demais requisições. Suponha que faremos login com o usuário 
administrador Zabbix padrão (usuário: Admin, senha: zabbix). A 
resposta JSON será parecida com a saída a seguir: 
{"jsonrpc":"2.0","result":"cbd7e3ad4678761ee9d4f300 
Já com o token de autenticação, podemos fazer qualquer 
requisição, como, por exemplo, consultar todos os hosts 
cadastrados: 
"zabbix", "user": "Admin" } , # curl -X POST -H 'Content-Type: 
"j sonrpc": "2. O", "method": "user. login", 
"auth ": null, 
"id" : 1}' h ttp://localhost/zabbix 
/ api_jsonrpc.php 
application/ json' -d 
' {"params" : {"output": "shorten", "host": "Zabbix 
server", "limit": O}, "j sonrpc": "2. O", "method": 
"host.get", "auth": 
"cbd7e3ad4678761ee9d4f30000a5f0f0", "id" : 1 }' 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
h ttp : //localhost/ zabbix/ a p i_j sonrpc .php 
O retorno será: 
{" j sonr pc":"2. 0","result ": [ {"hostid":"l0106" }, 
{"hostid ":"l0109"}, {"hostid ":"l 0084"}, 
{"hostid ":"l0107"}, {"hostid º:"l0110" }],"id":l } 
Observe que escrever no formato JSON e definir diretamente a 
autenticação e id toda vez que for fazer uma requisição tem um 
custo, e o retrabalho é doloroso. Por isso, escrever códigos usando 
uma biblioteca com implementação da API é uma opção a ser 
usada. 
1i5. Um pouco sobre JSON 
Apenas para ficar claro o entendimento sobre JSON, explicarei 
como a sua estrutura está constituída. Ela é formada por: 
);:- Uma coleção de pares nome/valor, caracterizada como um 
object. 
);:- Uma lista ordenada de valores, caracterizada como um array. 
Os dados são apresentados nas seguintes formas: 
1. Conjunto desordenado de pares nome/valor: um objeto 
começa com {(abre chave) e termina com} (fecha chave). Cada 
nome é seguido por : (dois pontos) e os pares nome/valor são 
seguidos por , (vírgula), conforme podemos observar na figura a 
seguir: 
nome 
Exemplo: 
{ 
"ou tput": "extend", 
"sortfield": "narne", 
"sortorder": "DESG" 
valor 
2. Coleção de valores ordenados: o array começa com [ (abre 
colchete) e termina com ] (fecha colchete). Os valores são 
separados por , (vírgula), conforme podemos observar na figura 
a seguir: 
valor 
Exemplo: 
13, 
32 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
2 
Bibliotecas 
Para o desenvolvimento de aplicações com a API do Zabbix, 
sugiro que o leitor use uma das bibliotecas mantidas pela 
comunidade. Existem bibliotecas para trabalhar com a API do 
Zabbix nas seguintes linguagens e ferramentas: 
)> Python 
)> Ruby 
)> Perl 
)> Java 
)> PHP 
)> JavaScript 
)> e# 
)> Go 
)> PowerShell 
)> Zabcon 
As bibliotecas e ferramentas podem ser obtidas neste link: 
http:f/zabbix.org/wiki/Docs/api/libraries. 
E é aqui que chegamos ao primeiro ponto de partida para os não 
desenvolvedores. Esta obra tem como um dos objetivos mostrar 
que não é preciso ser nenhum experl em desenvolvimento de 
software para consumir a API do Zabbix (eu digo não apenas do 
Zabbix, mas de qualquer outro software que disponibiliza uma API) 
- e também não importa qual biblioteca será usada para você 
desenvolver seus códigos. Vimos no exemplo anterior o uso do 
comando curl. Posso concluir que você é capaz de usar a API do 
Zabbix facilmente criando scripts em Shell Linux. 
O segredo da programação em APls está em conhecer os 
métodos e objetos que ela oferece, e não a linguagem de 
programação. É como se fosse outra linguagem de programação. 
Devemos estudá-la para tirar ao máximo as funcional idades que 
foram implementadas. 
2.1. Vantagens de usar uma biblioteca 
A época de ficar reinventando a roda já passou faz tempo. Temos 
que ganhar tempo. Isso significa que devemos aproveitar uma ideia 
já pronta e reutil izá-la 
Evidentemente, cada um pode criar sua biblioteca para utilizar os 
métodos disponibilizados pela API, até porque nem todas as 
bibliotecas têm acesso a todos os recursos. Portanto, assim que já 
estiver mais adaptado com a API do Zabbix, você poderá tirar 
conclusões sobre se determinada biblioteca atende ao que você 
deseja consumir da API. Caso nenhuma lhe atenda, é hora de 
desenvolver a sua biblioteca. 
2.2. Qual biblioteca escolher? 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
A biblioteca que eu recomendo para os nossos estudos é a 
disponibilizada no link https://github.com/gescheit/scripts 
/tree/master/zabbix, que sempre atendeu às minhas necessidades, 
além de ser constantemente atualizada sempre que surge uma 
mudança na API do Zabbix. 
Essa biblioteca é conhecida como zabbix-api. Ela foi 
desenvolvida em Python e tem suporte desde a versão 1.8 do 
Zabbix, funcionando nas versões 2 e 3 do Python. 
Não se preocupe se você nunca estudou essa linguagem de 
programação. Analisando os códigos desta obra, você começará a 
se familiarizar com a linguagem e verificará que ela é de fácil 
entendimento. 
2.3. Preparando o ambiente para 
desenvolvimento em Linux 
O Python já vem instalado por padrão nas distribuições 
GNU/Linux na versão 2.7. Para o desenvolvimento de requisições 
básicas, nós podemos utilizar o próprio console do Python ou 
gravar scripts com a extensão .py para executar os comandos. 
Para desenvolvimento de código com o propósito que nós temos 
aqui, que é automatizar tarefas e criar nossas próprias aplicações, 
é recomendado o uso de uma IDE para organizar mais o código e 
também ser possível fazer o debug em busca de erros. Utilizaremos 
a Spyder, uma IDE conhecida para desenvolvimento em ambientes 
científicos. O site do projeto é https://github.com/spyder-ide. 
Para instalarmos a Spyder em ambiente Linux, utilizamos o 
utilitário apt-get em sistemas baseados em Debian. 
# a p t-get i nsta ! ! s pyder - y 
Após a instalação ser concluída, a IDE estará disponibilizada no 
menu Desenvolvimento da sua interface ou através da execução 
do comando spyder, via terminal. 
2.4. Preparando o ambiente para 
desenvolvimento em Windows 
Em sistemas Windows, o Python, por padrão, nãovem instalado. 
Portanto, precisamos fazer a instalação. Como neste livro iremos 
util izar a IDE Spyder, é fortemente recomendada a instalação do 
pacote Python(x,y), que já vem com vários recursos para 
programação em Python, inclusive com o próprio ambiente Python 
e a IDE Spyder. 
Para fazer o download do Python(x,y), basta acessar a página do 
projeto http://python-xy.github.io, salvar o arquivo e executar o 
instalador. Siga o fluxo padrão de instalação em ambiente 
Windows, não sendo necessário selecionar qualquer opção 
adicional. Dessa forma, teremos suporte a muitas bibliotecas de 
que porventura possamos precisar durante o desenvolvimento dos 
nossos códigos. 
2.5. Biblioteca zabbix-api 
Nesta seção, veremos como é simples realizar a instalação da 
biblioteca zabbix-api em ambientes Linux e Windows. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
2.5.1. Ambiente Linux 
Utilizamos o PIP, um gerenciador alternativo para instalação de 
pacotes Python. Executamos o seguinte comando para instalar o 
PIP: 
# apt- get ins t all p y t hon- pip -y 
Com o PIP instalado, podemos executar o comando a seguir para 
instalar a biblioteca zabbix-api: 
# pip i n stall zabbix-api 
Dessa forma, nosso ambiente estará pronto para iniciarmos o 
desenvolvimento dos nossos códigos. 
2.5.2. Ambiente Windows 
Devemos baixar o scripf zabbix_api.py através do link 
https://raw.githubusercontent.com/gescheit/scripts/master/zabbix 
/zabbix_api.py e salvar o arquivo dentro do seguinte diretório: 
C: \Byt hon27\Li b 
Dessa forma, não precisaremos configurar nenhuma variável de 
ambiente. Quando iniciarmos a IDE Spyder, automaticamente a 
biblioteca zabbix-api será carregada para utilização, quando for 
importada. 
Obs.: se você instalou o pacote Python(x,y), ele já 
vem com a ferramenta PIP. Prefira instalar qualquer 
pacote Python através dessa ferramenta. A sintaxe 
de comando segue o mesmo padrão demonstrado no 
tópico 2.5.1. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
3 
Primeiros Passos 
Antes de entrarmos em detalhes nas classes e nos métodos da 
API do Zabbix, veremos alguns exemplos básicos para você 
compreender como funciona a estrutura padrão da biblioteca 
zabbix-api. Assim, você irá se familiarizando com a forma de 
montar as requisições no formato JSON e de incluí-las nos códigos. 
3.1. Criando usuário para acessar a API 
Apesar de não ser obrigatório, é importante criarmos um usuário 
para acesso à API do Zabbix. O ideal em ambientes de produção é 
que esse usuário nem tenha acesso ao frontend do Zabbix. Isso é 
possível criando um usuário e o associando ao grupo No access to 
the frontend. Assegure-se de que este usuário terá acesso total 
para leitura e/ou gravação, caso for automatizar o processo de 
criação de objetos (hosts, itens etc.). Para os casos de utilizar a API 
do Zabbix apenas para gerar relatórios, não há necessidade de o 
usuário criado ter permissão de escrita. 
3.2. Montando a estrutura padrão 
O início de cada arquivo .py que formos criar para nossos 
projetos deverá ter a seguinte estrutura: 
# -*- coding: u t f-8 - *-
from zabbix_api import ZabbixAPI 
zapi = ZabbixAPI{server="http: //<ip- o u - hostname> 
/zabbix") 
zapi.login("<user>", "<password>" ) 
Obs.: você pode formatar a estrutura da forma como 
lhe convir, não precisa seguir esse padrão. 
Podemos observar que precisamos alterar três valores nessa 
estrutura: 
1. IP ou hostname do servidor Zabbix (caso você utilize o Zabbix na 
raiz do seu servidor ou faça o uso de VirtualHost no Apache, 
pode omitir o /zabbix). 
2. Usuário que terá acesso à API. 
3. Senha do usuário. 
A vantagem de utilizarmos uma biblioteca, como no caso da 
zabbix-api, é que alguns métodos já estão implementados, como, 
por exemplo, user.login. Por esse motivo, esta obra não entrará 
em detalhes da classe User. Para você saber mais detalhes sobre 
essa classe, acesse https://www.zabbix.com/documentation 
/2.4/manual/api/reference/user. Caso você escolha outra biblioteca 
para trabalhar com a API do Zabbix, talvez seja preciso 
Con sumindo a API do Zabbix com Python - Janssen dos Reis Lima 
implementar os métodos dessa classe em seu código. Utilizando a 
API com Shell Script, essa implementação se faz necessária. 
Ainda sobre a nossa estrutura inicial, temos a primeira linha, onde 
informamos qual codificação iremos usar em nosso código. 
Para os leitores que irão executar os códigos diretamente no 
terminal do Linux, sugiro colocar o seguinte conteúdo no início da 
estrutura: 
#!/usr/bin/ env python 
Essa linha será importante para quando formos executar os 
scripts sem precisar executar o código passando o interpretador. 
Em vez de executarmos o código assim: 
# p y t hon codigo . p y 
Poderemos executar da seguinte forma: 
# . / c o d i g o .py 
Lembrando que isso não é obrigatório, mas é importante para 
evitar interpretações erradas durante a execução do código. 
3.3. Obtendo IDs e nomes dos hosts 
Veremos agora um exemplo simples, onde iremos utilizar o 
método host.get para recuperar os IDs e nomes de todos os hosts 
configurados. Antes, vamos observar o seguinte trecho do código, 
que é a requisição no formato JSON: 
{ 
" j sonrpc" : "2.0", 
"met hod": "host . get" , 
"params": { 
"output" : [ 
"hos t id", 
" hos t" 
Utilizando a biblioteca Python zabbix-api , essa requisição ficará 
com o seguinte formato: 
h osts = zapi .host . get ({ 
" output": [ 
] 
} ) 
" host id", 
"host" 
print hos t s 
O resultado da requisição é o seguinte: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
[ {u' host': u'Zabbix server', u 'hostid ' : 
u 'l0084'}, {u'host' : u'Cliente', u' hostid': 
u 'l0107'}, {u'host': u'Cable Modem', u' host id': 
u 'l0106r}, {u'host' : u'Test e J anssen', u 'hostid': 
u 'l0109'}, {u'host': u'nmap', u' hostid': 
u ' 10142' } J 
É uma saída no formato JSON, certo? 
Porém, se pretendêssemos fazer um sistema, ficaria mais fácil se 
o resultado viesse apenas com os valores dos dados requisitados. 
É preciso usar algum conversor para isso? A resposta é não. O 
conteúdo da saída no formato JSON é armazenado em uma 
estrutura padronizada para troca de dados, formada por uma 
coleção de pares nome/valor e por lista de valores. Pensando em 
linguagens de programação, essa estrutura pode ser armazenada 
em listas, vetores, matrizes etc. Podemos observar na figura a 
seguir como essa estrutura é armazenada em Python: 
,. 
lndex Type Size Value 
{u 'host ' : u' Zabbix server', u' hostid ' : u 'leil84 '} 
r-····--·········i 
!o : dict 2 
t ........................ i 
1 dict 2 {u 'host' : u'Cliente', u' hostid ': u'10107 ' } 
2 dict 2 {u' host': u'Cable Modem' , u' hostid': u'10106' } 
3 dict 2 {u 'host': u 'TesteJanssen ' , u'hostid': u'10109' } 
4 dict 2 {u 'host' : u'nmap', u'hostid' : u '10142'} 
Temos aqui um objeto no qual foram armazenados apenas os 
campos solicitados na requisição, ou seja, nome do host e ID. 
Cada item na lista é identificado por um índice (que neste caso é do 
tipo dicionário). Portanto, basta acessarmos os índices de cada 
item do objeto e imprimir os valores correspondentes. O código a 
seguir faz o que pretendemos: 
hosts = zapi.host.get({ 
} ) 
"out put 11 : [ 
"hostid11 , 
"host" 
for x in h o s t s: 
print x [ " hostid11 J , "- ", x [ " host 11 J 
Observe que incluímos uma estrutura de repetição em nosso 
código, pois a variável hosts está armazenando uma lista e o 
interpretador do Python já sabe qual é a quantidade de elementos 
que temos na lista. 
Podemos traduzir a instrução da seguinte maneira: 
);;>- Para cada índice encontrado na lista hosts, imprima 10 e 
nome do host. 
Observe também que o x representa o índice da nossa lista. 
Vamos utilizar outro método. Agora não utilizaremos o for, pois não 
queremos imprimir todos os elementos da lista. Queremos saber 
qual é o nome do host que está na posição 1 no conjunto de 
índices. Para isso utilizamos o códigoa seguir: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
hosts = zapi.host.get({ 
"out put": [ 
"hos t id" , 
"host" 
} ) 
p rint hosts [1 ] ["host"] 
Ou: 
hos t s = zapi.host.get({ 
"output": [ 
"hostid", 
"host" 
} ) [1] [ "hos t" ] 
p rint hosts 
A saída das duas execuções anteriores será a mesma, ou seja: 
Cliente 
Esses dois últimos exemplos foram apenas para demonstrar que 
conseguimos acessar diretamente um índice na lista, não 
necessitando utilizar uma estrutura de controle para percorrer todos 
os itens de uma lista. Também é possível a impressão das chaves 
presentes na lista do tipo dicionário executando comandos 
diretamente do console do Python. Por exemplo: após a execução 
do código anterior, digite o seguinte comando: 
hosts [1]. keys () 
A saída do comando é: 
[u'host', u' hos t id'] 
Exatamente os dois campos que solicitamos no output da 
requisição. A figura a seguir exibe o valor dos campos, referente ao 
índice 1 na lista: 
Type Size Value .. -................. .. 
' ' 
j host r unicode 1 
l ................... .J 
Cliente 
hostid unicode 1 16107 
Para encerrar este capítulo, nosso código final para obter a lista 
de todos os hosts cadastrados no servidor Zabbix, imprimindo o 
nome de cada hoste seu respectivo 10: 
#!/usr/bin/e nv python 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
# - *- coding: utf-8 -*-
from zabbix_api import ZabbixAPI 
zapi = ZabbixAPI (server="http : //192 . 168 .0.112 
/zabbix" ) 
zapi.login("apiuser", "apipasswd") 
hosts = zapi.host.get{{ 
} ) 
"output": I 
"hostid", 
"host" 
for x in hosts: 
print x {"hostid"J, "- ", x["host" ] 
E a saída após execução do código: 
10106 - Cable Modem 
10109 - TesteJanssen 
10084 - Zabbix server 
10107 - Cliente 
10110 - Nmap 
3.4. Organizando os dados 
O leitor deve ter percebido que o exemplo anterior não está 
ordenando os registros, nem com o 10 , nem com o nome do host. 
Vamos adicionar um novo parâmetro à nossa requisição. O 
sortfield classifica o resultado de acordo com as propriedades 
passadas. Vejamos a seguir como fica o código incluindo esse 
parâmetro: 
#!/usr/bin/env python 
# -*- coding: utf- 8 - * -
from zabbix_api import ZabbixAPI 
zapi = ZabbixAPI{server="http://192.168. 0 .112 
/zabbix") 
zapi.login("apiuser", "apipasswd") 
hosts = zapi.host.get ({ 
} ) 
"output": [ 
"hostid", 
"host" 
l , 
"sortfield": "name" 
for x in hosts : 
print x["hostid" J , "- ", x{"host"J 
Observe a saída após a execução do código: 
10106 - Cable Modem 
10107 - Cliente 
10142 - nmap 
10109 - TesteJanssen 
10084 - Zabbix server 
Agora está ordenado corretamente. 
Para uma ordenação inversa, ou seja, na forma decrescente, 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
basta incluirmos outro parâmetro na nossa requisição. Desta vez, 
incluiremos o parâmetro sortorder. Vejamos a seguir apenas o 
trecho onde ocorre a mudança: 
hosts = zapi.host.get ({ 
"output": [ 
} ) 
"hostid", 
"host" 
l , 
"sortfield": "name", 
"sortorder": "DESC" 
for x in hosts: 
print x ["hostid "J, "- ", x["host" J 
O resultado da consulta: 
1 0 084 - Zabbix server 
1 010 9 - TesteJanssen 
1 0142 - nmap 
1010 7 - Cliente 
1010 6 - Cable Modem 
Podemos observar que o parâmetro sortfield foi referenciado 
com o valor name. As propriedades dos métodos da API têm 
padrões definidos. Não podemos passar qualquer valor nessas 
propriedades. Por exemplo, o parâmetro sortfield apenas aceita os 
valores: hostid, host, name e status. Veremos detalhes sobre os 
parâmetros dos métodos no Capítulo 5. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
4 
Referências e 
Notações 
Nesta seção, veremos com quais tipos de dados a API do Zabbix 
trabalha e também os parâmetros comuns do método get. 
Cada método da API possui objetos que podem ser retornados 
através de suas propriedades. Essas propriedades possuem tipos 
de dados que devem ser respeitados para que a requisição dos 
dados retorne o pedido com sucesso. 
A API do Zabbix suporta os seguintes tipos de dados: 
Tipo Descrição 
Bool Um valor booleano, ou seja, verdadeiro ou falso. 
Flag O valor é considerado verdadeiro se ele é passado 
e não nulo. Caso contrário, falso. 
lnteger Número inteiro. 
Float Número de ponto flutuante. 
String Uma sequência de texto. 
Text Uma sequência de texto mais longo. 
Timestamp Unix timestamp. 
Array Sequência ordenada de valores. Uma matriz 
simples. 
Object Uma matriz associativa. 
Query Conjunto de nomes apropriados para retornar 
apenas propriedades específicas. 
4.1. Etiquetas de propriedades 
Algumas propriedades dos objetos são marcadas com etiquetas 
curtas para descrever seu comportamento. Os seguintes rótulos 
são usados: 
)> Readonly. O valor da propriedade é estabelecido 
automaticamente e não pode ser definido ou alterado pelo 
cliente. 
)> Constant. O valor da propriedade pode ser definido durante a 
Con sumindo a API do Zabbix com Python - Janssen dos Reis Lima 
criação de um objeto, mas não pode ser alterado 
posteriormente. 
Na tabela a seguir, podemos ver um exemplo de etiqueta de 
propriedade. 
Propriedade Tipo Descrição 
Hostid string (readonly) ID do host. 
eventsource integer (constant) Tipo de evento que a ação irá 
controlar. 
A etiqueta da primeira linha no exemplo anterior indica que a 
propriedade Hostid não pode ter o seu valor alterado. Portanto, só 
pode ser utilizada para uma consulta. 
Essas etiquetas são encontradas na documentação oficial da API 
do Zabbix, na listagem das propriedades das classes da API. 
4.2. Objetos 
Cada classe da API do Zabbix possui uma referência de seus 
objetos, cada um possuindo propriedades e seus tipos de dados. 
Essas propriedades são exibidas em formato de tabela contendo: 
)> Nome da propriedade 
)> Tipo 
)> Descrição 
Como a listagem das propriedades dos objetos é muito extensa, 
a cada classe apresentada nesta obra indicaremos o link para 
acesso à documentação oficial referente ao objeto da classe. 
4.3. Parâmetros comuns do método 
"get" 
Na maioria das vezes, ao desenvolvermos nossos códigos para 
consumir os dados disponibilizados via API do Zabbix, utilizaremos 
os métodos get de cada classe da API do Zabbix. Esse método 
possui vários parâmetros em comum. Descreveremos a seguir os 
parâmetros que são suportados por todos os métodos get: 
Parâmetro Tipo 
countOutput Flag 
Editable Boolean 
excludeSearch Flag 
Filter Object 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Descrição 
Retorna o 
registros 
número de 
encontrados 
resultado no 
pesquisado. 
Se definido como 
verdadeiro, retorna 
apenas os objetos em 
que o usuário tenha 
permissão de escrita. 
Padrão: false. 
Retorna resultados que 
não correspondem aos 
critérios mencionados 
no parâmetro de 
search. 
Retorna apenas os 
resultados que 
correspondem 
exatamente ao filtro 
passado. 
Aceita uma matriz, 
onde as chaves são 
nomes de propriedade 
e os valores são um 
valor único ou uma 
matriz de valores que 
possam combinar com 
os registros buscados. 
Não funciona para 
campos de texto. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
5 
Classes e Métodos da 
API 
Cada classe possui uma lista com os seus objetos e suas 
propriedades correspondentes. Essas propriedades estão 
relacionadas aos campos presentes nas telas da interface web 
referentes a cada objeto. 
Este capítulo apresentará alguns métodos de classes da API que 
eu julgo serem as mais importantes para quem está aprendendo a 
utilizar a API do Zabbix. Em cada classe, apresentarei algumas 
características, métodos, parâmetros aceitos e valores retornados, 
além de exemplos com métodos das classes. 
Vale ressaltar que alguns métodos aceitam parâmetros adicionais 
em suas requisições feitas à API do Zabbix. Nesta obra não irei 
entrar em detalhes sobre todos os parâmetros e propriedades dos 
métodos das classes, por ser um materialbem amplo e disponível 
na documentação oficial. Não faria muito sentido eu transportar um 
conteúdo existente apenas para dar volume a esta obra. Porém, 
para não deixar o leitor às cegas, informarei as referências dos 
objetos e do método de cada exemplo que for abordado. 
Todos os exemplos mostrados neste capítulo utilizarão a 
estrutura já exibida anteriormente. Opcionalmente, você pode 
adicionar o parâmetro log_level para exibir a saída da execução do 
código e também para identificar os resultados das requisições 
(falaremos mais sobre log_level no Capítulo 11 ). Então, para não 
ficar repetindo muito código desnecessariamente, mostraremos a 
seguir a estrutura inicial que usaremos em cada exemplo presente 
neste capítulo. A estrutura é a seguinte: 
#! / usr / bin/ e nv python 
# -*- coding: u t f-8 - *-
from zabbix_api import ZabbixAPI 
zapi = ZabbixAPI {server="http: / /<ip-ou -
fqd n>/ zab bix" ) 
zapi. l ogirr ( "<user>", "<password>") 
A seguir, começaremos os estudos das classes e seus métodos 
mais comumente utilizados. 
5.1. API lnfo 
Esta classe foi projetada para recuperar informação sobre a API. 
5.1.1. Referências do objeto 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Esta classe não tem objetos disponíveis. 
5.1.2. Métodos disponíveis 
)> apiinfo.version 
5.1.2.1. apiinfo. version 
Recupera a versão da API utilizada. 
Parâmetros aceitos 
O método aceita um array vazio. 
Obs.: este método está disponível para usuários não 
autenticados e deve ser chamado sem o parâmetro 
auth na requisição JSON-RPC. Como estamos 
utilizando uma biblioteca, não precisamos nos 
preocupar com esse detalhe, pois a biblioteca utiliza 
uma função interna. 
Valores retornados 
Retorna uma string com versão da API do Zabbix. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/apiinfo/version 
Exemplo 
Para consultarmos a versão presente da API do Zabbix em nosso 
sistema, utilizamos o código a seguir: 
versao = zapi .api_version() 
print " Versão da API: " , v e r sao 
Lembre-se de que precisamos usar a nossa estrutura padrão 
para rodar o código. O resultado da execução desse código será: 
Versã o da API : 2. 4 . 6 
Observe o seguinte detalhe: nós atribuímos a chamada de uma 
função à variável versao. A função api_version, presente na 
biblioteca zabbix-api, é uma implementação do método 
apiinfo.version. Não podemos confundir esses detalhes. Por isso, 
recomendo sempre analisar o código da biblioteca para saber o que 
pode ser feito com ela. 
A seguir, temos o trecho do código que implementa esse método 
na biblioteca zabbix-api: 
def a p i_v ersion (self , **options ): 
sel f. che ckauth () 
obj = 
se l f. do_request (sel f.json_ obj ( 'API I nfo.versi on', 
opti ons, auth=False )) 
ret u rn obj['result'] 
Observe que o parâmetro auth recebe o valor False, pois, 
conforme informado anteriormente, seu uso não é obrigatório para 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
consultar a versão da API do Zabbix. Outro detalhe a observar é o 
método APllnfo.version (isso mesmo, a biblioteca vem com alguns 
caracteres em caixa alta). Já peguei alguns problemas com alunos 
do meu curso - ao utilizarem a biblioteca em ambiente Windows, 
recebiam erro na execução do código. Se for o seu caso, altere 
esse método para apiinfo.version (todo em caixa baixa). 
5.2. Host 
Esta classe foi projetada para trabalhar com hosts. Utilizada para 
gerenciamento de hosts no que tange à criação, atualização de 
dados e status, associação de grupos e templates. 
5.2.1. Referência do objeto 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/host/object 
5.2.2. Métodos disponíveis 
)> host.create - Criar hosts. 
)> host.delete - Excluir hosts. 
)> host.get - Recuperar informações de hosts. 
)> host.isreadable - Verificar se é possível ler informações. 
)> host.iswritable - Verificar se é possível gravar informações. 
)> host.massadd - Acrescentar informações de objetos 
relacionados em massa. 
)> host.massremove - Remover informações de objetos 
relacionados em massa. 
)> host.massupdate - Substituir ou remover objetos 
relacionados a partir de hosts. 
)> host.update - Atualizar hosts. 
5.2.2.1. host.create 
Este método permite criar novos hosts. 
Parâmetros aceitos 
Os parâmetros a seguir são obrigatórios para a criação de um 
host: 
)> host (nome) 
)> groups 
)> interfaces 
A explicação para os parâmetros obrigatórios é simples. Para um 
host ser criado, temos que dar a ele um nome, associá-lo a um 
grupo de host e também adicionarmos uma interface com a qual a 
comunicação do host será realizada. Esses parâmetros são do tipo 
object/array, o que significa que podemos inserir um ou mais hosts 
e associar um ou mais grupos e interfaces ao host criado em uma 
única chamada ao método. 
A lista completa com os parâmetros e propriedades aceitos para 
a criação do host pode ser encontrada nos links contidos nas 
referências do método e do objeto. 
Valores retornados 
Retorna um objeto que contém os IDs dos hosts criados sob a 
propriedade hostids. A ordem dos IDs retornados corresponde à 
ordem dos hosts passados. 
Vale ressaltar que, ao usarmos a biblioteca zabbix-api, o 10 do 
host criado não será exibido, a não ser se habilitarmos o Jog de 
execução (entraremos em detalhe no Capítulo 11) ou 
programarmos a exibição do host criado. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/host/create 
Exemplo 
Vamos criar um host chamado "Curso API" com uma interface IP. 
Adicionaremos o host ao grupo Linux servers, cujo ID do grupo é 
2, e iremos associar ao template Template OS Linux, cujo ID é 
10001 . Também deixaremos o host com o status desabilitado, pois 
por padrão ele fica habilitado para o monitoramento. A seguir o 
código que cria o nosso host 
zapi.host. create ({ 
"host": "Cu rsoAPI", 
"status" : 1, 
"interfaces": [ 
} 
"type": 1, 
""main": 1, 
"usei p ": 1 , 
"ip ": "192.168. 0 .5", 
"dns": "", 
"port": 10050 
l , 
"groups": [ 
"groupid": 2 
} 
l , 
"templates": 
{ 
"templateid": 10001 
} ) 
Nosso host criado já aparece na interface web, conforme 
mostrado na figura a seguir: 
.w;;;;-~ n-- -------
~ ......... :• .. ,. Z...•· ..,,, ..--10 ' l:"• •. "'°" 
Lembra que eu comentei que o valor retornado ao criarmos um 
host é o ID? Se você observar, o nosso código não fez esse 
tratamento, ou seja, não ficou explícito que o ID do host seria 
retornado. O 1 D do host só retorna quando consumimos a API 
diretamente com ferramentas como curl ou wget. Como estamos 
usando uma biblioteca, precisamos ativar o Jog ou codificar essa 
saída. Sobre o Jog, veremos no Capítulo 11 ; já a codificação para 
mostrarmos o 1 D do host criado é exibida conforme o exemplo a 
seguir: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
hostcriado = zapi.host.create({ 
" host": "CursoAPIRemover", 
"status": 1, 
"interfaces": 
....... 
"type": 1, 
"main": 1, 
"useip ": 1, 
"ip ": "192.168. 0 .5", 
"'dns" : "", 
"port": 10050 
F=='':&roups" · 
' AvaibWitv • 
. ia-
"group id" : 2 
• Ili 
'"'" 1 l!a l / 
e " t emplates": 
"templateid" : 10001 
} ) 
p rint "ID d o host criado: ", 
hostcriado ["hostids" ] [O ] 
Observe que agora estamos armazenando a execução do 
método host.create em uma variável, que chamei de hostcriado. 
Em seguida, imprimimos a saída do ID do host criado. Veja que 
interessante: o que foi armazenado na variável é uma estrutura de 
dados do tipo dicionário, conforme podemos visualizar na seguinte 
imagem: 
Size Value 
hostcriado dict 1 {u'hostids': [u'10160' J} 
O ID do host criado é armazenado na propriedade hostids, que é 
uma estrutura de dados do tipo lista, pois podemos criar mais de 
um host na mesma chamada do método. A imagem a seguir mostra 
o conteúdo da lista: 
Key Type Síze Value 
rh~id~--, fist1 
L ..................... J 
[u' 10160' J 
ID do host criado armazenado em uma lista . 
Na lista que foi criada, a chave para acessar o valor de cada item 
é hostids, o mesmo nome da propriedade. Como neste caso 
criamos um único host, nosso índice a ser acessado é o O (zero), 
conforme podemos visualizar na imagem a seguir: 
, 
Index Type Size Value 
r····-···---···1 
!O i unicode 1 
l .................. ! 
10160 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Acesso ao índice que armazena o ID do host criado. 
Portanto, está explicado por que foi pedido para imprimir a 
variável hostcriado seguido de ["hostids"](O], pois hostcriado é 
um dicionário que contém a lista hostids e o índice O, que 
armazena o valor que queremos imprimir. 
O resultado da saída é impresso da seguinte maneira: 
ID do host criado: 10160 
Se imprimirmos apenas a variável hostcriado, a saída seria a 
seguinte: 
ID do host criado: {u'hostids': [u'10160 ']} 
Nada convencional para os nossos propósitos. No item 8.2 
mostrarei um exemplo para criarmos hosts automaticamente. 
5.2.2.2. host.massadd 
Este método permite adicionar simultaneamente vários objetos 
relacionados a todos os hosts indicados. 
Parâmetros aceitos 
Parâmetros que contêm os IDs dos hosts para atualizar e os 
objetos para adicionar a todos os hosts. 
Os seguintes parâmetros são aceitos: 
)> hosts (obrigatório) 
)> groups 
)> interfaces 
)> macros 
)> templates 
Valores retornados 
Retorna um objeto que contém os IDs dos hosts criados sob a 
propriedade hostids. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/host/massadd 
Exemplo 
Precisamos associar um tem pi ate a dois hosts. Os 1 Os dos hosts 
são 10159 e 10160, e o template que adicionaremos aos hosts tem 
o ID 10131. A seguir, temos o código que adiciona o template aos 
dois hosts: 
zapi.h ost.massadd( { 
"hosts": [ 
"hostid": 10159 
} I 
"hostid": 10160 
] I 
"templates": 
{ 
"templateid": 1 0131 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
} ) 
Os IDs deste exemplo são os hosts que cadastramos no tópico 
5.2.2.1. Já o ID 10131 refere-se a um template que já estava 
cadastrado, mas não foi referenciado em nenhum exemplo até o 
momento. Iremos trabalhar com o template 10131 no tópico 5.4.2.1. 
A imagem a seguir mostra a associação deste template aos hosts: 
-·--·~-.,_.,_ 
5.2.2.3. host.isreadable 
Este método verifica se os hosts consultados estão disponíveis 
para leitura. 
Parâmetros aceitos 
IDs dos hosts a verificar. 
Valores retornados 
Retorna true se os hosts informados na consulta estiverem 
disponíveis para leitura. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/hosUisreadable 
Exemplo 
Verificar se os hosts 10137 e 10138 estão disponíveis para 
leitura. A seguir, temos o código que faz essa verificação: 
lei tura = zapi. host.isreadable( [ ----..., . ...... _ , _ _,. , ""!'0 159, 
" - Host(s) d isponíve i s para 
l eitura, " Host(s) não d i sponíveis para 
i:..- l!l::U: 
l j;;l. tura" ..... 11 . 
Repare na sintaxe do código. Aqui, não incluímos as "{}", pois se 
trata apenas de uma lista (array) que devemos passar como 
parâmetro, ao contrário dos exemplos vistos anteriormente, onde 
passamos objetos. Neste exemplo, o retorno também é diferente, 
pois estamos fazendo uma verificação. Portanto, o retorno será 
exibido como true ou false. No exemplo, a variável leitura 
armazena esse valor, conforme é exibido na imagem a seguir: 
N:me Type Size V•lue 
leitura bool l i i-ue 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
} ) 
Os IDs deste exemplo são os hosts que cadastramos no tópico 
5.2.2.1. Já o ID 10131 refere-se a um template que já estava 
cadastrado, mas não foi referenciado em nenhum exemplo até o 
momento. Iremos trabalhar com o template 10131 no tópico 5.4.2.1. 
A imagem a seguir mostra a associação deste template aos hosts: 
-·--·~-.,_.,_ 
5.2.2.3. host.isreadable 
Este método verifica se os hosts consultados estão disponíveis 
para leitura. 
Parâmetros aceitos 
IDs dos hosts a verificar. 
Valores retornados 
Retorna true se os hosts informados na consulta estiverem 
disponíveis para leitura. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/hosUisreadable 
Exemplo 
Verificar se os hosts 10137 e 10138 estão disponíveis para 
leitura. A seguir, temos o código que faz essa verificação: 
lei tura = zapi. host.isreadable( [ ----..., ....... _ , _ _,. , ""!'0 159, 
" - Host(s) d isponíve i s para 
l eitura, " Host(s) não d i sponíveis para 
i:..- l!l::U: 
l j;;l. tura" ..... 11 . 
Repare na sintaxe do código. Aqui, não incluímos as "{}", pois se 
trata apenas de uma lista (array) que devemos passar como 
parâmetro, ao contrário dos exemplos vistos anteriormente, onde 
passamos objetos. Neste exemplo, o retorno também é diferente, 
pois estamos fazendo uma verificação. Portanto, o retorno será 
exibido como true ou false. No exemplo, a variável leitura 
armazena esse valor, conforme é exibido na imagem a seguir: 
N:me Type Size V•lue 
leitura bool l i i-ue 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Neste exemplo, é importante frisar que essa verificação é 
realizada de acordo com as permissões que um grupo de usuário 
possui sobre os hosts. Portanto, se você estiver executando a 
consulta como usuário Zabbix Super Admin, o resultado das 
consultas sempre será true. 
Esses exemplos dão base para utilizarmos os demais métodos 
da classe Host. Como foram demonstrados exemplos do método 
host.get no item 3.3, não há necessidade de repetirmos os 
exemplos básicos. Exemplos avançados serão demonstrados no 
Capítulo 8. 
5.3. Host Group 
Esta classe foi projetada para trabalhar com grupos de hosts. 
Utilizada para gerenciamento de grupos de hosts, no que tange à 
criação e atualização de dados. 
5.3.1. Referências do objeto 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/hostgroup/object 
5.3.2. Métodos disponíveis 
)> hostgroup.create - Criar grupos de hosts. 
)> hostgroup.delete - Excluir grupos de hosts. 
)> hostgroup.get - Recuperar informações de grupos de hosts. 
)> hostgroup.isreadable - Verificar se é possível ler 
informações. 
)> hostgroup.iswritable - Verificar se é possível gravar 
informações. 
)> hostgroup.massadd - Acrescentar informações de objetos 
relacionados em massa. 
)> hostgroup.massremove - Remover informações de objetos 
relacionados em massa. 
)> hostgroup.massupdate - Substituir ou remover objetos 
relacionados a partir de grupos de hosts. 
)> hostgroup.update -Atualizar grupos de hosts. 
Os métodos da classe hostgroup são semelhantes aos métodos 
da classe host. Com isso, mostraremos dois exemplos diferentes 
dos demonstrados na classe host. 
5.3.2.1. hostgroup.delete 
Este método permite excluir grupos de hosts. 
Obs.: um grupo não pode ser apagado se: 
- contém hosts que pertencem apenas a este grupo; 
- o grupo é marcado como interno. 
O grupo de hosts marcado como interno é definido no menu 
Administration > General > Others. Por padrão, esse valor é 
Discovered hosts, conforme exibido na imagem a seguir: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
~~~~~~~~~~~~~~~~~~~~~~~~~~~-~N~~~-~-~~~&ido~)grupo~)deh~~parae~lui~ Valores retomados - que contém os IDs dos grupos de hosts 
........ ~---J @ 
O..,.lwllll•-~ ~~ .... . 
~ .... i.-~ ....... -·..- U...~·­
\41-~-m,.. ,,. 
-·· 
Quando um grupo de hosts é marcado como interno, o valor da 
propriedade internai é 1. O padrão dessa propriedade ao criarmos 
um grupo de host é O. Apenas um grupo pode ser marcado como 
interno. Para comprovar que não podemos excluir um grupo de host 
marcado como interno, observe na imagem a seguir que o botão 
Delete encontra-se desabilitado: 
---
...... 
Parâmetros aceitos 
._._. ,o_,,,.....,,. 
C,.,,.4"1oNL1 
~us:-2 ,_... ........ 
Referência dométodo 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/hostgroup/delete 
Exemplo 
Como este método aceita apenas como parâmetro os IDs dos 
grupos de hosts, basta apenas informarmos o(s) ID(s) dos grupos. 
zapi.hostgroup. delete([ 
..... , .. ,._. , .,,.,. ...... ,~3 
Observe que o formato do código teve uma pequena variação, 
assim como vimos no método host.isreadable. Como estamos 
passando um array de um único parâmetro, não precisamos 
envolvê-lo entre chaves O. Essa característica deve ser assimilada 
pelo leitor. Por isso, em cada método que estamos vendo nesta 
obra, existe uma notação relacionada ao método em sua descrição. 
5.3.2.2. hostgroup.massupdate 
Este método permite substituir ou remover, simultaneamente, 
objetos relacionados por vários grupos de hosts . 
Parâmetros aceitos 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Parâmetros que contenham o 10 do grupo de hosts. Este método 
aceita apenas os três parâmetros a seguir: 
}> groups 
}> hosts 
}> templates 
Valores retornados 
Retorna um objeto que contém os IDs dos grupos de hosts 
atualizados sob a propriedade groupids. A ordem dos IDs 
retornados corresponde à ordem dos grupos de hosts passados. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/hostgroup/massupdate 
Exemplo 
Digamos que no grupo de hosts Web nós temos um host que 
queremos substituir. Vamos substituir esse host por outros dois 
hosts que não são membros do grupo Web. A seguir, o código da 
solução: 
zapi.hostgroup.ma ssupdat e( { 
"groups": [ 
"groupid" : " 11" 
l ' 
"hosts" : 
"hostid " : "10148" 
} ' 
{ 
" hostid": "10147" 
} ) 
No exemplo, o groupid 11éo 10 do grupo Web. Passamos como 
parâmetro hosts os IDs dos hosts que iremos incluir como membro 
nesse grupo. 
Obs.: não é possível atualizarmos um grupo de hosts 
em massa caso o grupo contenha hosts que sejam 
membros somente deste grupo. Por exemplo: os 
hosts cujos IDs são 10151 e 10152 sejam membros 
do grupo de ID 17. Se executarmos o código do 
exemplo anterior substituindo 11 por 17, vai 
aparecer uma mensagem de erro informando que um 
dos objetos (no caso, os hosts) não pode ser deixado 
sem um grupo. Essa é uma regra do Zabbix que 
exige que um host seja membro de ao menos um 
grupo de hosts. Portanto, você deve, antes de fazer 
essa atualização, incluir os hosts como membros de 
outro grupo. Essa observação também se aplica 
quando existirem templates que são membros do 
grupo de hosts. 
5.4. Template 
Esta classe foi projetada para trabalhar com templates. Utilizada 
para gerenciamento de temp/ates , no que tange à criação, 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
atualização de dados e status, associação de grupos e templates. 
5.4.1. Referências do objeto 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/template/object 
5.4.2. Métodos disponíveis 
)> template.create - Criar templates. 
)> template.delete - Excluir templates. 
)> template.get - Recuperar informações de templates. 
)> template.isreadable - Verificar se é possível ler informações. 
)> template.iswritable - Verificar se é possível gravar 
informações. 
)> template.massadd - Acrescentar informações de objetos 
relacionados em massa. 
)> template.massremove - Remover informações de objetos 
relacionados em massa. 
)> template.massupdate - Substituir ou remover objetos 
relacionados a partir de templates. 
)> template.update -Atualizar templates. 
Os métodos da classe template são semelhantes aos métodos 
da classe host. Com isso, mostraremos dois exemplos diferentes 
dos demonstrados na classe host. 
5.4.2.1. template.update 
Este método permite atualizar templates. 
Parâmetros aceitos 
Propriedades a serem atualizadas. A propriedade templateid 
obrigatoriamente deve ser definida para cada template que deseja 
atualizar. Todas as outras propriedades são opcionais. Apenas as 
propriedades indicadas serão atualizadas, todas as demais 
permanecerão inalteradas. 
Valores retornados 
Retorna um objeto que contém os IDs dos templates atualizados, 
sob a propriedade templateids. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/template/update 
Exemplo 
Atualizar a descrição e o nome do template com ID 11. A seguir, o 
código que atualiza a descrição do template: 
zapi.template.update( { 
"templateid" : "10111", 
"name": "Temp late a ltera do 1", 
"description": "Descrição para template 
alterado 1" 
} ) 
A imagem a seguir mostra os campos alterados: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
+- e lf in.168-2 1os , métodõs. A seguir, o código com exemplo para alterar dois 
~~~~~~-'---'="~~~~~~~~,,,~=~=~===~=~=:.__=~=~=~=~=~=~=-=_=_=_=_=_=_=_,,...--rempfa~es simultaneamente: 
f • ....,.,. t . .. , .. , .... T ._..,_ -------------------------------' 
T.._,__ -~l.-
111 ..... _..,. 1'~• ..WW. I 1 ........ _ 
·..-.t..t .. 
--
...__ 
._ ... 
o ......... ... 
~ .... , .. ·-..._._._ --·-1•Jh ....... mw .. ~, .... 
ou-.1 .... · e.....ut 
c_,,..._,-~­
c-AJt~: 
Td.C-
W•-
Podemos visualizar em destaque na imagem os valores dos 
campos alterados. Observe que atualizamos a propriedade name, 
que na interface web do Zabbix é representada por Visible name. 
Caso seja necessano alterar o campo Template name, a 
propriedade do método é host (que é como o Zabbix trata um 
template). 
Detalhe é que esse método permite a atualização de mais de um 
template na mesma execução do código. O que o diferencia do 
método template.massupdate é que o massupdate faz a 
atualização em massa de objetos relacionados e o update somente 
atualiza as propriedades. Essa diferenciação vale para os demais 
z a p i. templ ate . update( [ 
" t emplateid" : " 1 011 1", 
"name ": "Te mplat e alterado 1", 
"des cri pti on": "Descrição p ara t e mpl ate 
alt e r a do 1 novamente " 
} , 
" t emplateid": " 1 0131", 
"na me ": " Template alterado 2", 
"descri pti on": "Descrição p ara t e mpl ate 
alt e r a do 2 novame nte" 
l ) 
Observe que, para atualizar mais de um registro, precisamos 
informá-los entre colchetes e separados por vírgula, para identificá-
los dentro de um array. 
5.4.2.2. template.massremove 
Este método permite remover objetos relacionados por vários 
tem pi ates. 
Parâmetros aceitos 
Parâmetros que contêm os IDs dos templates para atualizar e os 
objetos que devem ser removidos. 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Valores retornados 
Retorna um objeto que contém os IDs dos grupos dos templates 
atualizados sob a propriedade templateids. A ordem dos IDs 
retornados corresponde à ordem dos templates passados. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/template/massremove 
Exemplo 
Vamos desassociar dois templates associados a um mesmo 
grupo de hosts. A seguir, o código que remove essa associação: 
zapi.template .massremove({ 
"templat eid s": 
"10111", 
"10131" 
l , 
"groupids": "5" 
} ) 
A observação do método hostgroup.massupdate também se 
aplica neste exemplo, pois não podemos remover um template e 
deixá-lo sem associação a um grupo de hosts. Se você tentar 
remover um template que não esteja associado a outro grupo (por 
exemplo, o grupo Templates), a API retornará a mensagem de erro 
a seguir: 
ZabbixAPIException: (u'Error - 3260 2 : I nvalid 
params., One of the objects is lef t without a 
host group. while sending {"params": 
{"groupids": "5", "templateids": ["10111", 
"10131"] } , "j sonrp c " : "2 . O", "method" : 
"template.ma ssremove", "auth": 
"b7dcf87a c4c51932a510f48430b0 7069", "id" : 1 }', 
- 32602) 
Observe a imagem a seguir, que mostra os templates que serão 
desassociados: 
-· 
-
--
~ ·' •;;e--=------
-" 
~ 2.1 c:wwnn m• '»='d ~ ... m:u.~ -n 
"""'" ,.,....... 
~<• 
, ....... "'=' ., .... 'O"~• 
,......,, ... ft !lr:!tee.•r!!t!lrtt""""t! .. 7 1ww1,,... nt mim Pd 
~ . .._f sn """1n'e •er!e! m ""XI- ~.::1.!t!,..,. P' .........,, Tr=ei.o• t" trfr:, ~ 
*-U(M J?U.k:::â ,_,,,.,,rià,....AMC.~~ 
.,.,,, .. ,,_,,,..,, :a..u:.a-+r•g.,.. ~ • ..,. .. .,._ ...:e·+.••·,... __j 
....... ! 1 ... ,..'«"'se! 1 ppftee. ... '*' ..... tt='·! t .,.,.. -·-t:.......:: 
Após a execução do código, o grupo Discovered hosts, cujo 10 
é 5, não terá mais nenhum template associado, conforme podemos 
visualizar na imagem a seguir: 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
"""" ' 
E 
- " ·-· 
=lOl ~ .......... e,_, .. ,...,._..._,., 
'fc:d:aa 'º ~ 
"""' ~10' 
' "Mr' rftt*I11 
podem ser criados, excluídos ou 
5.5.1. Referências do objeto .... 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/item/object 
5.5.2. Métodos disponíveis 
)> item.create - Criar itens. 
)> item.delete - Excluir itens. 
.,_ ...... ._..._~;::~ü:::.:~=~ )> item.get - Recuperar informações de itens. 
:.,,~ ,~ =~~~~~~~~~E~~~~~~~~E~E§ã§:_1~~~~-~·~~j }> item.isreadable - Verificar se é possível ler informações. g -, ",.,.._, .. _. · -- · .t - .... . _ , ' · .,___};> item.iswritable-Verificar se é possível gravar informações. 
~._Nã°lpodemos confundir remover com desassociar. Neste caso, )> item.update - Atualizar hosts. 
remQ:i1er apagaria o cadastro do template nos registros do Zabbix. Veremos dois exemplos utilizando 0 método item.update. Os 
Obs.: apesar de não ser prática da maioria dos 
usuar1os, que agrupa seus templates somente no 
grupo Template, é normal encontrarmos ambientes 
cujos templates estão associados a grupos de hosts 
separados, tomando a administração mais 
organizada • 
..... 
5.5. Item 
Esta classe foi projetada para trabalhar com itens. Utilizada para 
gerenciamento de itens, no que tange à criação, atualização de 
dados e status, além de associação com aplicações. Itens de 
demais métodos seguem o mesmo padrão das classes já vistas até 
aqui. 
5.5.2.1. item.update 
Este método permite atualizar itens existentes. 
Parâmetros aceitos 
Propriedades a serem atualizadas. A propriedade itemid 
obrigatoriamente deve ser definida para cada item que se deseja 
atualizar; todas as outras propriedades são opcionais. Apenas as 
propriedades indicadas serão atualizadas e todas as demais 
permanecerão inalteradas. 
Valores retornados 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
Retorna um objeto que contém os IDs dos itens atualizados, sob 
a propriedade itemids. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/item/update 
Exemplo 
Desabilitar a coleta de dados de um item que está apresentando 
erro no monitoramento. A seguir, o código que desabilita o item cujo 
ID é 25746: 
zapi. item. u pdat e ({ 
" ite mid": "25746", 
"status": 1 
} ) 
Agora vamos utilizar o mesmo método para fazer uma 
atualização de status para mais de um item. Digamos que 
identificamos problemas nos itens 257 45 e 257 46 e que fizemos 
uma atualização na chave desses dois itens e agora podemos 
habilitar a coleta de dados neles. Observe o código a seguir: 
zapi. item. update ([ 
} ' 
"itemid": "25745", 
"status": O 
} 
l ) 
"itemid" : "25746", 
"status" : O 
No exemplo, estamos habilitando os itens 25745 e 25746. No 
momento em que estou escrevendo esta obra, não existe o método 
item.massupdate. Portanto, para demonstrar como é possível 
programar essa solução, eu fiz a chamada ao método item.update 
passando uma lista dos itens que desejamos atualizar. 
Logicamente, essa solução foi baseada em fazer uma única 
requisição ao método. Uma alternativa é utilizar uma estrutura de 
controle, verificar os itens que devem ser atualizados e fazer a 
chamada para atualizar cada item percorrido nessa estrutura. 
No Capítulo 8, mostrarei um exemplo de como fazer para 
localizar os itens não suportados e desabilitá-los automaticamente. 
5.6. Trigger 
Esta classe foi projetada para trabalhar com triggers. Utilizada 
para gerenciamento de triggers, no que tange à criação, atualização 
de dados e status, além de inclusão e exclusão de dependências. 
5.6.1. Referências do objeto 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/trigger/object 
5.6.2. Métodos disponíveis 
):>- trigger.adddependencies - Adicionar dependências de 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
triggers. 
)> trigger.create - Criar triggers. 
)> trigger.delete - Excluir triggers. 
)> trigger.deletedependencies - Excluir dependências de 
triggers. 
)> trigger.get - Recuperar informações de triggers. 
)> trigger.isreadable - Verificar se é possível ler informações. 
)> trigger.iswritable - Verificar se é possível gravar 
informações. 
)> trigger.update -Atualizar triggers. 
Veremos o método trigger.adddependencies. Os demais 
métodos seguem o mesmo padrão das classes já vistas até aqui. O 
método trigger.deletedependencies é bem básico, bastando 
passarmos o 10 da(s) trigger(s) que queremos remover às 
dependências. Basicamente, é parecido com qualquer método 
delete das demais classes. 
5.6.2.1. trigger.adddependencies 
Este método permite adicionar dependências de triggers. 
Parâmetros aceitos 
Propriedades a serem atualizadas. Para este método, apenas 
duas propriedades devem ser passadas: o 10 da trigger e o 10 da 
trigger da qual ela é dependente. 
Valores retornados 
Retorna um objeto que contém os IOs das triggers dependentes, 
sob a propriedade triggerids. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/trigger/adddependencies 
Exemplo 
Adicionar dependência da trigger 14410 para a trigger 14411 : 
zapi. t rigger. a dd dependencies ( { 
"trig gerid" : " 14410", 
"depend sOnTri ggerid": "1 4 411" 
} ) 
Veja na imagem a seguir como fica a tela de triggers com a 
adição dessa dependência: 
. ........ -
~-· •- flf .W&J"U 1l•'teMnd!wh= 1 • =-t•<ttQC!M!' li ~0)) .. 
5.7. History 
Esta classe foi projetada para recuperar dados históricos do 
monitoramento. Os históricos são diferentes conforme o tipo do 
item da informação a ser recuperada. Por exemplo: o valor 
retornado pode ser float, integer etc. Isso deve ser observado 
quando se for recuperar uma informação do histórico, pois se faz 
Consumindo a API do Zabbix com Python - Janssen dos Reis Lima 
necessário saber qual é o tipo de informação a ser recuperada. No 
Capítulo 4 vimos os tipos de dados com que o Zabbix trabalha. 
Vale ressaltar que os históricos são gerados pelo Zabbix Server e 
não podem ser modificados via API. 
5. 7 .1. Referências do objeto 
https://www.zabbix.com/documentation/2.4/manual/api/reference 
/history/object 
5. 7 .2. Métodos disponíveis 
~ history.get - Recuperar dados históricos. 
~I1LJ . history.get 
-5~] método permite recuperar dados históricos do 
monitoramento de acordo com os parâmetros informados nas 
~ções. 
P'ãrâlftetros aceitos 
-.i)í.bistory - Tipo de dado do histórico a ser retornado. 
- h ostids - Retornar apenas dados históricos dos hosts 
-~ jformados. 
~ itemids - Retornar apenas dados históricos dos itens 
informados. 
~ time_from - Retornar apenas dados históricos recebidos 
após o período informado. 
~ time_till - Retornar apenas dados históricos recebidos antes 
do período informado. 
Além dos parâmetros do método, também são aceitos os 
parâmetros comuns do método get, como mencionado no item 4.3. 
Os parâmetros time_from e time_till são do tipo tímestamp. 
Portanto, devem ser passados no formato específico. No tópico 7.3 
veremos alguns exemplos com conversão de datas nesse formato. 
Obs.: uma boa fonte para converter datas é o site 
http://www.epochconverter.com. Muito simples e 
fácil de usar, com exemplos práticos de uso em 
várias linguagens de programação. 
Valores retornados 
Retorna um array com os valores dos históricos coletados. Caso 
for utilizado o parâmetro countOutput, retorna a contagem dos 
objetos da consulta. 
Referência do método 
https://www.zabbix.com/documentation/2.4/manual/api/reference

Continue navegando