zoukankan      html  css  js  c++  java
  • 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
    
    

  • 相关阅读:
    Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称
    eclipse设置新建jsp文件默认字符编码为utf-8
    mysql数据库无法插入中文字符
    Dos中查看mysql数据时 中文乱码
    spring 解决中文乱码问题
    mysql再次安装问题
    The import javax.servlet cannot be resolved
    eclipse快捷键补全
    eclipse自动补全
    hibernate运行常见错误
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349373.html
Copyright © 2011-2022 走看看