• PYTHON访问ZABBIX的API批量对端口进行监控并创建触发器


    IP+端口作为监控的对象,对多台服务器的多个端口批量增加监控项,并配置对应的触发器

    1. #!/usr/local/bin/python
    2. # coding:utf-8
    3. import json
    4. import urllib2
    5. from urllib2 import URLError
    6. import sys
    7. import xlrd
    8. import getpass
    9. import time
    10. import datetime
    11. import xlsxwriter
    12. reload(sys)
    13. sys.setdefaultencoding('utf-8')
    14. class ZabbixTools:
    15. def __init__(self):
    16. self.url = 'http://192.168.243.99//zabbix/api_jsonrpc.php'
    17. self.header = {'User-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0',
    18. "Content-Type": "application/json"}
    19. def user_login(self):
    20. data = json.dumps({
    21. "jsonrpc": "2.0",
    22. "method": "user.login",
    23. "params": {
    24. "user": "Admin",
    25. "password": "zabbix"
    26. },
    27. "id": 0
    28. })
    29. request = urllib2.Request(self.url, data)
    30. for key in self.header:
    31. request.add_header(key, self.header[key])
    32. try:
    33. result = urllib2.urlopen(request)
    34. except URLError as e:
    35. print("Auth Failed, please Check your name and password:", e.code)
    36. else:
    37. response = json.loads(result.read())
    38. result.close()
    39. self.authID = response['result']
    40. return self.authID
    41. def host_getbyip(self,hostip):
    42. data = json.dumps({
    43. "jsonrpc":"2.0",
    44. "method":"host.get",
    45. "params":{
    46. "output":["hostid","name","status","available","proxy_hostid"],
    47. "filter": {"ip": hostip}
    48. },
    49. #"auth":self.user_login(),
    50. "auth": self.authID,
    51. "id":1,
    52. })
    53. request = urllib2.Request(self.url, data)
    54. for key in self.header:
    55. request.add_header(key, self.header[key])
    56. try:
    57. result = urllib2.urlopen(request)
    58. except URLError as e:
    59. if hasattr(e, 'reason'):
    60. print 'We failed to reach a server.'
    61. print 'Reason: ', e.reason
    62. elif hasattr(e, 'code'):
    63. print 'The server could not fulfill the request.'
    64. print 'Error code: ', e.code
    65. else:
    66. response = json.loads(result.read())
    67. result.close()
    68. #print "Number Of %s: " % hostName, len(response['result'])
    69. lens=len(response['result'])
    70. #print response["result"]
    71. if lens > 1:
    72. print hostip+"大于1"
    73. # for re1 in response['result']:
    74. # print re1['name']
    75. if lens > 0:
    76. #return response['result'][0]['name']
    77. #print response['result'][0]['status']
    78. print hostip,response['result'][0]['proxy_hostid']+" "+"状态"+response['result'][0]['available'] +" "+response['result'][0]['name'] + " "+response['result'][0]['hostid']
    79. return response['result'][0]['hostid']
    80. else:
    81. print "error "+hostip
    82. return "error"
    83. #创建监控项
    84. def itemcreate(self,hostip,ports):
    85. item_key = 'net.tcp.listen[' + ports + ']'
    86. hostid=self.host_getbyip(hostip)
    87. if hostid=="error":
    88. return "error","error","error"
    89. interfaceid=self.getinterfaceidbyhostid(hostid)
    90. if interfaceid=="error":
    91. return "error","error","error"
    92. data = json.dumps({
    93. "jsonrpc": "2.0",
    94. "method": "item.create",
    95. "params": {
    96. "name": "ZABBIX端口监控"+ports,
    97. "key_": item_key,
    98. "hostid": hostid,
    99. "type": 0,
    100. "value_type": 3,
    101. "interfaceid": interfaceid,
    102. "delay": "60s"},
    103. "auth": self.authID,
    104. "id": 1,
    105. })
    106. request = urllib2.Request(self.url, data)
    107. for key in self.header:
    108. request.add_header(key, self.header[key])
    109. try:
    110. result = urllib2.urlopen(request)
    111. except URLError as e:
    112. print "Error as ", e
    113. else:
    114. response = json.loads(result.read())
    115. result.close()
    116. #print response
    117. #lens = len(response['result'])
    118. if response.has_key("result"):
    119. print response['result']["itemids"]
    120. return hostid,item_key,ports
    121. else:
    122. return "error","error","error"
    123. #创建触发器
    124. def triggercreate(self,hostid,item_key,ports):
    125. description = "ZABBIX监控" + ports + "端口告警"
    126. hostname=self.host_idgetrehost(hostid)
    127. if hostname=="error":
    128. return
    129. expression = '{' + hostname + ":" + item_key+".last()}=0"
    130. data = json.dumps({
    131. "jsonrpc": "2.0",
    132. "method": "trigger.create",
    133. "params": {
    134. "description": description,
    135. "expression": expression,
    136. "priority": 5,
    137. "status": 1 #0启用,1禁用
    138. },
    139. "auth": self.authID,
    140. "id": 1,
    141. })
    142. request = urllib2.Request(self.url, data)
    143. for key in self.header:
    144. request.add_header(key, self.header[key])
    145. try:
    146. result = urllib2.urlopen(request)
    147. except URLError as e:
    148. print "Error as ", e
    149. else:
    150. response = json.loads(result.read())
    151. result.close()
    152. print response['result']["triggerids"]
    153. #获取interfaceid,用于创建监控项
    154. def getinterfaceidbyhostid(self,hostid):
    155. data = json.dumps({
    156. "jsonrpc": "2.0",
    157. "method": "hostinterface.get",
    158. "params": {
    159. "output": "extend",
    160. "hostids": hostid
    161. },
    162. "auth": self.authID,
    163. "id": 1,
    164. })
    165. request = urllib2.Request(self.url, data)
    166. for key in self.header:
    167. request.add_header(key, self.header[key])
    168. try:
    169. result = urllib2.urlopen(request)
    170. except URLError as e:
    171. if hasattr(e, 'reason'):
    172. print 'We failed to reach a server.'
    173. print 'Reason: ', e.reason
    174. return "error"
    175. elif hasattr(e, 'code'):
    176. print 'The server could not fulfill the request.'
    177. print 'Error code: ', e.code
    178. return "error"
    179. else:
    180. response = json.loads(result.read())
    181. result.close()
    182. lens = len(response['result'])
    183. if lens > 0:
    184. return response['result'][0]['interfaceid']
    185. else:
    186. return "error"
    187. #获取主机名,用于创建触发器
    188. def host_idgetrehost(self,hostids):
    189. data = json.dumps({
    190. "jsonrpc":"2.0",
    191. "method":"host.get",
    192. "params":{
    193. "output":["hostid","host","name","status","available"],
    194. "filter":{"hostid":hostids}
    195. },
    196. "auth":self.user_login(),
    197. "id":1,
    198. })
    199. request = urllib2.Request(self.url, data)
    200. for key in self.header:
    201. request.add_header(key, self.header[key])
    202. try:
    203. result = urllib2.urlopen(request)
    204. except URLError as e:
    205. if hasattr(e, 'reason'):
    206. print 'We failed to reach a server.'
    207. print 'Reason: ', e.reason
    208. elif hasattr(e, 'code'):
    209. print 'The server could not fulfill the request.'
    210. print 'Error code: ', e.code
    211. else:
    212. response = json.loads(result.read())
    213. result.close()
    214. #print "Number Of %s: " % hostName, len(response['result'])
    215. lens=len(response['result'])
    216. if lens > 0:
    217. #return response['result'][0]['name']
    218. #print response['result'][0]['status']
    219. #print response['result'][0]['available'] +" "+response['result'][0]['name']
    220. return response['result'][0]['host']
    221. else:
    222. return "error"
    223. def additemandtrigger():
    224. test = autozabbixcopy.ZabbixTools()
    225. test.user_login()
    226. myfile = open("ipports.txt", 'r')
    227. for line in myfile:
    228. con = line.split(",")
    229. ips = con[0].strip()
    230. ports = con[1].strip()
    231. ids, keys, portss = test.itemcreate(ips, ports)
    232. if ids == "error":
    233. continue
    234. test.triggercreate(ids, keys, portss)
    235. if __name__ == "__main__":
    236. test = ZabbixTools()
    237. test.user_login()
    238. additemandtrigger()

    把IP和端口写在同目录的ipports.txt,用逗号分隔执行即可

  • 相关阅读:
    售后处置跟踪系统设想
    mysql中group by的使用
    小程序运行机制分析
    超声波波形生成电路设计
    springboot+jsp+ssm手办周边商城购物网站306
    【Java 进阶 - 目录】
    windows 下编译libcurl openssl
    二叉树的存储
    大学生网课搜题公众号如何搭建?
    LeetCode --- 1528. Shuffle String 解题报告
  • 原文地址:https://blog.csdn.net/lsysafe/article/details/126615214