zabbix访问监控图形
# http://zabbix.xxx/chart.php?itemids[0]=44314
代码如下:
#!/usr/bin/python
#coding=utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib,sys,os,time,re,requests
from smtplib import SMTP
user="Admin" #定义zabbix用户名
password='zabbixmima' #定义zabbix用户密码graph_path='/usr/lib/zabbix/alertscripts/graph' #定义图片存储路径
graph_url='http://localhost/chart.php' #定义图表的url
loginurl="http://localhost/index.php" #定义登录的url
host='localhost'
to_email=sys.argv[1] #传入的第一个参数为收件人邮箱
subject=sys.argv[2] #传入的第二个参数为邮件主题
#subject=subject.decode('utf-8')
smtp_host = 'smtp.xxx.com' #定义smtp主机地址
from_email = 'monitor@xxx.com' #定义发件人地址
mail_pass = '邮箱密码' #发件人邮箱校验码
def get_itemid():
#获取报警的itemid
itemid = re.search(r'ITEMID:(\d+)',sys.argv[3]).group(1)
#print(itmeid)
return itemid
def get_graph(itemid):
#获取报警的图表并保存
session=requests.Session() #创建一个session会话
try:
loginheaders={
"Host":host,
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
}
#定义请求消息头
payload = {
"name":user,
"password":password,
"autologin":"1",
"enter":"Sign in",
}
#定义传入的data
login=session.post(url=loginurl,headers=loginheaders,data=payload)
#进行登录
graph_params={
"from" :"now-10m",
"to" : "now",
"itemids[0]" : itemid, #zabbix5.0 此处是php7版本以上,代码有所改动,需要写成列表获取,其他版本itemids即可
"width" : "400",
}
#定义获取图片的参数
graph_req=session.get(url=graph_url,params=graph_params)
#发送get请求获取图片数据
time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
graph_name='baojing_'+time_tag+'.png'
#用报警时间来作为图片名进行保存
graph_name = os.path.join(graph_path, graph_name)
#使用绝对路径保存图片
with open(graph_name,'wb') as f:
f.write(graph_req.content)
#将获取到的图片数据写入到文件中去
return graph_name
except Exception as e:
print(e)
return False
def text_to_html(text):
#将邮件内容text字段转换成HTML格式
d=text.splitlines()
#将邮件内容以每行作为一个列表元素存储在列表中
html_text=''
for i in d:
i='' + i + '<br>'
html_text+=i + '\n'
#为列表的每个元素后加上html的换行标签
return html_text
def send_mail(graph_name):
#将html和图片封装成邮件进行发送
msg = MIMEMultipart('related') #创建内嵌资源的实例
with open(graph_name,'rb') as f:
#读取图片文件
graph=MIMEImage(f.read()) #读取图片赋值一个图片对象
graph.add_header('Content-ID','imgid1') #为图片对象添加标题字段和值
text=text_to_html(sys.argv[3])
html="""
<html>
<body>
%s <br><img src="cid:imgid1">
</body>
</html>
""" % text
html=MIMEText(html,'html','utf-8') #创建HTML格式的邮件体
msg.attach(html) #使用attach方法将HTML添加到msg实例中
msg.attach(graph) #使用attach方法将图片添加到msg实例中
msg['Subject'] = subject
msg['From'] = from_email
try:
server=SMTP(smtp_host,"25") #创建一个smtp对象
#server.starttls() #启用安全传输模式
server.login(from_email,mail_pass) #邮箱账号登录
server.sendmail(from_email,to_email,msg.as_string()) #发送邮件
server.quit() #断开smtp连接
except smtplib.SMTPException as a:
print(a)
def run():
itemid=get_itemid()
graph_name=get_graph(itemid)
send_mail(graph_name)
if __name__ =='__main__':
run()
钉钉代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests,time
import json,sys,re,os
user="Admin" #定义zabbix用户名
password='admin' #定义zabbix用户密码
zabbixserver_url ='http://localhost/index.php'
#定义远端的web服务器地址,将图片复制到远端的web目录下,让zabbix主机可以访问这个图片
pname_path='http://localhost/dingding_pic/'
#定义获取的图片地址
graph_url = "http://localhost/chart.php"
host='zabbixhost'
def get_itemid():
itemid=re.search(r'ITEMID:(\d+)',sys.argv[1]).group(1)
return itemid
def get_picture(itemid,pname):
session = requests.Session() #创建一个session会话
try:
loginHeaders = {
"Host":host,
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
}
# 构建登录所需的信息
playLoad = {
"name": user,
"password": password,
"autologin": "1",
"enter": "Sign in",
}
session.post(url=zabbixserver_url, headers=loginHeaders, data=playLoad)
playLoad = {
"from": "now-1h",
"to": "now",
"itemids[0]": itemid,
"width": "700",
}
#定义获取图片的参数
graph_req = session.get(url=graph_url,params=playLoad)
IMAGEPATH = os.path.join('/usr/lib/zabbix/alertscripts/dingding_pic/', pname)
#将获取到的图片数据写入到文件中去
with open(IMAGEPATH,'wb') as f:
f.write(graph_req.content)
pname_url = pname_path+pname
return pname_url
except Exception as e:
print(e)
return False
#构造发送消息的请求
def send_msg(pname_url,title,result_message):
headers = {'Content-Type': 'application/json;charset=utf-8'}
print(result_message)
data = {
"msgtype": "markdown",
"markdown": {
#"title": title,
"text": result_message+"![screenshot](%s)"%(pname_url)
},
"at":{
"atMobiles": reminders,
"isAtAll": False,
},
}
r = requests.post(url=webhook_url,json=data,headers=headers)
print(r.text)
#对报警信息进行格式化
def info_text(message):
new_text = ""
x = message.split('\n')
for i in x:
if re.search('ITEM ID',str(i)):
pass
else:
new_text+="- "+str(i)+('\n')
print(type(new_text))
return new_text
if __name__ == '__main__':
#将报警信息写入日志
#os.system("echo hello >> /tmp/syslog.md")
pname = str(int(time.time()))+'.png'
#title = str(sys.argv[2])
message = str(sys.argv[1])
result_message = info_text(message)
# with open('/tmp/syslog.md','a') as f:
# f.write(title)
# f.write(message)
# f.close()
reminders = []
webhook_url = 'https://localhost/robot/send?access_token=********************' #钉钉机器人
itemid = get_itemid()
pname_url=get_picture(itemid,pname)
print(pname_url)
send_msg(pname_url,title,result_message)
代码中需要获取zabbix 监控项id即itemids,此处需要在消息中自定义,如下:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
ITEMID:{ITEM.ID}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}