zoukankan      html  css  js  c++  java
  • zabbix5利用python脚本发报警邮件和趋势图

    一、环境:

    系统:centos8

    zabbix版本:5.4

    python版本:3.6.8

    依赖库:request

    二、脚本

    1)脚本放在默认脚本路径:/usr/lib/zabbix/alertscripts

    2)创建个图片存放的目录

    mkdir -p /usr/lib/zabbix/alertscripts

    chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts

    vi /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

    chmod +x /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

    chown zabbix:zabbix /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

    3)脚本如下:

      1 #!/usr/bin/python
      2 #coding=utf-8
      3 from email.mime.text import MIMEText
      4 from email.mime.multipart import MIMEMultipart
      5 from email.mime.image import MIMEImage
      6 import smtplib,sys,os,time,re,requests
      7 
      8 user='Admin'
      9 password='zabbix'
     10 graph_path='/usr/lib/zabbix/alertscripts/graph'
     11 graph_url='http://192.168.0.1/chart.php'
     12 loginurl="http://192.168.0.1/index.php"
     13 host='192.168.0.1'
     14 to_email=sys.argv[1]
     15 subject=sys.argv[2]
     16 mail_host = 'smtp.163.com'
     17 mail_user = '123456@163.com'
     18 from_mail = '123456@163.com'
     19 mail_pass = '123456'
     20 mail_postfix = '163.com'
     21 
     22 def get_itemid():
     23     #获取报警的itemid
     24     itemid=re.search(r'监控ID:(d+)',sys.argv[3]).group(1)
     25     return itemid
     26 
     27 def get_graph(itemid):
     28     #获取报警的图表并保存
     29     session=requests.Session()   #创建一个session会话
     30     try:
     31         loginheaders={
     32         "Host":host,
     33         "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
     34         }
     35         #定义请求消息头
     36 
     37         payload = {
     38         "name":user,
     39         "password":password,
     40         "autologin":"1",
     41         "enter":"Sign in",
     42         }
     43         #定义传入的data
     44         login=session.post(url=loginurl,headers=loginheaders,data=payload)
     45         #进行登录
     46         graph_params={
     47             "itemids[0]":itemid,
     48             "from":"now-10m",
     49             "to":"now",
     50             "width": "400",
     51             "height":"200",
     52             }
     53         #定义获取图片的参数
     54         graph_req=session.get(url=graph_url,params=graph_params)
     55         #发送get请求获取图片数据
     56         time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
     57         graph_name='baojing_'+time_tag+'.png'
     58         #用报警时间来作为图片名进行保存
     59         graph_name = os.path.join(graph_path, graph_name)
     60         #使用绝对路径保存图片
     61         with open(graph_name,'wb') as f:
     62             f.write(graph_req.content)
     63             #将获取到的图片数据写入到文件中去
     64         return graph_name
     65 
     66     except Exception as e:
     67         print(e)
     68         return False
     69 def text_to_html(text):
     70     #将邮件内容text字段转换成HTML格式
     71     d=text.splitlines()
     72     #将邮件内容以每行作为一个列表元素存储在列表中
     73     html_text=''
     74     for i in d:
     75         i='' + i + '<br>'
     76         html_text+=i + '
    '
     77     #为列表的每个元素后加上html的换行标签
     78     return html_text
     79 
     80 def send_mail(graph_name):
     81     # 将html和图片封装成邮件进行发送
     82     msg = MIMEMultipart('related')  # 创建内嵌资源的实例
     83     with open(graph_name, 'rb') as f:
     84         graph = MIMEImage(f.read(),_subtype="png")
     85     graph.add_header('Content-ID', 'imgid1')  # 为图片对象添加标题字段和值
     86     text = text_to_html(sys.argv[3])
     87     html = """
     88     <html>
     89         <body>
     90         %s  <br><img src="cid:imgid1">
     91         </body>
     92     </html>
     93     """ % text
     94     html = MIMEText(html, 'html', 'utf-8')  # 创建HTML格式的邮件体
     95     msg.attach(html)  # 使用attach方法将HTML添加到msg实例中
     96     msg.attach(graph)  # 使用attach方法将图片添加到msg实例中
     97 
     98     msg['Subject'] = subject
     99     msg['From'] = from_mail
    100     msg['to'] = to_email
    101     try:
    102         s = smtplib.SMTP()
    103         s.connect(mail_host)
    104         s.login(mail_user, mail_pass)
    105         s.sendmail(from_mail, to_email, msg.as_string())
    106         s.close()
    107         return True
    108     except Exception as e:
    109         print('Exception', e)
    110         return False
    111 
    112 def run():
    113     itemid=get_itemid()
    114     graph_name=get_graph(itemid)
    115     send_mail(graph_name)
    116 
    117 if __name__ =='__main__':
    118     run()

    三、zabbix服务端配置

    1、定义报警媒介类型

    1)名称,自己定义,这边定义zabbix_mail_pic

    2)类型,选择脚本

    3)脚本名称,zabbix_email_pic.py

    4)脚本参数:

    {ALERT.SENDTO}

    {ALERT.SUBJECT}

    {ALERT.MESSAGE}

     2)用户添加报警媒介

    类型选择zabbix_mail_pic

     3)定义告警动作

    主题:Zabbix告警:服务器:{HOSTNAME}发生: {TRIGGER.NAME}故障!

    消息:

    监控ID:{ITEM.ID}
    告警主机:{HOST.NAME}
    告警主机:{HOST.IP}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
    事件ID:{EVENT.ID}

    主题:Zabbix告警:服务器:{HOST.NAME}发生: {TRIGGER.NAME}已恢复!

    消息:

    监控ID:{ITEM.ID}
    告警主机:{HOST.NAME}
    告警主机:{HOST.IP}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY}

     四、最终结果

  • 相关阅读:
    CentOS7防火墙
    [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
    二叉树系列
    二叉树系列
    [LeetCode] Binary Tree Level Order Traversal 与 Binary Tree Zigzag Level Order Traversal,两种按层次遍历树的方式,分别两个队列,两个栈实现
    动态规划小结
    [LeetCode] Populating Next Right Pointers in Each Node I, II
    [LeetCode] 递推思想的美妙 Best Time to Buy and Sell Stock I, II, III O(n) 解法
    二叉树系列
    [LeetCode] 数组的最长连续数, O(n)解法
  • 原文地址:https://www.cnblogs.com/guantou1992/p/14850657.html
Copyright © 2011-2022 走看看