python自动统计zabbix系统监控覆盖率的示例代码


Posted in Python onApril 03, 2021

脚本主要功能:

1)通过zabbix api接口采集所有监控主机ip地址;

2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址、主机名、操作系统、电源状态;

3)以上2步返回数据对比,找出未监控主机ip地址,生成csv文件;

4)发送邮件。

脚本如下:

#!/usr/bin/python
#coding:utf-8

import requests
import json
import re
import time
import csv
from collections import Counter
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

# 从cmdb系统获取虚拟化生产主机ip
def getCmdbProdHost():
  url1 = 'http://paas.xxxx.com/api/c/compapi/v2/cc/search_inst/'
  data1 = {
    "bk_app_secret": "**********************",
    "bk_app_code": "bk_cmdb",
    "bk_username": "admin",
    "bk_obj_id": "host",
    "page": {
      "start": 0,
      "limit": 2000,
      "sort": "bk_inst_id"
    },
    "fields": {
      "host": [
        "bk_host_id",
        "bq_hostname",
        "bk_host_innerip",
        "bq_hosttype",
        "powerState",
        "bq_osname"
      ]
    }  }
  r1 = requests.post(url1, json=data1)
  response_dict1 = r1.json()
  #print(response_dict1)
  prodip_dict = {}
  testip = "10.210.xx|10.210.xx|10.210.xx|10.210.xx|xx.xx.xx"   #测试网段ip
  for i in response_dict1.get('data')["info"]:
    if i["bq_hosttype"] == "t2" and i["powerState"] == "poweredOn" and not re.search("UAT", i["bq_hostname"]) and not re.match(testip, i["bk_host_innerip"]):
      prodip_dictkey = i["bk_host_innerip"]
      #prodip_dictvalue = i["bq_hostname"]
      prodip_dictvalue = [i["bq_hostname"], i["bq_osname"], i["powerState"]]
      prodip_dict[prodip_dictkey] = prodip_dictvalue
  return prodip_dict

#获取zabbix系统登录认证
def getZabToken(url, post_headers, url_user, url_password):
  post_data = {
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "user": url_user,
      "password": url_password
    },
    "id": 1
  }
  ret = requests.post(url, data=json.dumps(post_data), headers=post_headers)
  return json.loads(ret.text).get("result")

def getZabHost(url,post_headers,token):
  data = {
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
      "output": [
        "hostid",
        "host"
      ],
      "selectInterfaces": [
        "interfaceid",
        "ip"
      ]
    },
    "id": 2,
    "auth": token,
  }
  request = requests.post(url, headers=post_headers, data=json.dumps(data))
  dict = json.loads(request.content)
  zab_ip = []
  for i in dict['result']:
    zab_ip.append(i['host'])
  return zab_ip

def compare(zabhostlist, cmdbhostdict):
  zabbixiplist = Counter(zabhostlist)
  cmdbiplist = Counter(list(cmdbhostdict.keys()))
  nomonip = {}
  for i in list((cmdbiplist - zabbixiplist).elements()):
    nomonip_value = cmdbhostdict[i]
    nomonip_key = i
    nomonip[nomonip_key] = nomonip_value
  print(nomonip)
  return nomonip

class writeToCsv(object):
  def __init__(self,data,info):
    self.data = data
    self.info = info

  def write_to_csv(self):
    rows = self.data
    info = self.info
    csvfile = "zabbix未监控生产系统IP列表" + info + time.strftime('_%Y%m%d%H%M%S', time.localtime(time.time())) + ".csv"
    # print(csvfile)
    # 创建文件对象
    f = open(csvfile, 'w', newline='')

    # 通过文件创建csv对象
    csv_write = csv.writer(f)

    # writerow: 按行写入, writerows: 是批量写入
    # 写入数据 取列表的第一行字典,用字典的key值做为头行数据
    # csv_write.writerow(rows[0].keys())
    csv_write.writerow(["未监控生产IP", "主机名", "操作系统", "电源状态"])

    # 循环里面的字典,将value作为数据写入进去
    ip = list(rows.keys())
    hostname = list(rows.values())
    for row in range(len(ip)):
      csv_write.writerow([ip[row], hostname[row][0], hostname[row][1], hostname[row][2]])

    # 关闭打开的文件
    f.close()
    print("读写完成:",csvfile)
    return csvfile

