原文地址:https://www.jianshu.com/p/d5faa110e78e

zabbix 接口地址:https://www.zabbix.com/documentation/3.2/manual/api/reference/maintenance/object

zabbix 优势在于其丰富的api功能,可以高度定制化、扩展。笔者也是在使用了1年的API中收获颇丰。在cmdb资产管理功能、微信操作控制zabbix功能、获取zabbix数据制作报表等都利用到了zabbix api。

笔者把脚本脚本分为三个部分

  • 1.登陆脚本 login.py
  • 2.定义函数脚本 function.py
  • 3.调用执行脚本 zabbix.py

登陆脚本 login.py

  1. #!/usr/bin/env python
  2. import urllib2
  3. import json
  4. #定义URL账户密码
  5. url = 'http://zabbixip/zabbix/api_jsonrpc.php'
  6. username = 'admin'
  7. password = 'password'
  8. #定义通过HTTP方式访问API地址的函数,后面每次请求API的各个方法都会调用这个函数
  9. def requestJson(url,values):
  10. data = json.dumps(values)
  11. req = urllib2.Request(url, data, {'Content-Type': 'application/json-rpc'})
  12. response = urllib2.urlopen(req, data)
  13. output = json.loads(response.read())
  14. # print output
  15. try:
  16. message = output['result']
  17. except:
  18. message = output['error']['data']
  19. print message
  20. quit()
  21.  
  22. return output['result']
  23.  
  24. #API接口认证的函数,登录成功会返回一个Token
  25. def authenticate(url, username, password):
  26. values = {'jsonrpc': '2.0',
  27. 'method': 'user.login',
  28. 'params': {
  29. 'user': username,
  30. 'password': password
  31. },
  32. 'id': ''
  33. }
  34. idvalue = requestJson(url,values)
  35. return idvalue

定义函数脚本 function.py

(这里只是部分函数供参考更多查看官方文档)

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import sys
  4. import argparse
  5. import urllib2
  6. import json
  7.  
  8. #定义更新action函数
  9. def mediatypeupdate(mediatypeid,status,auth):
  10. values = {'jsonrpc': '2.0',
  11. 'method': 'mediatype.update',
  12. 'params': {
  13. "mediatypeid": mediatypeid,
  14. "status": status
  15. },
  16. 'auth': auth,
  17. 'id': ''
  18. }
  19. output = requestJson(url,values)
  20. #定义读取状态函数
  21. def triggerget(auth):
  22. values = {'jsonrpc': '2.0',
  23. "method":"trigger.get",
  24. "params": {
  25. "output": [
  26. "triggerid",
  27. "description",
  28. "priority"
  29. ],
  30. "filter": {
  31. "value": 1
  32. },
  33. "expandData":"hostname",
  34. "sortfield": "priority",
  35. "sortorder": "DESC"
  36. },
  37. 'auth': auth,
  38. 'id': ''
  39. }
  40. output = requestJson(url,values)
  41. return output
  42.  
  43. #定义通过ip获取主机id的函数
  44. def ipgetHostsid(ip,url,auth):
  45. values = {'jsonrpc': '2.0',
  46. 'method': 'host.get',
  47. 'params': {
  48. 'output': [ "host" ],
  49. 'filter': {
  50. 'ip': ip
  51. },
  52. },
  53. 'auth': auth,
  54. 'id': ''
  55. }
  56. output = requestJson(url,values)
  57. return output
  58.  
  59. #定义通过主机id获取开启关闭监控函数
  60. def idupdatehost(status,hostid,url,auth):
  61. values = {'jsonrpc': '2.0',
  62. 'method': 'host.update',
  63. 'params': {
  64. "hostid": hostid,
  65. "status": status
  66. },
  67. 'auth': auth,
  68. 'id': ''
  69. }
  70. output = requestJson(url,values)
  71. return output
  72. #定义通过项目hostid获取itemid函数
  73. def getHostsitemsid(hostid,itemsname,url,auth):
  74. values = {'jsonrpc': '2.0',
  75. 'method': "item.get",
  76. "params": {
  77. "output": ["itemids"],
  78. "hostids": hostid,
  79. "filter":{
  80. "key_": itemsname,
  81. },
  82. },
  83.  
  84. 'auth': auth,
  85. 'id': ''
  86. }
  87. output = requestJson(url,values)
  88. if len(output)==0:
  89. return output
  90. else:
  91. return output[0]['itemid']
  92.  
  93. #定义通过项目id获取监控项目最近值信息的函数
  94. def getHostsitemsvalue(itemid,url,auth):
  95. values = {'jsonrpc': '2.0',
  96. 'method': "history.get",
  97. "params": {
  98. "output": "extend",
  99. "history":3,
  100. "itemids":itemid,
  101. "sortfield": "clock",
  102. "sortorder": "DESC",
  103. "limit":1,
  104. },
  105.  
  106. 'auth': auth,
  107. 'id': ''
  108. }
  109. output = requestJson(url,values)
  110. if len(output)==0:
  111. return output
  112. else:
  113. return output[0]["value"]
  114.  
  115. #定义更新读取状态action函数
  116. def mediatypeget(mediatypeid,auth):
  117. values = {'jsonrpc': '2.0',
  118. 'method': 'mediatype.get',
  119. 'params': {
  120. "output": "extend",
  121.  
  122. "filter": {
  123. "mediatypeid":mediatypeid,
  124. },
  125. },
  126.  
  127. 'auth': auth,
  128. 'id': ''
  129. }
  130. output = requestJson(url,values)
  131. if len(output)==0:
  132. return output
  133. else:
  134. return output[0]['status']
  135.  
  136. #定义maintenance维修模式host函数
  137. def maintenancecreate(maintenancename,active_since,active_till,hostid,auth):
  138. values = {'jsonrpc': '2.0',
  139. 'method': 'maintenance.create',
  140. 'params': {
  141. "name": maintenancename,
  142. "active_since": active_since,
  143. "active_till": active_till,
  144. "hostids": [
  145. hostid
  146. ],
  147. "timeperiods": [
  148. {
  149. "timeperiod_type": 0,
  150. "every": 1,
  151. "dayofweek": 64,
  152. "start_time": 64800,
  153. "period": 3600
  154. }
  155. ]
  156. },
  157. 'auth': auth,
  158. 'id': ''
  159. }
  160. output = requestJson(url,values)
  161.  
  162. #定义通过模糊获取关闭主机信息函数
  163. def disabledhostget(url,auth):
  164. values = {'jsonrpc': '2.0',
  165. 'method': 'host.get',
  166. "params": {
  167. "output": ["host"],
  168. 'selectInterfaces': [ "ip" ],
  169. "filter": {
  170. "status":1
  171. }
  172. },
  173. 'auth': auth,
  174. 'id': ''
  175. }
  176. output = requestJson(url,values)
  177. return output
  178.  
  179. #定义maintenance维修模式group函数
  180. def maintenancecreategroup(maintenancename,active_since,active_till,groupid,auth):
  181. values = {'jsonrpc': '2.0',
  182. 'method': 'maintenance.create',
  183. 'params': {
  184. "name": maintenancename,
  185. "active_since": active_since,
  186. "active_till": active_till,
  187. "groupids": [
  188. groupid
  189. ],
  190. "timeperiods": [
  191. {
  192. "timeperiod_type": 0,
  193. "every": 1,
  194. "dayofweek": 64,
  195. "start_time": 64800,
  196. "period": 3600
  197. }
  198. ]
  199. },
  200. 'auth': auth,
  201. 'id': ''
  202. }
  203. output = requestJson(url,values)
  204.  
  205. #定义通过host groups named 获取groupid
  206. def groupnameGroupid(groupname,auth):
  207. values = {'jsonrpc': '2.0',
  208. 'method': 'hostgroup.get',
  209. "params": {
  210. "output": "extend",
  211. "filter": {
  212. "name": [
  213. groupname
  214. ]
  215. }
  216. },
  217. 'auth': auth,
  218. 'id': ''
  219. }
  220. output = requestJson(url,values)
  221. return output
  222.  
  223. #定义模糊查询维护主机
  224. def maintenanceget(url,auth):
  225. values = {'jsonrpc': '2.0',
  226. 'method': 'maintenance.get',
  227. "params": {
  228. "output": "extend",
  229. },
  230. 'auth': auth,
  231. 'id': ''
  232. }
  233. output = requestJson(url,values)
  234. return output
  235.  
  236. #定义批量恢复处于维护主机
  237. def maintenancedelete(maintenanceid,url,auth):
  238. values = {'jsonrpc': '2.0',
  239. 'method': 'maintenance.delete',
  240. "params": [
  241. maintenanceid
  242. ],
  243. 'auth': auth,
  244. 'id': ''
  245. }
  246. output = requestJson(url,values)
  247. return output
  248.  
  249. #定义通过hostid获取graphid的函数
  250. def getgraphid(hostid,graphname,url,auth):
  251. values = {'jsonrpc': '2.0',
  252. 'method': 'graph.get',
  253. 'params': {
  254. "output": "name",
  255. "hostids": hostid,
  256. "sortfield": "name",
  257. 'filter': {
  258. "name": graphname
  259. },
  260.  
  261. },
  262. 'auth': auth,
  263. 'id': ''
  264. }
  265. output = requestJson(url,values)
  266. return output

