利用python发送zabbix server的图形报表
在使用Zabbix的过程中,我们通常会建立一些需要的Screen图形报表来汇总需要监控的Graph。
而下面的两个脚本,则是通过从Zabbix数据库中获取所有的Screen图形参数,提供Zabbix的WEB接口将所有图形保存到本地,然后通过脚本以Email形式发送过来,作为每天的自动报表。
$ mkdir -p /data/script
$ mkdir -p /data/graph
$vim /data/script/save-graph.pl
#!/usr/bin/perl use File::Path; use DBI; my $path = '/data/graph'; if(-e $path) { rmtree($path); } mkdir($path); my $stime = `date +%Y%m%d`; chop($stime); $stime .= '1000'; if( length($stime) != 12 ) { print "Error get date"; exit; } my $period = 86400; # 24 hours my $login = 'admin'; # Zabbix Web User my $pass = 'password'; # Zabbix Web User Password, must be URL Encoded my $cook = "/tmp/cookie"; my $dsn = 'DBI:mysql:zabbix:localhost'; # Connect MySQL DB "zabbix" on localhost my $db_user_name = 'zabbix'; # MySQL DB user my $db_password = 'dbpassword'; # MySQL DB user password my $dbh = DBI->connect($dsn, $db_user_name, $db_password); my $sth = $dbh->prepare(qq{select a.name,a.hsize,a.vsize, b.resourceid, b.width, b.height,b.x,b.y from screens a,screens_items as b where a.screenid=b.screenid and a.templateid<=>NULL order by a.name}); $sth->execute(); my %screens; # Get all graphs by using curl while (my ($name,$hsize,$vsize, $id,$width,$height,$x,$y) = $sth->fetchrow_array()) { if(length($id) > 2){ #print "$id => $ids\n"; my $p = "$path/$name.$hsize.$vsize.$y.$x.$id.png"; my $strcomm = `curl -c $cook -b $cook -d "request=&name=$login&password=$pass&autologin=1&enter=Sign+in" localhost/zabbix/index.php`; $strcomm = `curl -b $cook -F "graphid=$id" -F "period=$period" -F "stime=$stime" -F "width=$width" -F "height=$height" localhost/zabbix/chart2.php > $p`; } } exit ; |
$ vim email-pic.py
#! /usr/bin/env python import os import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage def _sendmail(smtp_server,port,account,password,str_from,list_to,msg): smtp = smtplib.SMTP(smtp_server,port) smtp.ehlo() smtp.starttls() smtp.ehlo() smtp.login(account, password) smtp.sendmail(str_from, list_to,msg) smtp.close() def _get_pictures(image_dir): pictures = [] for f in os.listdir(image_dir): pictures.append(f) return pictures def _create_msg(screen_name,screens,image_dir,str_from,list_to): msgRoot = MIMEMultipart('related') msgRoot['Subject'] = 'Zabbix Screen Report: %s' % screen_name msgRoot['From'] = str_from msgRoot['To'] = ",".join(list_to) msgRoot.preamble = 'This is a multi-part message in MIME format.' # Encapsulate the plain and HTML versions of the message body in an # 'alternative' part, so message agents can decide which they want to display. msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) msgText = MIMEText('This is the alternative plain text message.') msgAlternative.attach(msgText) contents = "" contents += "<h1>Screen %s</h1><br>" % screen_name _,hsize,vsize,_,_,_,_,= tuple(screens[0].split('.')) contents +="<table>" screens = sorted(screens) y= -1 for f in screens: items = f.split('.') _,_,_,image_y,image_x,image_id,_ = tuple(items) image_name = "image-%s-%s" % (screen_name, image_id) fp = open('%s/%s' % (image_dir,f), 'rb') msgImage = MIMEImage(fp.read()) fp.close() msgImage.add_header('Content-ID', "<%s>" % image_name) msgRoot.attach(msgImage) if y != image_y: if y!= -1: contents +="</tr>" y = image_y contents +="<tr>" contents +="<td><img src='cid:%s'></td>" % image_name contents += "</table>" msgText = MIMEText(contents, 'html') msgAlternative.attach(msgText) msgRoot.attach(msgAlternative) return msgRoot # Create the root message and fill in the from, to, and subject headers def main(str_from,list_to,image_dir): pictures = _get_pictures(image_dir) for screen_name in list(set([x.split('.')[0] for x in pictures ])): screens = [x for x in pictures if x.startswith(str(screen_name) + '.') ] msgRoot = _create_msg(screen_name,screens,image_dir,str_from,list_to) _sendmail('smtp.example.com',25,'username','password',str_from,list_to,msgRoot.as_string()) if __name__ == '__main__': str_from = 'username@example.com' list_to = [ "jack@example.com", "tom@example.com", "jim@example.com" ] image_dir = '/data/graph' main(str_from,list_to,image_dir) |
接着,将这两个脚本加入到crontab中定时执行。
$ sudo crontab -e
30 23 * * * /data/script/save-graph.pl
55 23 * * * /data/script/email-pic.py
这样,就可以收到对应的Zabbix图形邮件报表了,如下图所示: