python zabbix api

zabbix api 允许你以编程的方式来检索和修改zabbix 的配置和提供访问历史数据

他被广泛应用于:

1. 创建新的应用结合zabbix

2.整合Zabbx 使用第三方软件

3.自动化日常工作

Zabbix API 是一个web 基于API和是作为web前端的一部分

它使用JSON-RPC 2.0 protocol 

API 是有一组独立的方法组成,请求和响应在客户端和API是编码成JSON格式

更多信息关于协议和JSON 可以在JSON-RPC 2.0中找到

结构:

API 有一些方法组成 通常分组为单独的APIs.

每个方法执行一个特定的任务,host.create 方法术语一个host API是

用于创建新的主机。


大多数APIs 包含至少四种方法:get,create,update和delete 对于检索,创建,更新和删除数据


但是一些APIs可能提供一个完全不同的方法集

Performing requests 执行请求:

一旦你已经建立了前端,你可以使用远程HTTP 请求来调用API。

你需要做时发送HTTP POST 请求到 api_jsonrpc.php 文件位于前端目录下。

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}


请求必须有Content-Type header 设置为其中一个值:

application/json-rpc, application/json or application/jsonrequest.


例如工作流:

下面章节会更详细的介绍一些用法示例:

认证:

在你访问任何数据在zabbix里 你需要登录和得到一个认证令牌。

这个可以通过使用user.login方法,让我们假设你需要登录:

让我们仔细看看请求对象,它具有以下属性:

jsonrpc JSON-RPC 协议版本用于API,Zabbix 实现了JSON-RPC version 2.0;

method  调用api的方法

id  请求的任意标识符

auth 一个用户认证token, 因为我们目前还没有,设置为null

如果你提供了正确的认证,API返回的是抱哈用户认证token:

{
    "jsonrpc": "2.0",
    "result": "0424bd59b807674191e7d77572075f33",
    "id": 1
}

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
def http_post():
    url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
    values = {
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "admin",
        "password": "zabbix"
    },
    "id": 1
    }
    headers={"Content-Type":"application/json"}
    jdata = json.dumps(values)  # 对数据进行JSON格式化编码
    req = urllib2.Request(url, jdata,headers)  # 生成页面请求的完整数据
    response = urllib2.urlopen(req)  # 发送页面请求
    return response.read()  # 获取服务器返回的页面信息

resp = http_post()
print resp


C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/templates/a8.py
{"jsonrpc":"2.0","result":"dae9c7e96eed20c90327741a7a8c6de1","id":1}



响应对象返回的包含以下属性:

jsonrpc - 再次,JSON-RPC protocol版本

result  方法返回的数据

Retrieving hosts 检索主机

我们现在有一个正确的用户认证token 用于访问zabbix的数据。

比如,让我们使用host.get 方法来检索IDs,host names和所有配置主机的接口

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
def http_post():
    url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
    values = {
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "admin",
        "password": "zabbix"
    },
    "id": 1
    }
    headers={"Content-Type":"application/json"}
    jdata = json.dumps(values)  # 对数据进行JSON格式化编码
    req = urllib2.Request(url, jdata,headers)  # 生成页面请求的完整数据
    response = urllib2.urlopen(req)  # 发送页面请求
    return response.read()  # 获取服务器返回的页面信息
def get_token():
   resp = http_post()
   print resp
   print type(resp)
   aa=json.loads(resp)
   print aa
   print type(aa)
   token=aa['result']
   return  token
def get_hosts():
  token=get_token()
  url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
  values={
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]
    },
    "id": 2,
    "auth": token
}
  headers = {"Content-Type": "application/json"}
  jdata = json.dumps(values)  # 对数据进行JSON格式化编码
  req = urllib2.Request(url, jdata, headers)  # 生成页面请求的完整数据
  response = urllib2.urlopen(req)  # 发送页面请求
  return response.read
print '-------------'
a=get_hosts()
print a


注意 认证属性是设置认证token 从调用user.login 得到的

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import urllib
import cookielib
import json
import httplib
import urllib
import urllib2
import json
import requests
import json
def http_post():
    url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
    values = {
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "admin",
        "password": "zabbix"
    },
    "id": 1
    }
    headers={"Content-Type":"application/json"}
    jdata = json.dumps(values)  # 对数据进行JSON格式化编码
    req = urllib2.Request(url, jdata,headers)  # 生成页面请求的完整数据
    response = urllib2.urlopen(req)  # 发送页面请求
    return response.read()  # 获取服务器返回的页面信息
