现在的位置: 主页 > 公司荣誉 > 文章列表

基于zabbix用Python写一个运维流量气象图

作者:石家庄绿之洲商贸有限公司 来源:www.365tt315.com 未知发布时间:2017-09-06 10:14:38
基于zabbix用Python写一个运维流量气象图

前言:同事问我,你写运维平台最先写哪一部分?好吧,还真把我问倒了,因为这是在问最应该放在放在第一位的东西~作为一个工作不足两年,运维不足一年的新手来说,还真不敢妄下评论,其实按照我的思路,觉得最重要的部分肯定是故障处理,报警,但是这一块怎么写?怎么说?肯定不能重复造轮子了,不过我最想写的是报表系统,思路是有的,但是一直耽搁了,详情参考。

好吧,在回到那个问题,应该先写哪个部分。我没回答,反问他了。

他说,应该是运维气象图,这张图上有各个节点的位置,并且标注出流量情况,如果我们在服务器发生故障的时候发现其中一个节点流量过高或者过低,或者一些其他指标,我们在一定程度上可以快速的地位故障的位置。注:cacti,zabbix似乎是有这个插件的,不过不是那么好看,或者有一定局限性,我也没调查过,反正不想用。

然后,我被上了一课, 那么为毛类似这样的应用或者框架之类的(除了上面说的两个插件,本人暂时没有Google或百度到,如果你知道抨击一下我呗,当然,最好是Python开发的,我好自定义一下),他说,收费的软件有~~~

首先瞧瞧我花了几天鼓捣出来的Beta版本吧:

wKioL1bcIAqwbO3OAACOSx9nVX4089.png

现在,正题~~~

如果你不会python就收藏着以后看吧,当下就看看思路吧。

如果你会python就在涉猎一下JS吧,比如AngularJS,D3JS什么的,不过可以

如果你什么都不会,希望能激发你的兴趣。

如果你是大神,还执意要看就忽略我代码中的一些写的不优雅,不好看的地方吧T_T

题外话:话说,有什么觉得比较实用的功能是需要收费的,或者一些想法需要实现的可以Q我,我们把它实现了(仅限于大概一周以内能写完的,特别有意思的来说)

授人以鱼不如授人以渔嘛,主要两部分,一部分思路,一部分代码讲解

(一)

思路

Q:数据来源,通过写客户端?

A:当然不,nagios,cacti,zabbix什么的不是有一大堆么,为毛还要自己写,而且还不一定写的比别人好,美其名曰不愿重复造轮子~~~根据自己情况选择吧,这里就选的通过zabbix的API作为数据来源。

Q:用什么web框架?

A:用Flask,很喜欢一句从网上看来的评论django的话,上它的人很多,喜欢它的很少,再者,我实在不想去配置什么配置文件,以及帮我创建一大堆文件(当然也可以不需要),再再者,我的功能不需要太多,再再再者,flask的官方文档写得太棒了~~~

然后瞧瞧我们写什么,完成什么~

代码实现:

web框架flask

功能页面:

页面一:展示页面(bootstrap提供样式效果,AngularJS实时数据查询并刷新,为毛不用jQuery?因为jQuery我不会T_T)

页面二:数据查询接口

代码文件:

一:用于查询数据的py模块 x 1

二:用于提供web界面的py文件 x 1

三:html模板文件 x 3

四:js文件 x 2

注:其实个人不建议用模板渲染直接把数据渲染到展示页面上去,虽然这样不用写js了,但是写到后面,你就难过了,所以前台后台分离吧,这里也是前台后台分离,前台bootstrap加AngularJS~~~

(二)

代码

zabbix数据获取

获取zabbix数据可参考:第三部分~~

所以直接放代码吧~~

