前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >运维python进行(三) 用pytho

运维python进行(三) 用pytho

作者头像
py3study
发布2020-01-09 23:46:57
5770
发布2020-01-09 23:46:57
举报
文章被收录于专栏:python3python3

? zabbix是一款非常主流监控软件,以简单易用为人称道。zabbix拥有完善的api方便大家通过第三方调用,所以今天介绍一下如何利用python完成对zabbix api调用。

? ?zabbix api主要通过http协议进行通讯,这里我们使用数据是json格式数据进行交互。

这里先放一个官方文档的传送门方便大家翻阅

介绍

zabbix api的地址是“/api_jsonrpc.php”这里先用linux系统命令做个演示:如何获取zabbix的登录token,下面返回的结果是一个json对应的result是结果,也就是你想要得到的token

代码语言:javascript
复制
[root@salt-node1?zabbix]#?curl?-XPOST?http://192.168.198.116/api_jsonrpc.php??-H?'Content-Type:application/json'?-d?'{
>?????"jsonrpc":?"2.0",
>?????"method":?"user.login",
>?????"params":?{
>?????????"user":?"admin",
>?????????"password":?"zabbix"
>?????},
>?????"id":?0
>?}'
{"jsonrpc":"2.0","result":"f2e8bbaf7e5290d51914a78a0328f19e","id":0}

看上去只是一个post的http请求那我们就用python来搞一下吧

首先我们选的是urllib2模块,之所以用这个是因为python本身自带此模块增加系统的兼容性

代码语言:javascript
复制
[root@salt-node1?tmp]#?python?zabbix.py?
f037e64b7018fe987c3b1d3e1d717ecb
[root@salt-node1?tmp]#?cat?zabbix.py
#coding:utf-8
import?json
import?urllib2
import?logging
logging.basicConfig(filename='./my_log_test.log',format='%(asctime)s?-?%(name)s?-?%(levelname)s?-?%(message)s',level=logging.INFO)

zbx_url?=?'http://192.168.199.224:88/api_jsonrpc.php'
zabbix_user?=?'admin'
zabbix_pwd?=?'dianjoy.com'

def?get_token():
????url?=?zbx_url
????#这里定义一个header的字典,方便填写全部的http头信息
????header?=?{"Content-Type":?"application/json"}
????#?这里是一个需要发送的json数据
????data?=?'''{
????????????"jsonrpc":?"2.0",
????????????"method":?"user.login",
????????????"params":?{
????????????????"user":?"%s",
????????????????"password":?"%s"
????????????},
????????????"id":?0
????????}'''?%?(zabbix_user,zabbix_pwd)
????#?创建一个请求的对象
????request?=?urllib2.Request(url,data)
????#遍历获取http头信息
????for?key?in?header:
????????request.add_header(key,header[key])
????#发送请求,最终返回token
????try:
????????result?=?urllib2.urlopen(request)
????except?urllib2.URLError?as?e:
????????print?"Auth?Failed,?Please?Check?Your?Name?And?Password:",e.code
????else:
????????response?=?json.loads(result.read())
????????result.close()
????????return?response['result']
????????
print?get_zbx_token()

现在你已经获取到zabbix的token了就可以做一些别的事情了,

这里大家可以尝试获取一下主机信息

例子:

这是一个curl完成和获取主机信息的操作