def sendmail(csvfile,receiver):
  sender = 'xxx@xxx.com'
  smtpserver = 'xx.xx.xx.xx'
  username = 'xxx@xxx.com'
  password = '******'
  mail_title = 'zabbix未监控生产主机IP地址'

  # 创建一个带附件的实例
  message = MIMEMultipart()
  message['From'] = sender
  message['To'] = ','.join(receiver)
  message['Subject'] = Header(mail_title, 'utf-8')

  # 邮件正文内容
  message.attach(MIMEText('每日自动统计监控覆盖率', 'plain', 'utf-8'))

  # 构造附件
  att1 = MIMEApplication(open(csvfile, 'rb').read()) # 打开附件
  att1.add_header('Content-Disposition', 'attachment', filename=csvfile) # 为附件命名
  message.attach(att1)

  smtpObj = smtplib.SMTP_SSL() # 注意:如果遇到发送失败的情况(提示远程主机拒接连接),这里要使用SMTP_SSL方法
  smtpObj.connect(smtpserver)
  smtpObj.login(username, password)
  smtpObj.sendmail(sender, message['To'].split(','), message.as_string())
  print("邮件发送成功!!!")
  smtpObj.quit()

if __name__ == '__main__':
  url = 'http://xx.xx.xx.xx/api_jsonrpc.php'         #zabbix监控系统接口地址
  post_headers = {'Content-Type': 'application/json'}
  url_user = "Admin"
  url_passwd = "******"
  auth = getZabToken(url,post_headers,url_user,url_passwd)
  zabhostlist = getZabHost(url,post_headers,auth)       #获取zabbix监控主机ip地址列表
  cmdbhostdict = getCmdbProdHost()               #获取cmdb主机地址列表
  #zabbix监控主机和cmdb主机做比较
  data = compare(zabhostlist, cmdbhostdict)

  #导出csv文件
  info = '统计'
  write = writeToCsv(data, info)
  resp = write.write_to_csv()
  receiver = ['hushanshan2@bngrp.com']   #y邮件接收人,多人用逗号区分开
  sendmail(resp, receiver)

到此这篇关于python自动统计zabbix系统监控覆盖率的文章就介绍到这了,更多相关python统计zabbix内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python lxml模块安装教程
Jun 02 Python
使用python加密自己的密码
Aug 04 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
python2.7实现爬虫网页数据
May 25 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
python matplotlib库直方图绘制详解
Aug 10 Python
keras导入weights方式
Jun 12 Python
用python自动生成日历
Apr 24 Python
k-means & DBSCAN 总结
Apr 27 Python
2021年pycharm的最新安装教程及基本使用图文详解
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
python 统计代码耗时的几种方法分享
python 遍历磁盘目录的三种方法
Apr 02 #Python
python 如何在 Matplotlib 中绘制垂直线
在Windows下安装配置CPU版的PyTorch的方法
PyQt5 QThread倒计时功能的实现代码
Apr 02 #Python
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
基于pear auth实现登录验证
2010/02/26 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
使用php计算排列组合的方法
2013/11/13 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP常用处理静态操作类
2015/04/03 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
requireJS使用指南
2016/04/27 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
python 提取文件指定列的方法示例
2019/08/07 Python
python已协程方式处理任务实现过程
2019/12/27 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
教师节促销活动方案
2014/02/14 职场文书
销售助理岗位职责
2014/02/21 职场文书
实验室的标语
2014/06/20 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
政审证明范文
2015/06/19 职场文书
战友聚会致辞
2015/07/28 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
Golang map映射的用法
2022/04/22 Golang