Baixe o app para aproveitar ainda mais
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
Compartilhar