#coding=utf-8 importjson importrequests frompprintimportpprint fromosimportpath ###zabbixapi访问地址 zabbix_pre="" zabbix_url=zabbix_pre+"/api_jsonrpc.php" ###用户名密码 user="" passwd="" ###这里只查询进出口流量,所以只有下面两个关键字,后面可能会查询一些其他的~~~ net_in="net.if.in[eth0]" net_out="net.if.out[eth0]" ###构造post请求提交的数据 auth_data=json.dumps( { "jsonrpc":"2.0", "method":"user.login", "params":{ "user":"%s"%user, "password":"%s"%passwd }, "id":0 }) ###http头部信息,zabbix要求的 headers={ 'content-type':'application/json', } ###构造一个返回查询hostid的json数据,函数是一等公民~~~ defhost_data(auth): data=json.dumps( { "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["hostid","host"], "search":{"host":""} }, "auth":"%s"%auth, "id":1, }) returndata ###如上,查询hostid defhost_data_search(auth,search): data=json.dumps( { "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["hostid","name"], "search":{"host":search} }, "auth":"%s"%auth, "id":1, }) ###如上,查询itemid defitem_data_filter1(auth,hostid,filters): data=json.dumps( { "jsonrpc":"2.0", "method":"item.get", "params":{ "output":["itemid"], "hostids":"%s"%hostid, "search":{ "key_":filters } }, "auth":"%s"%auth, "id":1, }) returndata ###如上,查询item的所有信息,hostname,itemid一大堆 defitem_data_filter2(auth,hostid,filters): data=json.dumps( { "jsonrpc":"2.0", "method":"item.get", "params":{ "output":"extend", "hostids":"%s"%hostid, "filter":{ "name":filters }, "sortfield":"name" }, "auth":"%s"%auth, "id":1 }) returndata ###如上,获取最新监控值 defhistory_data(auth,itemid,limit,his=0): data=json.dumps( { "jsonrpc":"2.0", "method":"history.get", "params":{ "output":"extend", "history":his, "sortfield":"clock", "sortorder":"DESC", "itemids":"%s"%itemid, "limit":limit }, "auth":"%s"%auth, "id":1, }) returndata ###构造获取zabbix验证id,为了反复操作,当然封装成函数 defgetauth(zabbix_url,auth_data,headers): auth_ret=requests.post(zabbix_url,data=auth_data,headers=headers) auth_id=auth_ret.json()["result"] returnauth_id ###将所有结果保存成本地之间,结果包括,主机名(这里指zabbix上的命名),hostid,出入口的itemid defsavefile(): host_ret=requests.post(zabbix_url,data=host_data(auth_id),headers=headers) host_ret=host_ret.json()["result"] ###这里请根据实际情况设定,比如包括nginx集群,mysql集群,tomcat集群,如下 json_all={} json_all["nginx_cluster"]={} json_all["tomcat_cluster"]={} json_all["mysql_cluster"]={} forhostinhost_ret: hostid=host["hostid"] hostname=host["host"] item_ret=requests.post(zabbix_url,data=item_data_filter1(auth_id,hostid,"net.if"),\ headers=headers) item_ret=item_ret.json()["result"] #pprint(item_ret) item_in=item_ret[0]["itemid"] item_out=item_ret[1]["itemid"] """"这里如上,根据实际情况设定 if"nginx"inhostname: json_all["nginx_cluster"][hostname]=[hostid,item_in,item_out] elif"tomcat"inhostname: json_all["tomcat_cluster"][hostname]=[hostid,item_in,item_out] elif"mysql"inhostname: json_all["mysql_cluster"][hostname]=[hostid,item_in,item_out] else: pass""" #pprint(json_all) fp=open("clusters.json","w") fp.write(json.dumps(json_all)) fp.close() ###然后通过itemid获取最新的监控值 defgethist(auth_id,itemid,limit,outtype=3): whilenotpath.isfile("clusters.json"): savefile() history_ret=requests.post(zabbix_url,data=history_data(auth_id,itemid,limit,outtype),\ headers=headers) #printhistory_ret.json() iflen(history_ret.json()["result"])==0: return0 else: history_ret=history_ret.json()["result"][0] #pprint(history_ret["value"]) returnhistory_ret["value"] ###然后通过集群名获取整个集群的总和监控值 defgethist_cluster(auth_id,cluster_name,opt): clsname=cluster_name opt=opt auth_id=getauth(zabbix_url,auth_data,headers) whilenotpath.isfile("clusters.json"): savefile() cluster_file=json.load(open("clusters.json","r")) net_list={"in":1,"out":2} ifclsnameincluster_file.keys()andoptinnet_list.keys(): sum=0 cls=cluster_file[clsname] inf=net_list[opt] forhostincls: itemid=cls[host][inf] his_ret=int(gethist(auth_id,itemid,1,3)) sum=sum+his_ret #printfloat(sum)/float(1024) returnfloat(sum)/float(1024) auth_id=getauth(zabbix_url,auth_data,headers) #gethist(auth_id,25919,1,3) printgethist_cluster(auth_id,"mysql_cluster","in")

然后将上面的代码保存为getsource.py文件用作模块导入,之所以不将所有py代码不写在一起也是为了更好看,更容易反复使用。

注:如果主机多的话会很慢吧~~~因为我没有写并发

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:潜江网站制作 http://qianjiang.666rj.com

上一篇:python(八)socket网络编程 下一篇:最后一页