调用执行脚本 zabbix.py

1. 关闭、启用主机监控(poweronoff.py)

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import urllib2
  4. import sys
  5. import json
  6. import argparse
  7. from login import *
  8. from function import *
  9. #登陆zabbix获取auth
  10. auth = authenticate(url, username, password)
  11. #状态0是启用监控,1是禁用监控
  12. status=1
  13. #定义操作ip
  14. hostip='192.168.1.100'
  15. #通过hostip获取zabbix hostid
  16. hostids=ipgetHostsid(hostip,url,auth)
  17. hostid=hostids[0]['hostid']
  18. #通过主机id开启关闭监控
  19. idupdatehost(status,hostid,url,auth)

2. 添加维护周期(maintenance.py)

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3.  
  4. import urllib2
  5. import sys
  6. import json
  7. import argparse
  8. import time
  9. from login import *
  10. from function import *
  11.  
  12. def timetostamp(strtime):
  13. timeArrary = time.strptime(strtime, "%Y-%m-%d %H:%M")
  14. return int(time.mktime(timeArrary))
  15.  
  16. '''
  17. if __name__ == '__main__':
  18. __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。
  19. 这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
  20. 在你import别的py文件时,那个py文件会被存一份pyc加速下次装载。而主文件因为只需要装载一次就没有存pyc
  21. '''
  22.  
  23. #登陆zabbix获取auth
  24. auth = authenticate(url, username, password)
  25.  
  26. hostip='10.10.10.10'
  27. groupname='Zabbix Agent'
  28.  
  29. #通过hostip获取zabbix hostid
  30. hostids=ipgetHostsid(hostip,url,auth)
  31. hostid=hostids[0]['hostid']
  32.  
  33. #通过groupname获取zabbix groupid
  34. groupids=groupnameGroupid(groupname,auth)
  35. groupid=groupids[0]['groupid']
  36.  
  37. # 名称,描述,注意name不能重复
  38. name='Zabbix Agent group更新维护'
  39. desc = "这是一次全服更新维护,请悉知!"
  40.  
  41. # 维护时间
  42. dt_since = '2018-01-18 11:25'
  43. dt_till = '2018-01-18 13:25'
  44. active_since = timetostamp(dt_since)
  45. active_till = timetostamp(dt_till)
  46.  
  47. # 开始生效时间
  48. dt_start = '2018-01-18 12:30'
  49. start_date = timetostamp(dt_start)
  50.  
  51. # 持续时间,单位秒
  52. period = 600
  53. print 'period=%ds' % period
  54.  
  55. if __name__ == '__main__':
  56. maintenancecreate(name,active_since,active_till,desc,hostid,start_date,period,auth)
  57. maintenancecreategroup(name,active_since,active_till,desc,groupid,start_date,period,auth)

zabbix 接口 | zabbix api 实践的更多相关文章

  1. Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板

    场景 我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整 ...

  2. Zabbix监控系统深度实践

    Zabbix监控系统深度实践(企业级分布式系统自动化运维必选利器,大规模Zabbix集群实战经验技巧总结,由浅入深全面讲解配置.设计.案例和内部原理) 姚仁捷 著  ISBN 978-7-121-24 ...

  3. python调用zabbix接口实现Action配置

    要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...

  4. zabbix的Java API(一)

    上文说了,我是对zabbix做第二次开发的小白,既然要对zabbix做第二次开发又是小白,那么就得来研究zabbix提供的相关API了. 于是我在zabbix网站各种找,终于在下面网址找到了: htt ...

  5. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  6. 通过zabbix自带api进行主机的批量添加操作

    通过zabbix自带api进行批量添加主机 我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix ...

  7. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27    关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充   说道接口设计第一反应就是r ...

  8. Retrofit/OkHttp API接口加固技术实践(下)

    作者/Tamic http://blog.csdn.net/sk719887916/article/details/65448628 imageMogr2/auto-orient/strip%7Cim ...

  9. 利用python3 调用zabbix接口完成批量加聚合图形(screens)

    在上一篇博客中,我们完成的利用python3 调用zabbix接口批量增加主机,增加主机的item,增加主机的图形! 接下来我们完成批量增加主机的screen 首先我们要增加screen需要哪些参数呢 ...

随机推荐

  1. Android 修改Menu字体颜色和背景

    我们知道,在Android中修改TextView的字体颜色,一般是通过setTextColor()方法.虽说Android的Menu菜单项的每一项都是由TextView组成,但是Android的sdk ...

  2. ios点击链接直接跳转到 App Store 指定应用下载页面

    //跳转到应用页面 NSString  *str = [NSString stringWithFormat:@"http://itunes.apple.com/us/app/id%d&quo ...

  3. 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2  基准时间限制:2 秒 空 ...

  4. 草原psd素材

    草原PSD素材,草原,风景,蓝天白云,飞鸟,阳光,绿色,草地. http://www.huiyi8.com/caoyuan/psd/

  5. jmeter-sampler(取样器)HTTP请求

    名称:用于标识一个sample. 注释:对于测试没任何影响,仅用来记录用户可读的注释信息. 服务名称或IP:http请求发送的目标服务器名称或者IP地址,比如:http://www.baidu.com ...

  6. 集训Day12

    快乐 快乐就完事了 今天把Trie树 / 可持久化Trie树搞了一下 Trie树可以维护区间最大异或和 具体就是区间异或和 -> 区间两个前缀异或和的异或 然后就变成了 "从n个数里找 ...

  7. 集训Day5

    生活还得继续 bzoj3771 题面让我笑了很长时间 给出 n个物品,价值为别为Xi且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? *顺序不同算一种 很傻逼的一个母函数+容斥,用A( ...

  8. POJ-3680:Intervals (费用流)

    You are given N weighted open intervals. The ith interval covers (ai, bi) and weighs wi. Your task i ...

  9. MySQL11月16-11月21日活动赠送的优惠券使用率_20161124

    一.11.16到21号活动规则是 单笔订单最高的金额划分客户为399,799,1599元三档 达标的分别赠送对应的优惠券 优惠券ID有标号区间 THEN "1599档" ELSE ...

  10. P2024 [NOI2001]食物链[扩展域并查集]

    大水题一道啊,几分钟切掉. 还是扩展域,每个点拆3个点,之间连边表示有关系(即捕食关系).然后随便判定一下就好了,不难,毕竟NOI上古题目. #include<iostream> #inc ...