def get_token():
   resp = http_post()
   #print resp
   #print type(resp)
   aa=json.loads(resp)
   #print aa
   #print type(aa)
   token=aa['result']
   return  token
def get_hosts():
  token=get_token()
  url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
  values={
         "jsonrpc": "2.0",
         "method": "host.get",
         "params": {
         "output": [
                 "hostid",
                 "host"
                    ],
         "selectInterfaces": [
            "interfaceid",
            "ip"
              ]
                   },
         "id": 3,
         "auth": token,

             }
  headers = {"Content-Type": "application/json"}
  # jdata = json.dumps(values)  # 对数据进行JSON格式化编码
  # req = urllib2.Request(url, jdata, headers)  # 生成页面请求的完整数据
  # response = urllib2.urlopen(req)  # 发送页面请求
  # return response.read
  request = requests.post(url=url, headers=headers, data=json.dumps(values))
  dict = json.loads(request.content)
  return dict
print '-------------'
a=get_hosts()
#print a
print type(a)
print a['result']
print type(a['result'])
for i in a['result']:
    print i['host']+'->'+str(i['interfaces'])


C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/templates/a8.py
-------------
<type 'dict'>
[{u'host': u'testtlcb', u'hostid': u'10105', u'interfaces': [{u'interfaceid': u'2', u'ip': u'1.1.1.1'}]}, {u'host': u'nod01-192.168.137.2', u'hostid': u'10106', u'interfaces': [{u'interfaceid': u'3', u'ip': u'192.168.137.2'}]}, {u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}]
<type 'list'>
testtlcb->[{u'interfaceid': u'2', u'ip': u'1.1.1.1'}]
nod01-192.168.137.2->[{u'interfaceid': u'3', u'ip': u'192.168.137.2'}]
Zabbix server->[{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]

Process finished with exit code 0


响应的对象包含有关主机的请求数据:


出于性能原因 我们推荐总是列出要检索的对象属性,并避免检索所有的内容



创建一个新的item:

让我们创建一个新的item 在"Zabbix server”  使用数据,我们从先前的host.get 请求得到的

{u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}


{
    "jsonrpc": "2.0",
    "method": "item.create",
    "params": {
        "name": "Free disk space on $1",
        "key_": "vfs.fs.size[/home/joe/,free]",
        "hostid": "10084",
        "type": 0,
        "value_type": 3,
        "interfaceid": "1",
        "delay": 30
    },
    "auth": "0424bd59b807674191e7d77572075f33",
    "id": 3
}


{u'jsonrpc': u'2.0', u'result': {u'itemids': [u'23804']}, u'id': 3}

成功的响应会得到新创建item的ID ,可用于下列请求中的项:


item.create 方法和其他创建方法一样可以接收对象数据,创建多个items使用一个API调用


创建多个触发器:

因此 它创建方法接收数组,我们可以早呢更加多个触发器

def create_triggers():
    token = get_token()
    url = 'http://192.168.137.3/zabbix/api_jsonrpc.php'
    values = {
    "jsonrpc": "2.0",
    "method": "trigger.create",
    "params": [
        {
            "description": "tlcb Processor load is too high on {HOST.NAME}",
            "expression": "{Template App HTTP Service:net.tcp.service[http].max(#3)}=0",
        },
        {
            "description": "tlcb Too many processes on {HOST.NAME}",
            "expression": "{Template App HTTP Service:net.tcp.service[http].max(#3)}=0",
        }
    ],
    "auth": token,
    "id": 4
}
    headers = {"Content-Type": "application/json"}
    # jdata = json.dumps(values)  # 对数据进行JSON格式化编码
    # req = urllib2.Request(url, jdata, headers)  # 生成页面请求的完整数据
    # response = urllib2.urlopen(req)  # 发送页面请求
    # return response.read
    request = requests.post(url=url, headers=headers, data=json.dumps(values))
    dict = json.loads(request.content)
    return dict
a=create_triggers()
print a

一个成功的响应会包含 新创建的triggers 的IDs:

{
    "jsonrpc": "2.0",
    "result": {
        "triggerids": [
            "17369",
            "17370"
        ]
    },
    "id": 4
}


更新一个item:

启用一个item,设置它的状态为0


原文地址:https://www.cnblogs.com/hzcya1995/p/13349373.html