zabbix怎么自定义launchscreen多屏screen轮询

你可能喜欢
12345678910
关于本站 本站以分享运维技术为主,欢迎大家参与技术分享,同时也欢迎大家吐槽,本站提供以下交流圈:QQ群①:*****(满)QQ群②:6690706 QQ群③: QQ群④:(新) 微信公众号:ttlsacom 商务合作QQ:zhangke0016 的BLOG
用户名:zhangke0016
评论数:18
访问量:4142
注册日期:
阅读量:24883
阅读量:263215
阅读量:1000125
阅读量:149867
51CTO推荐博文
最近帮朋友写了一个朋友写了一个脚本实现的功能就是对应主机组中的主机对应的cpu,网卡,硬盘进行分组,可以根据时间段来获取数据,添加进screen 手动实现是一件极其麻烦的事情,这样只查看对应的项就方便多了。我改了下也能按照多个主机来实现添加screen,也能根据主机组来实现为了方便这边是就是用python 提供的api库来实现了#!/usr/bin/env&python
#coding:utf8
from&pyzabbix&import&ZabbixAPI
from&&itertools&import&chain
import&time
import&datetime
import&socket
import&sys
class&make_screen(object):
def&__init__(self,name='',columns=2,delete=False,check=False,width="500",heigth="100",start_time='',stop_time=''):
#def&__init__(self):
self.columns&=&columns
&&&&&&&&&&&&&&&&self.dynamic&=&0
self.width=width
self.heigth=heigth
self.check=check
self.delete=delete
self.name=name
self.start_time=self.f_date(start_time)
self.stop_time=self.f_date(datetime.datetime.now())&if&stop_time&==&'now'&else&self.f_date(stop_time)
print&self.start_time
print&self.stop_time
self.history=True
self.user='admin'&&#账号
self.passwd='zabbix'&#密码
self.server='&&#连接你的zabbix服务器的url&
self.login()
sys.exit(1)
def&f_date(self,date):&#获取到日期然后对日期进行分割,用字典生成对应的年,月,日,小时,分钟&对应的字典
#print&date
c=re.split(r'-|:|\s',str(date).split('.')[0])
d=[x.lstrip('0')&for&x&in&c&if&x.lstrip('0')]
if&len(d)&&6:
print&'your&input&time&is&err'
sys.exit(1)
return&dict(zip('ymdhM',d))
def&hosts(self,hosts):&#输入多个主机生成主机组
self.hosts=[x&for&x&in&hosts&if&x]
#print&self.hosts
#def&k_filter(self,*filter):&&
def&k_filter(self,filter):&
self.filter=[x&for&x&in&filter]
def&search(self,string):&&&&#生成需要过滤主机的key_
#print&'|'.join(self.filter)
if&re.search(r'%s'&%&'|'.join(self.filter),&string):
return&string
def&login(self):&&#登录的zabbix主机
&&&&&&&&&&&&&&&&self.zapi&=&ZabbixAPI(self.server)
&&&&&&&&&&&&&&&&self.zapi.login(self.user,self.passwd)
&&&&&&&&&&&&&&&&return&self.zapi
def&g_hostgroup(self,g_name):&#获取这个主机组的所有主机
return&self.zapi.hostgroup.get(output='extend',filter={'name':g_name})[0].get('groupid')
def&g_host(self,name):
if&not&self.e_hostgroup(name):&&#判断这个主机组是否存在的&调用def&e_hostgroup(self,g_name)&方法
print&"don't&have&name&hostgroup"
sys.exit(1)
host=set()
g_host=self.zapi.host.get(output='extend',groupids=self.g_hostgroup(name))&&#从
for&x&in&g_host:
host.add(x.get('host'))
self.hosts=[x&for&x&in&host]&#以主机组获取对应的全部主机
#print&self.hosts
def&e_hostgroup(self,g_name):&#判断主机组存在
return&self.zapi.hostgroup.exists(name=g_name)
def&g_item(self):&&#获取主机对应的的所有item,生成item:key对应的字典&
for&hostname&in&self.hosts:
host=self.zapi.item.get(&output='extend',
&filter={'host':hostname,},
for&x&in&host:
#print&x.get('key_')
if&self.search(x.get('key_')):
#print&x.get('key_')
items[x.get("itemid")]=x.get("value_type")
if&len(items)&==&0:
print&'''host&don't&have&any&item'''
sys.exit(1)
# print&items
return&items
#def&v_item(self):
def&g_history(self):&#一个graph可能有很多个item组成的,只要graph中有一个item有数据都认为这个graph是可以用,获取历史一个时间段的数据进行历史的判断,我这里是根据字典对应的value进行判断,你也可以把对应的value进行累加判断,我这样的做法会把数据为0的也添加进去
start_time=time.mktime(datetime.datetime(int(self.start_time.get('y',0)),int(self.start_time.get('m',0)),int(self.start_time.get('d',0)),int(self.start_time.get('h',0)),int(self.start_time.get('M',0))).timetuple())
stop_time=time.mktime(datetime.datetime(int(self.stop_time.get('y',0)),int(self.stop_time.get('m',0)),int(self.stop_time.get('d',0)),int(self.stop_time.get('h',0)),int(self.stop_time.get('M',0))).timetuple())
print&start_time
print&stop_time
g_item=self.g_item()
for&history&in&g_item.keys():
# print&g_item[history]
if&g_item[history]&==&'0':
get_history=self.zapi.history.get(history='0',output='extend',itemids=history,time_from=str(start_time),time_till=str(stop_time))
elif&g_item[history]&==&'3':
get_history=self.zapi.history.get(output='extend',itemids=history,time_from=str(start_time),time_till=str(stop_time))
'now&only&support&integer&and&fload,do&you&can&modify'
sys.exit(1)
for&y&in&get_history:
if&v_item.has_key(history):
v_item[history].append(y.get('value'))
v_item[history]=[]
v_item[history].append(y.get('value'))
# print&v_item
return&&v_item.keys()
#return&v_item.keys()
#return&self.v__item
def&gid_host(self,g_gid):&#在引用g_graphitem
return&self.zapi.host.get(output='extend',graphids=g_gid)
def&key_graph(self,k_graph):&#获取graph&和主机名,这边的排序是根据主机名来排序
for&x&in&self.zapi.graph.get(output='extend',graphids=k_graph):
return&&[k_graph,x.get('name')]
def&g_graphitem(self):&&
graphs=set()
s_graphs=[]
if&self.history:&&&#是否根据历史中item来判断
g_item=self.g_history()
g_item=self.g_item().keys()
for&itemid&in&g_item:&&#获取没有重复的多有graph
v=self.zapi.graphitem.get(&output='extend',
& &&&&&&&itemids=itemid,
for&id&in&v:
# print&id
graphs.add(id.get('graphid'))
if&len(graphs)&==&0:&&#这个主机组中没有graph&就退出了
print&'''don't&have&any&graph'''
sys.exit(1)
#print&graphs
for&x&in&graphs:&&&#def&key_graph
c=self.key_graph(x)
k_g[c[0]]=c[1]
#print&k_g
for&x&in&graphs:&
if&len(self.gid_host(x))&1:
print&'gid_host&have&problem'
sys.exit(1)
for&y&in&self.gid_host(x):&#获取主机id&生成{主机名:{组名:组id}的字典下面需要排序
if&g_dict.get(y.get('host')):
g_dict[y.get('host')][k_g.get(x)]=x
# print&"host&corresponding&two&graph"
# sys.exit(1)
g_dict[y.get('host')]={}
if&not&g_dict[y.get('host')].has_key(k_g.get(x)):
g_dict[y.get('host')][k_g.get(x)]=x
# print&g_dict
#sys.exit(1)
ip_d={}&#正则能匹配到ip但不是真正的ip比如1-192.168.1.102-3306&这个也能匹配,这个字典主要实现ip转换{192.168.1.102:1-192.168.1.102-3306}&&
for&x&in&g_dict:&&#把正常的ip加进去nor&不是就加入到err&以便下面能使用socket.inet_aton排序
if&re.search(r'\d{1,3}(\.\d{1,3})',x):
if&re.search(r'\-',&x):&#匹配到了的话就加入到字典里面转换下以便根据ip排序不会报错,我这里使用的是re.split&以上面的格式split不一定你能使用你可以使用re.findall替代匹配的真正的ip
ip_d[re.split(r'-',x)[0]]=x
nor.append(re.split(r'-',x)[0])
nor.append(x)
err.append(x)
#print&nor
#sys.exit(1)
for&x&in&sorted(nor,key=socket.inet_aton):
if&ip_d.has_key(x):&&#这边已经排序完成,然后就把ip替换掉192.168.1.102-3306
x=ip_d.get(x)&&&&#实现字典中的内切字典也进行排序
for&y&in&sorted(g_dict.get(x).keys()):
nor_id.append(g_dict.get(x).get(y))
for&x&in&sorted(err):&#不是ip的话直接排序,就好了,内切字典也进行排序
for&y&in&sorted(g_dict.get(x).keys()):
err_id.append(g_dict.get(x).get(y))
# print&nor_id
# sys.exit(1)
s_graphs=chain(nor_id,err_id) &
#for&z&in&sorted(g_dict.keys(),key=socket.inet_aton):
# s_graphs.append(g_dict.get(z))
#print&g_dict
#sys.exit(1)
&&&&&&&&&&&&&&&&y&=&0
&&&&&&&&&&&&&&&&graph_list=[]&&#这里就生成对应screen所需要的参数
&&&&&&&&&&&&&&&&for&graph&in&s_graphs:
# print&graph
&&&&&&&&&&&&&&&&&&&&&&&&graph_list.append({
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"resourcetype":'0',
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"resourceid":&graph,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"width":&self.width,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"height":&self.heigth,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"x":&str(x),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"y":&str(y),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"colspan":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"rowspan":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"elements":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"valign":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"halign":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"style":&"0",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"url":&"",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"dynamic":&str(self.dynamic)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&})
&&&&&&&&&&&&&&&&&&&&&&&&x&+=&1
&&&&&&&&&&&&&&&&&&&&&&&&if&x&==&int(self.columns):
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&x&=&0
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&y&+=&1
#print&graph_list
&&&&&&&&&&&&&&&&return&graph_list
&&&&&&&&def&c_screen(self):&#生成screen
&&&&&&&&&&&&&&&&graphids=self.g_graphitem()
&&&&&&&&&&&&&&&&columns&=&int(self.columns)
&&&&&&&&&&&&&&&&if&len(graphids)&%&self.columns&==&0:
&&&&&&&&&&&&&&&&&&&&&&&&vsize&=&len(graphids)&/&self.columns
&&&&&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&&&&&&&&&vsize&=&(len(graphids)&/&self.columns)&+&1
#&&&&&&&&&&&&&&&print&graphids
&&&&&&&&&&&&&&&&self.zapi.screen.create(name=self.name,hsize=self.columns,vsize=vsize,screenitems=graphids)
&&&&&&&&def&e_screen(self):&#判断screen是否存在了
&&&&&&&&&&&&&&&&list_exists=self.zapi.screen.exists(name=self.name)
&&&&&&&&&&&&&&&&if&list_exists:
&&&&&&&&&&&&&&&&&&&&&&&&print&'%s&is&exists'&%&self.name
&&&&&&&&&&&&&&&&&&&&&&&&sys.exit(1)
def&check_screen(self,c_name):&&#是否生成screen进行验证下
if&not&&self.zapi.screen.exists(name=c_name):
print&"%s&add&failure"&%(c_name)
def&g_screen(self,g_id):&#删除的功能,建议手动删除
for&x&in&self.zapi.screen.get(output='extend'):
s_name[x.get('name')]=x.get('screenid')
if&g_id&in&s_name:
self.zapi.screen.delete(s_name[g_id],)
def&d_screen(self,id):
self.zapi.screen.delete(id,)
def&run(self):
#self.g_history()
self.e_screen()
self.c_screen()
if&__name__&==&'__main__':
&&&&&&&&from&&optparse&import&OptionParser
&&&&&&&&parser&=&OptionParser()
&&&&&&&&parser.add_option('-G',&dest='graphname',
&&&&&&&&&&&&&&&&&&&&&&&&help='Zabbix&Host&Graph&to&create&screen&from')
&&&&&&&&parser.add_option('-c',&dest='columns',&type=int,
&&&&&&&&&&&&&&&&&&&&&&&&help='number&of&columns&in&the&screen')
parser.add_option('--group',&dest='group',
help='the&hostgroup&name')
parser.add_option('-f',&dest='filter',action="append",
help='what&do&you&filter&string')
parser.add_option('--hosts',dest='hosts',action='append',
help='many&hosts&to&get&key')&
parser.add_option('--delete',dest='delete',type=int,
help='do&you&want&to&delete&screen')
parser.add_option('--delete-name',dest='delete_name',
help='remove&name?')
parser.add_option('--check',dest='check',type=int,
help='check&screen&is&ok?')
parser.add_option('-w',dest='width',
help='screen&width'),
parser.add_option('--check-name',dest='check_name',
help='check&name?')
parser.add_option('-l',dest='heigth',
help='screen&heigth')
parser.add_option('--start',dest='start',
help='start&in&history&time')
parser.add_option('--stop',dest='stop',default=datetime.datetime.now(),
help='stop&in&history&time')
&&&&&&&&options,args=parser.parse_args()
if&options.delete:
a=make_screen(delete=options.delete)
a.g_screen(options.delete_name)
sys.exit()
if&options.check:
a=make_screen(check=options.check)
a.check_screen(options.check_name)
sys.exit(2)
#print&re.split(r':|,',options.filter[0])
if&options.hosts&and&options.group:
print&"options.hosts&and&groups.group&&have&value&as&the&same&time"
sys.exit(1)
elif&not&(options.hosts&or&options.group):
print&"options.hosts&and&groups.group&must&the&one&have&a&value"
sys.exit(1)
# print&re.split(r':|,',options.hosts[0])
#print&options.hosts
a=make_screen(columns=options.columns,name=options.graphname,width=options.width,heigth=options.heigth,start_time=options.start,stop_time=options.stop)
#a=make_screen()
if&options.hosts:&
a.hosts(re.split(r':|,',options.hosts[0]))
#a.hosts('10.0.15.123','10.0.15.1')
if&options.group:
a.g_host(options.group)
a.k_filter(re.split(r':|,',options.filter[0]))
a.run() python filter_screen.py -G "SFA-HPC-网络流量" -f "net.if.in" -c 2 --group zabbix -w 800 -l 100 --start -20-00 &--stop now&这里in 和out都在一个graph中,只要一个graph中有一个item有数据就会出来对应的grpahcpu注意:python filter_screen.py -G "SFA-HPC-网络流量" -f "net.if.in[eth0]" -c 2 --group zabbix -w 800 -l 100 --start -20-00 &--stop now&这样就会出问题,正则表达式中[]是或正确python filter_screen.py -G "SFA-HPC-网络流量" -f "net.if.in\[eth0\]" -c 2 --group zabbix -w 800 -l 100 --start -20-00 &--stop now&[]需要对齐转义如果有很多screen,你可以写个循环脚本进行循环,这样见简化繁琐了有何问题请向我反映谢谢~~~~~~~~~~本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:  
类别:未分类┆阅读(0)┆评论(0)
15:54:13 19:27:44 13:39:52 17:34:04 15:22:00 12:30:12 16:57:57
请输入验证码:Zabbix通过邮件发送Screen图形报表实现_服务器应用_Linux公社-Linux系统门户网站
你好,游客
Zabbix通过邮件发送Screen图形报表实现
作者:mcsrainbow
在使用Zabbix的过程中,我们通常会建立一些需要的Screen图形报表来汇总需要监控的Graph。&而下面的两个脚本,则是通过从Zabbix数据库中获取所有的Screen图形参数,提供Zabbix的WEB接口将所有图形保存到本地,然后通过脚本以Email形式发送过来,作为每天的自动报表。&$ sudo mkdir -p /data/script$ sudo mkdir -p /data/graph&$ sudo vim /data/scripts/save-graph.pl
#!/usr/bin/perluse File::Puse 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"; }
my $period = 86400;& & # 24 hours
my $login = 'admin';&
# Zabbix Web Usermy $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 localhostmy $db_user_name = 'zabbix'; # MySQL DB usermy $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 %
# Get all graphs by using curlwhile (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`;& & }}
$ sudo vim email-pic.py
#! /usr/bin/env python
import osimport smtplib
from email.MIMEMultipart import MIMEMultipartfrom email.MIMEText import MIMETextfrom 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 headersdef 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('',25,'username','password',str_from,list_to,msgRoot.as_string())
if __name__ == '__main__':&
str_from = ''&
list_to = [& & & & & & & & "", "", ""& & & & & &
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图形邮件报表了,如下图所示:
-------------------------------分割线-------------------------------
1、按周显示:
my $period = 86400; 这里就是用来定义时间的,以秒为单位。
2、执行python时出错,麻烦帮助看一下。python2.6\2.7版本都试过&Traceback (most recent call last):&File "./email-pic.py", line 80, in&main(str_from,list_to,image_dir)&File "./email-pic.py", line 71, in main&msgRoot = _create_msg(screen_name,screens,image_dir,str_from,list_to)&File "./email-pic.py", line 41, in _create_msg&_,hsize,vsize,_,_,_,_,= tuple(screens[0].split('.'))&IndexError: list index out of range
必须和上面的脚本和步骤配合使用,完成的任务其实就是,创建目录,利用Zabbix接口生成好好图片,然后通过邮件发送。
相关资讯 & & &
& (昨 10:13)
& (03月29日)
& (01月20日)
& (04月12日)
& (01月30日)
& (01月14日)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 你好,楼主。运行save-graph.pl脚本,出现以下错误,不知什么原因,麻烦请教curl: (6) Couldn't resolve host 'server.4.2.1.3.525.png'

我要回帖

更多关于 launchscreen 黑屏 的文章

 

随机推荐