在操作zabbix的时候,经常会遇到批量添加,更改的操作,一种方法是可以操作数据库,不过对于某些操作,zabbix数据库外键约束不强,是不太好操作数据库来解决的。另一种方式是使用zabbix的api。

下面是八牛同学对zabbix api做的封装,有兴趣的可以拿来用下,感谢八牛同学的支持。

import simplejson as json
import urllib2, subprocess, re, time
class ZabbixAPIException(Exception):
    pass
class ZabbixAPI(object):
    __auth = ''
    __id = 0
    _state = {}
    def __new__(cls, *args, **kw):
        if not cls._state.has_key(cls):
            cls._state[cls] = super(ZabbixAPI, cls).__new__(cls, *args, **kw)
        return cls._state[cls]
    def __init__(self, url, user, password):
        self.__url = url.rstrip('/') + '/api_jsonrpc.php'
        self.__user = user
        self.__password = password
        self._zabbix_api_object_list = ('Action', 'Alert', 'APIInfo', 'Application', 'DCheck', 'DHost', 'DRule',
                'DService', 'Event', 'Graph', 'Grahpitem', 'History', 'Host', 'Hostgroup', 'Image', 'Item',
                'Maintenance', 'Map', 'Mediatype', 'Proxy', 'Screen', 'Script', 'Template', 'Trigger', 'User',
                'Usergroup', 'Usermacro', 'Usermedia')
    def __getattr__(self, name):
        if name not in self._zabbix_api_object_list:
            raise ZabbixAPIException('No such API object: %s' % name)
        if not self.__dict__.has_key(name):
            self.__dict__[name] = ZabbixAPIObjectFactory(self, name)
        return self.__dict__[name]
    def login(self):
        user_info = {'user'     : self.__user,
                     'password' : self.__password}
        obj = self.json_obj('user.login', user_info)
        content = self.postRequest(obj)
        try:
            self.__auth = content['result']
        except KeyError, e:
            e = content['error']['data']
            raise ZabbixAPIException(e)
    def isLogin(self):
        return self.__auth != ''
    def __checkAuth__(self):
        if not self.isLogin():
            raise ZabbixAPIException("NOT logged in")
    def json_obj(self, method, params):
        obj = { 'jsonrpc' : '2.0',
                'method'  : method,
                'params'  : params,
                'auth'    : self.__auth,
                'id'      : self.__id}
        return json.dumps(obj)
    def postRequest(self, json_obj):
        #print 'Post: %s' % json_obj
        headers = { 'Content-Type' : 'application/json-rpc',
                    'User-Agent'   : 'python/zabbix_api'}
        req = urllib2.Request(self.__url, json_obj, headers)
        opener = urllib2.urlopen(req)
        content = json.loads(opener.read())
        self.__id += 1
        #print 'Receive: %s' % content
        return content
    '''
    /usr/local/zabbix/bin/zabbix_get is the default path to zabbix_get, it depends on the 'prefix' while install zabbix.
    plus, the ip(computer run this script) must be put into the conf of agent.
    '''
    @staticmethod
    def zabbixGet(ip, key):
        zabbix_get = subprocess.Popen('/apps/svr/zabbix/bin/zabbix_get  -s %s -k %s' % (ip, key), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        result, err = zabbix_get.communicate()
        if err:
            return 'ERROR'
        return result.strip()
    def createObject(self, object_name, *args, **kwargs):
        return object_name(self, *args, **kwargs)
    def getHostByHostid(self, hostids):
        if not isinstance(hostids,list):
            hostids = [hostids]
        return [dict['host'] for dict in self.host.get({'hostids':hostids,'output':'extend'})]
#################################################
#    Decorate Method
#################################################
def checkAuth(func):
    def ret(self, *args):
        self.__checkAuth__()
        return func(self, args)
    return ret
def postJson(method_name):
    def decorator(func):
        def wrapper(self, params):
            try:
                content = self.postRequest(self.json_obj(method_name, params))
                return content['result']
            except KeyError, e:
                e = content['error']['data']
                raise ZabbixAPIException(e)
        return wrapper
    return decorator
def ZabbixAPIObjectMethod(func):
    def wrapper(self, method_name, params):
        try:
            content = self.postRequest(self.json_obj(method_name, params))
            return content['result']
        except KeyError, e:
            e = content['error']['data']
            raise ZabbixAPIException(e)
    return wrapper
#################################################
#    Zabbix API Object (host, item...)  
#################################################
class ZabbixAPIObjectFactory(object):
    def __init__(self, zapi, object_name=''):
        self.__zapi = zapi
        self.__object_name = object_name
    def __checkAuth__(self):
        self.__zapi.__checkAuth__()
    def postRequest(self, json_obj):
        return self.__zapi.postRequest(json_obj)
    def json_obj(self, method, param):
        return self.__zapi.json_obj(method, param)
    def __getattr__(self, method_name):
        def method(params):
            return self.proxyMethod('%s.%s' % (self.__object_name,method_name), params)
        return method
    # 'find' method is a wrapper of get. Difference between 'get' and 'find' is that 'find' can create object you want while it dosn't exist
    def find(self, params, attr_name=None, to_create=False):
        filtered_list = []
        result = self.proxyMethod('%s.get' % self.__object_name, {'output':'extend','filter': params})
        if to_create and len(result) == 0:
            result = self.proxyMethod('%s.create' % self.__object_name, params)
            return result.values()[0]
        if attr_name is not None:
            for element in result:
                filtered_list.append(element[attr_name])
            return filtered_list
        else:
            return result
    @ZabbixAPIObjectMethod
    @checkAuth
    def proxyMethod(self, method_name, params):
        pass
def testCase():
    zapi = ZabbixAPI(url='xxxx', user='xxxx', password='xxxx')
    zapi.login()
    print zapi.Graph.find({'graphid':'221'}, attr_name='graphid')[0]
    #hostid = zapi.Host.find({'ip':'xxxxxx'}, attr_name='hostid')[0]
    print zapi.Host.find({'ip':'10.200.100.25'})
    print zapi.Host.exists({'filter':{'host':'GD9-DNS-001'}})
    #host = zapi.createObject(Host, 'HostToCreate')
    #item = host.getItem('444107')
    #zapi.host.get({'hostids':['16913','17411'],'output':'extend'})
    #group = zapi.createObject(Hostgroup, '926')
    #print zapi.getHostByHostid('16913')
if __name__ == '__main__':
    testCase()