利用zabbix api 添加监控

2014年6月21日 发表评论 阅读评论

众所周知,zabbix是一款强大的分布式监控系统,集各家所长于一体,得到了广大SA的认可。其强大的管理界面也极其方便,但是美中不足的是,如果同时有大批量(50台+)的服务器需要添加监控时,这时,其图形界面反而显得有些臃肿了,好在zabbix 提供了一套强大的API管理接口,我们可以使用它快速地添加成千上万台服务器。

根据日常工作中常用到zabbix的功能,整理以下功能

1.基于zabbix 官方 api

2.提供查询单个或者多个host、hostgroup、template功能

3.提供增加host,hostgroup功能

4.提供disable host功能

5.增加删除host 功能

代码如下

#!/usr/bin/python
#coding:utf-8
import json
import urllib2
from urllib2 import URLError
import sys,argparse
class zabbix_api:
	def __init__(self):
	    self.url = 'http://localhost/api_jsonrpc.php' #修改URL
	    self.header = {"Content-Type":"application/json"}
	def user_login(self):
	    data = json.dumps({
	                       "jsonrpc": "2.0",
	                       "method": "user.login",
	                       "params": {
	                                  "user": "Admin", #修改用户名
	                                  "password": "zabbix" #修改密码
	                                  },
	                       "id": 0
	                       })
	    request = urllib2.Request(self.url, data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        print "33[041m 用户认证失败,请检查 !33[0m", e.code
	    else:
	        response = json.loads(result.read())
	        result.close()
	        #print response['result']
	        self.authID = response['result']
	        return self.authID
	def host_get(self,hostName=''):
	    data=json.dumps({
	            "jsonrpc": "2.0",
	            "method": "host.get",
	            "params": {
	                      "output": "extend",
	                      "filter":{"host":hostName}
	                      },
	            "auth": self.user_login(),
	            "id": 1
	            })
	    request = urllib2.Request(self.url,data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        if hasattr(e, 'reason'):
	            print 'We failed to reach a server.'
	            print 'Reason: ', e.reason
	        elif hasattr(e, 'code'):
	            print 'The server could not fulfill the request.'
	            print 'Error code: ', e.code
	    else:
	        response = json.loads(result.read())
	        #print response
	        result.close()
	        print "主机数量: 33[31m%s33[0m"%(len(response['result']))
	        for host in response['result']:
	            	status={"0":"OK","1":"Disabled"}
			available={"0":"Unknown","1":"available","2":"Unavailable"}
			#print host
			if len(hostName)==0:
                		print "HostID : %st HostName : %st Status :33[32m%s33[0m t Available :33[31m%s33[0m"%(host['hostid'],host['name'],status[host['status']],available[host['available']])
			else:
                		print "HostID : %st HostName : %st Status :33[32m%s33[0m t Available :33[31m%s33[0m"%(host['hostid'],host['name'],status[host['status']],available[host['available']])
				return host['hostid']
	def hostgroup_get(self, hostgroupName=''):
	    data = json.dumps({
	                       "jsonrpc":"2.0",
	                       "method":"hostgroup.get",
	                       "params":{
	                                 "output": "extend",
	                                 "filter": {
	                                            "name": hostgroupName
	                                            }
	                                 },
	                       "auth":self.user_login(),
	                       "id":1,
	                       })
	    request = urllib2.Request(self.url,data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        print "Error as ", e
	    else:
	        #print result.read()
	        response = json.loads(result.read())
	        result.close()
	        #print response()
	        for group in response['result']:
	        	if  len(hostgroupName)==0:
	          		print "hostgroup:  33[31m%s33[0m tgroupid : %s" %(group['name'],group['groupid'])
			else:
	          		print "hostgroup:  33[31m%s33[0mtgroupid : %s" %(group['name'],group['groupid'])
	           		self.hostgroupID = group['groupid']
	           		return group['groupid']
	def template_get(self,templateName=''):
	    data = json.dumps({
	                       "jsonrpc":"2.0",
	                       "method": "template.get",
	                       "params": {
	                                  "output": "extend",
	                                  "filter": {
	                                             "name":templateName
	                                             }
	                                  },
	                       "auth":self.user_login(),
	                       "id":1,
	                       })
	    request = urllib2.Request(self.url, data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        print "Error as ", e
	    else:
	        response = json.loads(result.read())
	        result.close()
	        #print response
	        for template in response['result']:
	            if len(templateName)==0:
	                print "template : 33[31m%s33[0mt  id : %s" % (template['name'], template['templateid'])
	            else:
	                self.templateID = response['result'][0]['templateid']
			print "Template Name :  33[31m%s33[0m "%templateName
	                return response['result'][0]['templateid']
	def hostgroup_create(self,hostgroupName):
	    if self.hostgroup_get(hostgroupName):
	        print "hostgroup  33[42m%s33[0m is exist !"%hostgroupName
	        sys.exit(1)
	    data = json.dumps({
	                      "jsonrpc": "2.0",
	                      "method": "hostgroup.create",
	                      "params": {
	                      "name": hostgroupName
	                      },
	                      "auth": self.user_login(),
	                      "id": 1
	                      })
	    request=urllib2.Request(self.url,data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        print "Error as ", e
	    else:
	        response = json.loads(result.read())
	        result.close()
	        print "33[042m 添加主机组:%s33[0m  hostgroupID : %s"%(hostgroupName,response['result']['groupids'])
	def host_create(self, hostip, hostgroupName, templateName):
 	    if self.host_get(hostip):
 		print "33[041m该主机已经添加!33[0m"
 		sys.exit(1)
	    group_list=[]
	    template_list=[]
	    for i in hostgroupName.split(','):
	        var = {}
	        var['groupid'] = self.hostgroup_get(i)
	        group_list.append(var)
	    for i in templateName.split(','):
	        var={}
	        var['templateid']=self.template_get(i)
	        template_list.append(var)
	    data = json.dumps({
	                       "jsonrpc":"2.0",
	                       "method":"host.create",
	                       "params":{
	                                 "host": hostip,
	                                 "interfaces": [
	                                 {
	                                 "type": 1,
	                                 "main": 1,
	                                 "useip": 1,
	                                 "ip": hostip,
	                                 "dns": "",
	                                 "port": "10050"
	                                  }
	                                 ],
	                               "groups": group_list,
	                               "templates": template_list,
	                                 },
	                       "auth": self.user_login(),
	                       "id":1
	    })
	    request = urllib2.Request(self.url, data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except URLError as e:
	        print "Error as ", e
	    else:
	        response = json.loads(result.read())
	        result.close()
	        print "添加主机 : 33[42m%s31[0m tid :33[31m%s33[0m" % (hostip, response['result']['hostids'])
	def host_disable(self,hostip):
		data=json.dumps({
		"jsonrpc": "2.0",
		"method": "host.update",
		"params": {
		"hostid": self.host_get(hostip),
		"status": 1
		},
		"auth": self.user_login(),
		"id": 1
		})
		request = urllib2.Request(self.url,data)
	    	for key in self.header:
	        	request.add_header(key, self.header[key])
	    	try:
	        	result = urllib2.urlopen(request)
	    	except URLError as e:
	        	print "Error as ", e
	    	else:
	        	response = json.loads(result.read())
	        	result.close()
	        	print '----主机现在状态------------'
			print self.host_get(hostip)
	def host_delete(self,hostid):
	    hostid_list=[]
	    #print type(hostid)
	    for i in hostid.split(','):
	        var = {}
	        var['hostid'] = self.host_get(i)
	        hostid_list.append(var)
	    data=json.dumps({
				"jsonrpc": "2.0",
				"method": "host.delete",
				"params": hostid_list,
	            "auth": self.user_login(),
	            "id": 1
	            })
	    request = urllib2.Request(self.url,data)
	    for key in self.header:
	        request.add_header(key, self.header[key])
	    try:
	        result = urllib2.urlopen(request)
	    except Exception,e:
	        print  e
	    else:
	        result.close()
       		print "主机 33[041m %s33[0m  已经删除 !"%hostid
if __name__ == "__main__":
	zabbix=zabbix_api()
	parser=argparse.ArgumentParser(description='zabbix  api ',usage='%(prog)s [options]')
	parser.add_argument('-H','--host',nargs='?',dest='listhost',default='host',help='查询主机')
	parser.add_argument('-G','--group',nargs='?',dest='listgroup',default='group',help='查询主机组')
	parser.add_argument('-T','--template',nargs='?',dest='listtemp',default='template',help='查询模板信息')
	parser.add_argument('-A','--add-group',nargs=1,dest='addgroup',help='添加主机组')
	parser.add_argument('-C','--add-host',dest='addhost',nargs=3,metavar=('192.168.2.1', 'test01,test02', 'Template01,Template02'),help='添加主机,多个主机组或模板使用分号')
	parser.add_argument('-d','--disable',dest='disablehost',nargs=1,metavar=('192.168.2.1'),help='禁用主机')
	parser.add_argument('-D','--delete',dest='deletehost',nargs='+',metavar=('192.168.2.1'),help='删除主机,多个主机之间用分号')
	parser.add_argument('-v','--version', action='version', version='%(prog)s 1.0')
	if len(sys.argv)==1:
		print parser.print_help()
	else:
		args=parser.parse_args()
		if args.listhost != 'host' :
			if args.listhost:
				zabbix.host_get(args.listhost)
			else:
				zabbix.host_get()
		if args.listgroup !='group':
			if args.listgroup:
				zabbix.hostgroup_get(args.listgroup)
			else:
				zabbix.hostgroup_get()
		if args.listtemp != 'template':
			if args.listtemp:
				zabbix.template_get(args.listtemp)
			else:
				zabbix.template_get()
		if args.addgroup:
			zabbix.hostgroup_create(args.addgroup[0])
		if args.addhost:
			zabbix.host_create(args.addhost[0], args.addhost[1], args.addhost[2])
		if args.disablehost:
			zabbix.host_disable(args.disablehost)
		if args.deletehost:
			zabbix.host_delete(args.deletehost[0])

点此下载上面的代码

用法如下

直接执行 python zabbix_api.py
    usage: zabbix_api.py [options]
    zabbix api
    optional arguments:
      -h, --help            show this help message and exit
      -H [LISTHOST], --host [LISTHOST]
                            查询主机
      -G [LISTGROUP], --group [LISTGROUP]
                            查询主机组
      -T [LISTTEMP], --template [LISTTEMP]
                            查询模板信息
      -A ADDGROUP, --add-group ADDGROUP
                            添加主机组
      -C 192.168.2.1 test01,test02 Template01,Template02, --add-host 192.168.2.1 test01,test02 Template01,Template02
                            添加主机,多个主机组或模板使用分号
      -d 192.168.2.1, --disable 192.168.2.1
                            禁用主机
      -D 192.168.2.1 [192.168.2.1 ...], --delete 192.168.2.1 [192.168.2.1 ...]
                            删除主机,多个主机之间用分号
      -v, --version         show program's version number and exit

示例

#!/usr/bin/python
#新增帮助信息,可直接执行脚本
zabbix=zabbix_api()
#获取所有主机列表
 zabbix.host_get()
#查询单个主机列表
 zabbix.host_get('192.168.2.1')
#获取所有主机组列表
 zabbix.hostgroup_get()
#查询单个主机组列表
 zabbix.hostgroup_get('test01')
#获取所有模板列表
 zabbix.template_get()
#查询单个模板信息
 zabbix.template_get('Template OS Linux')
#添加一个主机组
zabbix.hostgroup_create('test01')
#添加一个主机,支持将主机添加进多个组,多个模板,多个组、模板之间用逗号隔开,如果添加的组不存在,新创建组
zabbix.host_create('192.168.2.1', 'test01', 'Template OS Linux')
zabbix.host_create('192.168.2.1', 'Linux servers,test01 ', 'Template OS Linux,Template App MySQL')
#禁用一个主机
 zabbix.host_disable('192.168.2.1')
#删除host,支持删除多个,之间用逗号
zabbix.host_delete('192.168.2.1,192.168.2.2')

注:以上代码摘自互联网,个人感觉还是有点糙,主要同未实现增加主机别名和IP对应的功能。这里记下,以后在此基础上再做些优化。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: 开源软件 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.