zoukankan      html  css  js  c++  java
  • python3获取zabbix磁盘数据并发送邮件

    python3获取zabbix磁盘数据并发送邮件
    
    测试的系统环境
    
    Python3.8.3
    
    Windows10
    
    Zabbix 4.0.19
    zabbix磁盘数据
    
    #zabbix数据库信息:
    zdbhost = '192.168.1.x'
    zdbuser = 'zabbix'
    zdbpass = '123456'
    zdbport = 3306
    zdbname = 'zabbix'
    
    #需要查询的key列表 [名称,表名,key值,取值,格式化,数据整除处理]
    keys = [
    ['分区总大小(GB)','trends_uint','total','avg','',1073741824],
    ['分区平均剩余(GB)','trends_uint','free','avg','',1073741824],
    ['分区可用率%','trends','pfree','avg','%.2f',1],
    ]
    
            #打开数据库连接
            self.conn = pymysql.connect(host=zdbhost,user=zdbuser,passwd=zdbpass,port=zdbport,db=zdbname,cursorclass=pymysql.cursors.DictCursor)
            self.cursor = self.conn.cursor()
     
            #获取IP,目录信息:
            self.HostDirList =self.getHostDirList(groupname)
     
     
        #根据zabbix组名获取该组所有IP
        def getgroupid(self,groupname):
            #查询组ID:
     
            sql = '''select groupid from hstgrp where name = '%s' ''' % groupname
     
            self.cursor.execute(sql)
     
            groupid =self.cursor.fetchone()['groupid']
     
            return groupid
    
        #根据groupid查询该分组下面的所有主机ID(hostid):
        def gethostid(self,groupname):
     
            groupid =self.getgroupid(groupname)
     
            sql = '''select hostid from hosts_groups where groupid = %s''' % groupid
     
            self.cursor.execute(sql)
     
            hostlist = self.cursor.fetchall()
     
            return hostlist
    
        #生成IP,Item字典:结构为:{'host': '192.168.52.47', 'hostid': 30478, 'dir': '/boot'}
        def getHostDirList(self,groupname):
     
            hostlist =self.gethostid(groupname)
     
            HostDirList = []
     
            for i in hostlist:
     
                hostid = i['hostid']
     
                sql = '''select DISTINCT a.host,a.hostid,substring(b.key_,13,CHAR_LENGTH(b.key_)-18) dirname from hosts a,items b
                         where a.hostid= %s and a.status = 0 and a.available=1 and a.hostid=b.hostid and b.key_ like 'vfs.fs.size%%'
                         and b.key_ like '%%,free]' and b.error='' and b.templateid is null ''' % hostid
     
                self.cursor.execute(sql)
                result = self.cursor.fetchall()
     
                HostDirList.extend(result)
     
            return HostDirList
     
    
        #获取itemid
        def getItemid(self,hostid,itemname):
     
            sql = '''select itemid from items where hostid = %s and error='' and key_ = '%s' ''' % (hostid, itemname)
     
            if self.cursor.execute(sql):
     
                itemid =self.cursor.fetchone()['itemid']
     
            else:
     
                itemid = None
     
            return itemid
    
    
        #查询trends表的值,type的值为min,max,avg三种
        def getTrendsValue(self,type,itemid, start_time):
     
            sql = '''select %s(value_%s) as result from trends where itemid = %s and clock >= %s ''' % (type, type, itemid, start_time)
     
            self.cursor.execute(sql)
     
            result =self.cursor.fetchone()['result']
     
            if result == None:
     
                result = 0
     
            return result
    
        #根据hostid,itemname获取该监控项的值
        def getTodayData(self,type,hostid,table,itemname):
     
            #获当天时间
            ts_date =int(time.mktime(datetime.date.today().timetuple()))
     
            itemid =self.getItemid(hostid, itemname)
     
            function =getattr(self,'get%sValue' % table.capitalize())
     
     
     
            return  function(type,itemid, ts_date)
     
    
        def getInfo(self):
     
            #循环读取IP列表信息
     
            for index,item in enumerate(self.HostDirList):
     
     
            #循环读取keys,逐个key统计数据:
     
     
                for value in keys:
     
            #['分区总大小(GB)','trends_uint',',total]','avg','',1073741824]
                    keyname='vfs.fs.size['+item['dirname']+','+value[2]+']'
     
                    print ("	正在统计key_:%s" % keyname)
     
                    data =  self.getTodayData(value[3],item['hostid'],value[1],keyname)
     
                    self.HostDirList[index][value[2]] = data
                   
    
        #生成xls文件
        def writeToXls(self,xlsfilename,keysname):
     
                #创建文件
                workbook =xlsxwriter.Workbook(xlsfilename)
     
                #生产时间区间
                start_day=datetime.date.today()
     
                #创建工作薄
                worksheet =workbook.add_worksheet('%s' % start_day)
                
                #设置列宽
                worksheet.set_column('A:E', 16)
     
                #创建单元格格式
                format1 = workbook.add_format()
                format1.set_fg_color('#003063')
                format1.set_font_color('white')
                format1.set_border(1)
     
                format2 = workbook.add_format()
                format2.set_border(1)
     
     
                #写入第一列:
                worksheet.write(0,0,"主机名称IP",format1)
                worksheet.write(0,1,"磁盘目录",format1)
                i = 1
                for item in  self.HostDirList:
                    worksheet.write(i,0,item['host'],format2)
                    worksheet.write(i,1,item['dirname'],format2)              
                    i = i + 1
     
                #写入其他列:
                i = 2
     
                for value in keysname:
                    worksheet.write(0,i,value[0],format1)
     
                    #写入该列内容:
                    j = 1
                    for item in self.HostDirList:
                        if value[4]:
                           worksheet.write(j,i, value[4] % item[value[2]],format2)
                        else:
                           worksheet.write(j,i, "{:.2f}".format(item[value[2]] / value[5]),format2)
                        j = j + 1
     
                    i = i + 1
                workbook.close()
    

        #关闭数据库连接
        def __del__(self):
            self.cursor.close()
            self.conn.close()
    #发送邮件 def mail(): #设置smtplib所需的参数 #下面的发件人,收件人是用于邮件传输的 smtpserver = '163.com' sender='sz@163.com' #收件人为多个收件人,逗号分隔 to_mail=[suixin@163.com'] cc_mail=['suixin1@163.com','suixin2@163.com'] #设置标题 subject = 'Zabbix监控周报:磁盘' subject=Header(subject, 'utf-8').encode() #构造邮件对象MIMEMultipart对象 #下面的主题,发件人,收件人,日期是显示在邮件页面上的。 msg = MIMEMultipart('mixed') msg['Subject'] = subject msg['From'] = 'suixin@163.com' #收件人为多个收件人,通过join将列表转换为以;为间隔的字符串 msg['To'] = ";".join(to_mail) msg['Cc'] = ";".join(cc_mail) #构造文字内容 text = "Zabbix监控周报:磁盘 请查收!" text_plain = MIMEText(text,'plain', 'utf-8') msg.attach(text_plain) #构造附件 linuxfile=open(r'%s' % linuxfilename,'rb').read() text_att = MIMEText(linuxfile, 'base64', 'utf-8') text_att["Content-Type"] = 'application/octet-stream' text_att["Content-Disposition"] = 'attachment; filename=%s' % linuxfilename msg.attach(text_att) windowsfile=open(r'%s' % windowsfilename,'rb').read() text_att2 = MIMEText(windowsfile, 'base64', 'utf-8') text_att2["Content-Type"] = 'application/octet-stream' text_att2["Content-Disposition"] = 'attachment; filename=%s' % windowsfilename msg.attach(text_att2) #发送邮件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com', '25') smtp.login('suixin@163.com', 'KEY') smtp.sendmail(sender, to_mail+cc_mail, msg.as_string()) print('发送成功!') smtp.quit() 需要完整的代码,可以私信我要。
  • 相关阅读:
    time模块
    日期和时间
    异常和函数
    finally子句
    自定义异常
    异常中的else
    全捕捉
    排序算法---希尔排序
    排序算法---直接插入排序
    排序算法---快速排序
  • 原文地址:https://www.cnblogs.com/suixinnan/p/13540091.html
Copyright © 2011-2022 走看看