Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法


Posted in Python onSeptember 17, 2018

Python编写从ZabbixAPI获取信息

此脚本用Python3.6执行是OK的。
# -*- coding: utf-8 -*-
import json
import urllib.request, urllib.error, urllib.parse
class ZabbixAPI:
 def __init__(self):
  self.__url = 'http://192.168.56.102/zabbix/api_jsonrpc.php'
  self.__user = 'admin'
  self.__password = 'zabbix'
  self.__header = {"Content-Type": "application/json-rpc"}
  self.__token_id = self.UserLogin()
 #登陆获取token
 def UserLogin(self):
  data = {
   "jsonrpc": "2.0",
   "method": "user.login",
   "params": {
    "user": self.__user,
    "password": self.__password
   },
   "id": 0,
  }
  return self.PostRequest(data)
 #推送请求
 def PostRequest(self, data):
  request = urllib.request.Request(self.__url,json.dumps(data).encode('utf-8'),self.__header)
  result = urllib.request.urlopen(request)
  response = json.loads(result.read().decode('utf-8'))
  try:
   # print response['result']
   return response['result']
  except KeyError:
   raise KeyError
 #主机列表
 def HostGet(self,hostid=None,hostip=None):
  data = {
   "jsonrpc":"2.0",
   "method":"host.get",
   "params":{
    "output":"extend",
    "selectGroups": "extend",
    "selectParentTemplates": ["templateid","name"],
    "selectInterfaces": ["interfaceid","ip"],
    "selectInventory": ["os"],
    "selectItems":["itemid","name"],
    "selectGraphs":["graphid","name"],
    "selectApplications":["applicationid","name"],
    "selectTriggers":["triggerid","name"],
    "selectScreens":["screenid","name"]
   },
   "auth": self.__token_id,
   "id":1,
  }
  if hostid:
   data["params"]={
    "output": "extend",
    "hostids": hostid,
    "sortfield": "name"
   }
  return self.PostRequest(data)
 #主机列表
 def HostCreate(self,hostname,hostip,groupid=None,templateid=None):
  data = {
   "jsonrpc":"2.0",
   "method":"host.create",
   "params": {
    "host": hostname,
    "interfaces": [
     {
      "type": 1,
      "main": 1,
      "useip": 1,
      "ip": hostip,
      "dns": "",
      "port": "10050"
     }
    ],
    "groups": [
     {
      "groupid": groupid
     }
    ],
    "templates": [
     {
      "templateid": templateid
     }
    ]
   },
   "auth": self.__token_id,
   "id":1,
  }
  return self.PostRequest(data)
 #主机组列表
 def HostGroupGet(self,hostid=None,itemid=None):
  data = {
   "jsonrpc":"2.0",
   "method":"hostgroup.get",
   "params":{
    "output": "extend",
    "hostids": hostid,
    "itemids": itemid,
    "sortfield": "name"
   },
   "auth": self.__token_id,
   "id":1,
  }
  return self.PostRequest(data)
 #监控项列表
 def ItemGet(self,hostid=None,itemid=None):
  data = {
   "jsonrpc":"2.0",
   "method": "item.get",
   "params": {
    "output": "extend",
    "hostids": hostid,
    "itemids": itemid,
    "sortfield": "name"
   },
   "auth": self.__token_id,
   "id":1,
  }
  return self.PostRequest(data)
 #模板列表
 def TemplateGet(self, hostid=None,templateid=None):
  data = {
   "jsonrpc":"2.0",
   "method": "template.get",
   "params": {
    "output": "extend",
    "hostids": hostid,
    "templateids": templateid,
    "sortfield": "name"
   },
   "auth": self.__token_id,
   "id":1,
  }
  return self.PostRequest(data)
 #图像列表
 def GraphGet(self,hostid=None,graphid=None):
  data = {
   "jsonrpc":"2.0",
   "method": "graph.get",
   "params": {
    "output": "extend",
    "hostids": hostid,
    "graphids": graphid,
    "sortfield": "name"
   },
   "auth": self.__token_id,
   "id":1,
  }
  return self.PostRequest(data)
 #历史数据
 def History(self,itemid,data_type):
  data = {
   "jsonrpc": "2.0",
   "method": "history.get",
   "params": {
    "output": "extend",
    "history": data_type,
    "itemids": itemid,
    "sortfield": "clock",
    "sortorder": "DESC",
    "limit": 30
   },
   "auth": self.__token_id,
   "id": 2
  }
  return self.PostRequest(data)
#测试:python manager.py shell ; from ZABBIX.ZabbixAPI import * ; main(),代码修改了要ctrl+Z退出重进
def main():
 zapi=ZabbixAPI()
 token=zapi.UserLogin()
 print(token)
 #39378ec03aa101c2b17d1d2bd6f4ef16
 hosts=zapi.HostGet()
 print(hosts)
 #[{u'host': u'Zabbix server', u'hostid': u'10084', u'interfaces': [{u'interfaceid': u'1', u'ip': u'127.0.0.1'}]}]
if __name__ == '__main__':
 main()

下面看下使用python实现 Zabbix-API 监控的方法

Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法

做运维的朋友应该知道,公司IDC机房经常有上架、下架、报修和报废的服务器。如果服务器数量很多的时候很容易造成监控遗漏。

       大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统)集成在一起,当上架一台新机器的时候CMDB里面会记录相关的信息,Zabbix根据CMDB里面信息自动Link相关的模块,添加|删除监控。很多小的公司没有资产管理系统,但作为监控的负责人应该每天知道上架了哪些新的机器,确保能添加到Zabbix监控里面。
      首先给大家说一下脚本思路:

1)通过Nmap工具扫描网段,扫描出已经使用的IP地址。
2)通过Nmap检测已经扫描IP的3389或者22端口是否开放,可以判断那些事windows机器,那些是Linux机器。
3)Linux下面通过ssh + hostname命令找出Linux主机名。
4)Windows下面通过nmblookup -A 命令找出Windows主机名。
5)用Python脚本读扫描结果文件,把主机名写到列表里面。
6)用Zabbix python API 调用已经监控的主机名,写到列表里面。
7)两个列表取交集,用for循环判断哪些主机名没有监控。
8)发邮件通知监控负责人。

    下面我分享一下我写的Python写的脚本,其中scan_machine.sh是我调用的用Shell写的关于Nmap扫描的脚本,scan_hostname.log是Nmap扫描的结果,里面内容是IP 主机名。

#!/usr/bin/env python#create by:sfzhang 20140820#coding=utf-8import os,sysimport jsonimport urllib2import datetime,timefrom urllib2 import URLError
nmap_cmd = "/shell/machine/scan_machine.sh"def runCmd(command):
 global mail_cmd
 mail_cmd = '''mail -s "Report on not monitor Hosts of Zabbix" shifeng_zhang88 < /shell/machine/result/result.txt'''
 return os.system(command)runCmd(nmap_cmd)def nmap_host():
 hostiplst = []
 hostnamelst = []
 f = file('/shell/machine/result/scan_hostname.log')
 for line in f.readlines():
 hostip = line.split()[0]
 hostname = line.split()[1]
 hostiplst.append(hostip)
 hostnamelst.append(hostname)
 hostnamelst.sort()
 #print hostiplst
 return hostnamelst
 f.close()def zabbix_host():
 zabbixhostlst= []
 #based url and required header
 url = "http://192.168.161.128/api_jsonrpc.php"
 header = {"Content-Type": "application/json"}
 #request json
 data = json.dumps(
 { 
 "jsonrpc": "2.0",
 "method": "host.get",
 "params":{
  "output":["hostid","name"],
  "filter":{"host":""}
 }, 
 #auth id
 "auth":"Zabbix Auth ID",
 "id": 1,
 })
 #create request object
 request = urllib2.Request(url,data)
 for key in header: 
 request.add_header(key,header[key])
 #get host list
 try:
 result = urllib2.urlopen(request)
 except URLError as e:
 print "The server could not fulfill the request.",e.reason else:
 reponse = json.loads(result.read())
 result.close()
 #print "Number of Hosts:",len(reponse['result'])
 for host in reponse['result']:
  #print "Host ID:",host['hostid'],"Host Name:",host['name']
  zbxhosts=host['name']
  zabbixhostlst.append(zbxhosts)
 zabbixhostlst.sort()
 return zabbixhostlst def main():
 nmaphostlst = nmap_host() 
 zbxhostlst = zabbix_host() 
 diff = list(set(nmaphostlst) ^ set(zbxhostlst)) 
 content = "\n"
 nomonitorlst = [] 
 if len(diff) != 0: 
 for host in diff: 
  if host in nmaphostlst: 
  nomonitorlst.append(host)
 else: 
 sys.exit()
 #print zbxhostlst
 string = '\n'.join(nomonitorlst)
 f = file('/shell/machine/result/result.txt','w')
 f.write(string)
 f.flush()
 f.close()
 runCmd(mail_cmd)if __name__ == "__main__": 
 main()

   把脚本添加到crontab,每台会收到关于那些主机没有添加监控的信息。

Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法

 总结:

     1)Zabbix API相关信息可以查看官方详细资料,看不懂英文的可以参考下面这篇文档。http://paperplane.ruhoh.com/zabbix/intro-to-zabbix-api/

     2)通过该脚本可以知道那些主机没有添加监控,希望对大家有帮助,如果有更好的解决方法欢迎多多交流。 

以上所述是小编给大家介绍的使用Python脚本实现Zabbix-API 监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python里将list中元素依次向前移动一位
Sep 12 Python
教你用Python创建微信聊天机器人
Mar 31 Python
python如何生成各种随机分布图
Aug 27 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
详解Python3 基本数据类型
Apr 19 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
关于Python中定制类的比较运算实例
Dec 19 Python
Python文件操作基础流程解析
Mar 19 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
如何基于python实现单目三维重建详解
Jun 25 Python
python实现Zabbix-API监控
Sep 17 #Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 #Python
Python从使用线程到使用async/await的深入讲解
Sep 16 #Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 #Python
python3中os.path模块下常用的用法总结【推荐】
Sep 16 #Python
python os.path模块常用方法实例详解
Sep 16 #Python
python中的不可变数据类型与可变数据类型详解
Sep 16 #Python
You might like
php预定义变量使用帮助(带实例)
2013/10/30 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
javascript中的几个运算符
2007/06/29 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
Python正则表达式知识汇总
2017/09/22 Python
Python管理Windows服务小脚本
2018/03/12 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Python进行特征提取的示例代码
2020/10/15 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
英国二手物品交易网站:Preloved
2017/10/06 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
殡葬服务心得体会
2014/09/11 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
python状态机transitions库详解
2021/06/02 Python
总结Pyinstaller打包的高级用法
2021/06/28 Python
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Redis性能监控的实现
2021/07/09 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL