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

  • 相关阅读:
    树的先序、中序、后序遍历
    面向对象编程 上 (1)
    vue下载在前端存放的pdf文件
    Linux下安装Docker保姆级教程
    TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案
    Python 操作 Excel,如何又快又好?
    CSA研讨会 | 研讨零信任SASE安全架构,吉利控股首谈其部署方案
    【心理学·人物】第二期(学术X综艺)
    视频编解码 — SVC可伸缩性
    vcomp100.dll丢失怎样修复?5个靠谱的修复方法分享
  • 原文地址:https://blog.csdn.net/lsysafe/article/details/126615214