代码语言:javascript
复制
[root@salt-node1?tmp]#??curl?-k??-H?'Content-Type:?application/json'?http://192.168.198.116/api_jsonrpc.php?-d?'{
>?????????"jsonrpc":?"2.0",
>?????????"method":?"host.get",
>?????????"params":?{
>?????????"output":?"extend",
>?????????"filter":?{
>?????????????"name":?[
>?????????????????"Zabbix?server"
>?????????????]
>?????????}
>?????????},
>?????????"auth":?"d6e4eb7e6bd884fec2ccffe4205d5960",
>?????????"id":?1?}'
{"jsonrpc":"2.0","result":[{"hostid":"10084","proxy_hostid":"0","host":"Zabbix?server","status":"0","disable_until":"0","error":"","available":"1","errors_from":"0","lastaccess":"0","ipmi_authtype":"-1","ipmi_privilege":"2","ipmi_username":"","ipmi_password":"","ipmi_disable_until":"0","ipmi_available":"0","snmp_disable_until":"0","snmp_available":"0","maintenanceid":"0","maintenance_status":"0","maintenance_type":"0","maintenance_from":"0","ipmi_errors_from":"0","snmp_errors_from":"0","ipmi_error":"","snmp_error":"","jmx_disable_until":"0","jmx_available":"0","jmx_errors_from":"0","jmx_error":"","name":"Zabbix?server","flags":"0","templateid":"0","description":"","tls_connect":"1","tls_accept":"1","tls_issuer":"","tls_subject":"","tls_psk_identity":"","tls_psk":""}],"id":1}

现在用python完成上面操作,因为zabbix api请求的json内主要三部分:操作zabbix方法,params,token会产生变化,所有这里构建了一个方法,只需要传入这三个参数即可

代码语言:javascript
复制
def?zbx_req(zbx_action,?zbx_params,?zbx_token):
????'''?get?host?info?'''
????header?=?{"Content-Type":?"application/json"}
????
????#zabbix?server的url地址
????url?=?zbx_url
????
????#构建请求的json数据
????data='''{
????"jsonrpc":?"2.0",
????"method":?"%s",
????"params":?%s,
????"auth":?"%s",
????"id":?1?}'''?%?(zbx_action,?zbx_params,?zbx_token)

????request?=?urllib2.Request(url,?data)
????for?key?in?header:
????????request.add_header(key,?header[key])
????#?请求zabbix获取返回结果
????try:
????????result?=?urllib2.urlopen(request)
????except?urllib2.URLError?as?e:
????????print?"request?Failed:",?e.code
????else:
????????#因为各种应用场景结果可能不通做了如下判断
????????#如果返回的json里面有error这个key代表请求失败,输出错误信息并返回False
????????#如果返回json没有result这个key代表结果也不是预期
????????#其它的直接返回json的result?key的内容
????????response?=?json.loads(result.read())
????????if?'error'?in?response:
????????????print?response['error']
????????????return?False
????????elif?not?response['result']:
????????????print?response
????????????return?False
????????else:
????????????return?response['result']
????????result.close()

#方法创建好了,这里把参数传入调用下下就好
zbx_token?=?get_zbx_token()
zbx_action?=?'host.get'
zbx_params?=?'''{
????"output":?"extend",
????"filter":?{
????"name":?["Zabbix?server"]
????}
????}'''
print?zbx_req(zbx_action,zbx_params,zbx_token)

脚本写执行下脚本试试把

代码语言:javascript
复制
[root@salt-node1?tmp]#?python?zabbix.py?
[{u'available':?u'1',?u'tls_connect':?u'1',?u'maintenance_type':?u'0',?u'ipmi_errors_from':?u'0',?u'ipmi_username':?u'',?u'snmp_disable_until':?u'0',?u'ipmi_authtype':?u'-1',?u'ipmi_disable_until':?u'0',?u'lastaccess':?u'0',?u'snmp_error':?u'',?u'tls_psk':?u'',?u'ipmi_privilege':?u'2',?u'jmx_error':?u'',?u'jmx_available':?u'0',?u'maintenanceid':?u'0',?u'snmp_available':?u'0',?u'tls_psk_identity':?u'',?u'status':?u'0',?u'description':?u'',?u'tls_accept':?u'1',?u'host':?u'Zabbix?server',?u'disable_until':?u'0',?u'ipmi_password':?u'',?u'templateid':?u'0',?u'tls_issuer':?u'',?u'ipmi_available':?u'0',?u'maintenance_status':?u'0',?u'snmp_errors_from':?u'0',?u'ipmi_error':?u'',?u'proxy_hostid':?u'0',?u'hostid':?u'10084',?u'name':?u'Zabbix?server',?u'jmx_errors_from':?u'0',?u'jmx_disable_until':?u'0',?u'flags':?u'0',?u'error':?u'',?u'maintenance_from':?u'0',?u'tls_subject':?u'',?u'errors_from':?u'0'}]

拓展1

相信大家学到这里还不满足,懒是永无止境的,我根据自己情况继续把用法继续封装,根据自己的需求封装一个创建主机的方法

代码语言:javascript
复制
class?Zbx_api(object):
????def?zbx_create_host(self,hostname,inter_ip,group_id,temlpate_id):
????????self.hostname?=?hostname
????????self.inter_ip?=?inter_ip
????????self.group_id?=?group_id
????????self.temlpate_id?=?temlpate_id
????????'''创建主机
????????????hostname?:主机名
????????????inter_ip?:主机IP
????????????gourp_id?:组id
????????????template_id?:?监控模版id
????????????zbx_create_host('salt-node1','192.168.198.116','4','10001')
????????'''
????????zbx_action?=?'host.create'
????????zbx_params?=?'''{
????????????"host":?"%s",
????????????"interfaces":?[
????????????????{
????????????????????"type":?1,
????????????????????"main":?1,
????????????????????"useip":?1,
????????????????????"ip":?"%s",
????????????????????"dns":?"",
????????????????????"port":?"10050"
????????????????}
????????????],
????????????"groups":?[
????????????????{
????????????????????"groupid":?"%s"
????????????????}
????????????],
????????????"templates":?[
????????????????{
????????????????????"templateid":?"%s"
????????????????}
????????????],
????????????"inventory_mode":?0,
????????????"inventory":?{
????????????????"macaddress_a":?"nginxs.net",
????????????????"macaddress_b":?"nginxs.net"
????????????}
????????}'''?%?(hostname,inter_ip,group_id,temlpate_id)
????????r=Zbx_base_api(zbx_action,zbx_params)
????????return?r.zbx_req()

拓展2

例如我经常需要把一个group的主机的eth0网卡和CPU负载创建一个screen那我们得用python完成下面几项操作:

1. 创建一个方法获取一个主机组的指定graph id

2. 创建一个方法只要传入screen name,graph id就可以创建一个screen

代码语言:javascript
复制
????def?zbx_create_screen(self,screen_name,screen_high,screen_width):
????????'''创建screen
????????name?:?SCREEN的名字
????????hsize:?screen的行数
????????vsize:?screen的列数
????????screenitems:?screen里面的item
????????????resourcetype?:?当前数据源的类型"graph","map","url"更多请看传送门https://www.zabbix.com/documentation/2.4/manual/api/reference/screenitem/object#screen_item
????????????resourceid:?itemid
????????????rowspan:?占据行数
????????????colspan:占据列数
????????????x:?屏幕x坐标轴位置
????????????y:??屏幕y坐标轴位置
?????????'''
????????self.screen_name?=?screen_name
????????self.screen_high?=?screen_high
????????self.screen_width?=?screen_width
????????zbx_action?=?'screen.create'
????????zbx_params?=?'''{
????????"name":?"%s",
????????"hsize":?%s,
????????"vsize":?%s,
????????"screenitems":?[
????????????{
????????????????"resourcetype":?0,
????????????????"resourceid":?"524",
????????????????"rowspan":?1,
????????????????"colspan":?1,
????????????????"x":?0,
????????????????"y":?2
????????????}
????????]
????}'''?%?(self.screen_name,self.screen_high,self.screen_width)
????????print???zbx_params
????????r=Zbx_base_api(zbx_action,zbx_params)
????????return?zbx_req()
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com