游走的鱼

导航

zabbix 5.0 邮件钉钉发送带告警图

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}

posted on 2021-08-14 20:14  游走的鱼  阅读(357)  评论(0编辑  收藏  举报