• 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,用逗号分隔执行即可

  • 相关阅读:
    tf.cond()
    玩转Vue3之Composables
    【SpringCloud学习07】微服务保护之Sentinel(1)
    蓝桥杯真题 - 费解的开关题解
    小型洗衣机好用吗?最好用的迷你洗衣机
    <sa8650>sa8650开发板-之-刷机教程(flashing)
    Flink学习笔记(九)状态编程
    package-info.java
    开源小白到核心开发——我与 sealer 的成长故事
    单隐层神经网络在Matlab上实现及其简单应用
  • 原文地址:https://blog.csdn.net/lsysafe/article/details/126615214