• 通过脚本发送zabbix邮件报警


    zabbix原生的报警媒介类型中,邮件报警是我们常用的方式。当我们在CentOS6上面安装zabbix3.0并配置邮件报警的时候,在邮件配置正确的前提下,不管触发器如何触发,邮件总是发送不出去,但是在CentOS7上面安装的zabbix3.0却可以正常发送邮件。究其原因,是因为zabbix3.0对服务器上的libcurl版本有要求(CentOS6.9上的默认curl版本为7.19.7,而CentOS7.2上的默认libcurl版本为7.29.0),zabbix3.0所要求的的版本说明在zabbix3.0的官方文档上面可以找到

    https://www.zabbix.com/documentation/3.0/manual/installation/install,官网指出从zabbix3.0.0以来的libcurl会影响邮件服务器的认证,其版本必须为7.20.0或更高

    要想通过邮件发送报警,可以选择的解决方法有两种:自定义邮件报警脚本或者升级libcurl版本。后者从理论来讲当然可以实现,但是升级版本会由于依赖关系变得复杂,因此可以采取第一种解决方法,通过使用python脚本来发邮件

    1、web界面新增报警媒介类型

    名称自定义即可,类型选择脚本,脚本名称为所写的脚本的名称,这里的python脚本通过qq邮箱来做服务,脚本的三个参数都是zabbix内置变量,分别为:报警收件人:{ALERT.SENDTO},报警标题:{ALERT.SUBJECT},报警内容:{ALERT.MESSAGE},在zabbix中自定义报警媒介的脚本默认存放路径(yum安装zabbix)为/usr/lib/zabbix/alertscripts

    添加完报警媒介类型后勾选启用

    2、关于脚本

    脚本内容不做过多说明,需要了解含义请自行百度,脚本使用的是python语言,在语法上要求较严格。 qq邮箱使用了ssl/tls加密465端口,网易163邮箱使用默认方式25端口,因此脚本内容会有一些差别,脚本如下

    [root@zabbix alertscripts]# pwd

    /usr/lib/zabbix/alertscripts

    [root@zabbix alertscripts]# cat mail_qq.py

    #!/usr/bin/python

    #coding:utf-8

    import smtplib

    from email.mime.text import MIMEText

    import sys

    mail_user = '111111111@qq.com'

    mail_pass = 'xxxxxxxxxxx'

     

    def send_mail(to_list,subject,content):

    me = "zabbix 监控告警平台"+"<"+mail_user+">"

    msg = MIMEText(content, 'plain', 'utf-8')

    msg['Subject'] = subject

    msg['From'] = me

    msg['to'] = to_list

    try:

    s = smtplib.SMTP_SSL("smtp.qq.com", 465)

    s.login(mail_user,mail_pass)

    s.sendmail(me,to_list,msg.as_string())

    s.close()

    return True

    except Exception,e:

    print str(e)

    return False

    if __name__ == "__main__":

    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])

    mail_user为邮箱地址,mail_pass为邮箱服务商提供的客户端授权码,获得授权码的方式也可以参考百度,要说明的是目前网易邮箱客户端授权码支持自定义,qq邮箱客户端授权码不支持自定义,需要生成、这里也附上使用163邮箱的脚本

    [root@zabbix alertscripts]# cat mail_163.py

    #!/usr/bin/python

    #coding:utf-8

    import smtplib

    from email.mime.text import MIMEText

    import sys

    mail_user = '1232323232@163.com'

    mail_pass = 'xxxxxxxxxx'

     

    def send_mail(to_list,subject,content):

    me = "zabbix 监控告警平台"+"<"+mail_user+">"

    msg = MIMEText(content, 'plain', 'utf-8')

    msg['Subject'] = subject

    msg['From'] = me

    msg['to'] = to_list

    try:

    s = smtplib.SMTP("smtp.163.com", 25)

    s.login(mail_user,mail_pass)

    s.sendmail(me,to_list,msg.as_string())

    s.close()

    return True

    except Exception,e:

    print str(e)

    return False

    if __name__ == "__main__":

    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])

    脚本编写完成之后需要为脚本添加执行权限

    [root@zabbix alertscripts]# chmod +x mail_qq.py

    3、测试

    命令行测试脚本能否成功执行

    [root@zabbix alertscripts]# ./mail_qq.py xxx@163.com "测试" 'test'

    测试参数为三个,分别为收件人邮箱地址,邮件标题,邮件内容

    测试的时候如果出现错误提示缺少smtplib,解决方法为使用pip进行安装:pip install smtplib

    测试完成了就可以通过zabbix进行触发报警了

  • 相关阅读:
    下载远程url文件(或者文件流)到本地
    在jsp中出现异常后应该停止往下执行的情况,怎么处理?
    用js函数处理事件时,有时候可能因为页面部分组件不需要显示,但仍需要执行js,会有报错,但是不想暴露页面,是业务正常进行。。。。
    Linux shell 逻辑判断符号
    java生成excel并可以导出
    timer定时器
    StringBuffer的使用
    jsp不能使用return时候,如何在出异常时退出,不在向下执行
    java 调用linux脚本例子
    关于File.separator 文件路径:wind与linux下路径问题 .
  • 原文地址:https://www.cnblogs.com/ssgeek/p/9223554.html
Copyright © 2020-2023  润新知