zoukankan      html  css  js  c++  java
  • zabbix 定义触发器,并使用邮件,微信消息报警。

    触发器可根据监控项获取到的值来进行一些操作,如监控项获取到的values为0,触发器可判断为正常,如果获取到了1,就触发报警。

    定义报警方式比较简单,但是用shell脚本实现起来,总是有格式问题,所以我用python语言写了简单的程序[发邮件,发到微信号上],zabbix运行python程序时,传入几个参数,即可根据参数内容定义发送的介质。

    环境信息

    zabbix server:
    hostname=Zabbix server
    
    ip:192.168.100.7
    
     
    
    zabbix agent:
    
    hostname=host3
    
    ip:192.168.100.3

    目标

    对目前存在的监控创建触发器,根据监控项的值来判断要做的操作(查看这个监控项的创建过程:https://www.cnblogs.com/xiaodai12138/p/10159217.html)。

    nginx_status    当nginx正常运行时返回0,如果不正常则反馈非0的数字

    个性化发信配置过程概述

    1.一个监控项

    2.触发器匹配监控项的值,判断值符合触发条件,则触发报警。   #什么时候该发快递了

    3.定义报警媒介类型               #一个快递单,上面固定了快递运输方式,但是发件人收件人,发的东西不是快递单定义的,但是快递单子上已经有了那几个空行,需要有人在空行里面填写发件人等信息。

    4.定义用户报警媒介               #一个用户,他随时准备发快递,并且是他知道该发送给谁的。

    5.定义触发器触发后的动作    #第二2项触发,发快递,自己包装快递内容,让谁发送这个快递(那个人知道快递该发给谁),并告诉那个人,你要把快递用顺丰(多个报警媒介类型,可定义不同的发信方式)发走。

    创建触发器

    #根据监控项的值做判断,触发错误

    对nginx_status进行监控

     下图是点击上图add后出现的页面,添加触发条件页面

    创建完后保存即可。

    报警媒介类型

    #定义发信方式

    *编辑server端配置文件,添加下方内容,并重启server端

    #发信方式,我们使用脚本发信,脚本更灵活,没有限制,zabbix只需要将参数传给脚本,而不需要管脚本怎么做。

    [root@123 zabbix]# cat etc/zabbix_server.conf |grep ^AlertScriptsPath
    AlertScriptsPath=/usr/local/zabbix/shells/

    #定义使用邮箱发信报警信息,那么使用邮箱发信,需要动态定义的必须有3个东西分别是:接收方,标题,内容,在下图中对应的分别是{ALERT.SENDTO},  {ALERT.SUBJECT},{ALERT.MESSAGE}

    #使用此报警媒介类型,最终会执行send_mail.py脚本,并按照由上至下顺序给脚本传入3个位置参数,脚本内容如下

    #send_mail.py  连接个人163邮箱,发送邮件至位置参数中的邮箱

    #文中有部分区域,是需要自己填写的,填写你的发件邮箱。还有一些头部的信息。

    #脚本需要chmox  +x 给可执行权限。

     1 [root@123 shells]# vim /usr/local/zabbix/shells/send_mail.py 
     2 
     3 #!/usr/bin/python3
     4 import smtplib,sys
     5 from email.mime.text import MIMEText
     6 from email.header import  Header
     7 server=smtplib.SMTP(host='smtp.163.com')
     8 server.set_debuglevel(1)
     9 server.login(user='1821114****@163.com',password='twgdhbtz****')
    10 
    11 
    12 send_to=sys.argv[1]
    13 title=sys.argv[2]
    14 input_msg=sys.argv[3]
    15 
    16 
    17 
    18 msg=MIMEText(input_msg,'plain','utf-8')
    19 msg['Subject'] = Header(title, 'utf-8')
    20 msg['From'] ='from_zabbix<1821114****@163.com>'
    21 msg['To'] = send_to
    22 
    23 server.sendmail('1821114****@163.com',send_to,msg.as_string())
    24 server.quit()
    send_mail.py

    用户报警媒介

    #定义一个用户,定义这个用户的联系人,凡是需要此用户发信的时候,都发信给对应联系人地址。

    动作

    #触发器被触发后,做什么"动作"

    #实际作用:定义错误内容,关联发信方,使用哪种方式发信。

    #默认定义的动作,是对所有的触发器生效的,如果想让某个触发器触发某个动作,需要在动作内根据粗发起名称做条件判断,本文不讲这个。

     保存后让触发器条件不通过,从而触发动作。

    [root@host3 [12:02:31]~]#service nginx stop
    停止 nginx:                                               [确定]

    触发后,脚本执行成功。

     

    然后启动nginx,在观察下错误状态。

    [root@host3 [12:02:35]~]#service nginx start
    正在启动 nginx:                                           [确定]

    恢复了

    查看是否收到错误邮件和恢复邮件。

    #3封错误邮件,每过1分钟发一次,还有一个恢复通知邮件。

    到此,正常情况,你已经可以通过邮件发信了(如果不行,可以留言),我在使用邮件发信时,遇到了个问题,就是,我发邮件太频繁了,被屏蔽了,说我是垃圾邮件,那这种情况怎么处理,自建邮件服务成本太高,又不想去做邮箱提供商那所谓的充值提高信誉啥的,那就用微信来接收消息吧,主流聊天工具,每天看微信看得比邮箱次数还多,还能更快发现错误呢(需要一定的技术能力)。

    更改报警媒介类型

    #send_wechat.py脚本工作模式:获取zabbix传入的值,整合成为一个字符串,并放入mq中。

    #放入mq中的话实现了解耦效果,没有更多的依赖性,zabbix只管放,另一个程序只管读,读取mq中内容并发送到微信好友微信上。

    #标红区域修改过,避免机密信息泄露

    #脚本需要chmox  +x 给可执行权限。

     1 [root@123 shells]# vim /usr/local/zabbix/shells/send_wechat.py 
     2 
     3 #!/usr/bin/python3
     4 import pika,time,sys
     5 title=sys.argv[1]
     6 input_msg=sys.argv[2]
     7 messages="""Zabbix
     8 
     9 title:%s
    10 messages:%s
    11 """%(title,input_msg)

    12 username = 'xiaodai12138' 13 pwd = 'twgdhbtzhy****' 14 user_pwd = pika.PlainCredentials(username, pwd) 15 connect=pika.BlockingConnection(pika.ConnectionParameters( 16 '47.94.133.***',credentials=user_pwd 17 )) 18 channel=connect.channel() 19 channel.queue_declare(queue="zabbix_warning",durable=True) 20 channel.basic_publish(exchange="", 21 routing_key="zabbix_warning", 22 body=messages, 23 properties=pika.BasicProperties(delivery_mode=2), 24 ) 25 connect.close()

    读取mq中内容发送到微信上的程序内容,我们简称wechat.py

    #红色区域修改过

    #python itchat模块,使用前需要使用  itchat.auto_login(hotReload=True) 来登录微信,执行到此时,你的桌面会显示出来一个二维码,用你的微信扫描二维码即可登录,同时,你电脑端登录的微信将会被挤下去。

    #解耦的优点又来了,当你用微信扫描二维码,然后此程序会一直运行着,等待mq中有数据,如果有数据了,就自动发送,不用再次扫描二维码了,如果你直接让zabbix执行发送信息到微信的话,zabbix每次报警都会执行一次你的程序,你每次都要扫描二维码,如果不扫就登录不上,而且我还没试过在linxu上放下面这个程序。

    #此程需要一直运行着,你随便把这个程序放在哪儿,没有限制,只要保证这个程序不down,当zabbix上有报警时,这个程序就会发送到微信上面。

    import  pika,time
    import  itchat
    ##wechat itchat.auto_login(hotReload
    =True) users=itchat.search_friends(name='梦醒龙') #搜索朋友 username_chat=users[0]['UserName'] #获取朋友在微信底层中存在的用户名
    #mq username
    = 'xiaodai12138' pwd = 'twgdhbtzhy****' user_pwd = pika.PlainCredentials(username, pwd) connect=pika.BlockingConnection(pika.ConnectionParameters( '47.94.133.***',credentials=user_pwd )) channel=connect.channel() channel.queue_declare(queue="zabbix_warning",durable=True) def callback(ch, method, properties, body): warning_messages=body.decode('utf-8') print("recv:",warning_messages) print(username_chat) itchat.send(warning_messages, toUserName=username_chat) #发送消息给朋友 print(itchat.get_friends(username_chat)) ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1) channel.basic_consume(callback, queue='zabbix_warning', ) print(' [*] Waiting for messages.') channel.start_consuming()

    运行wechat.py,停止nginx,过1分钟后启动nginx,查看效果。

    #会显示二维码

     

     扫描登录后重启nginx,然后等待查看报警通知。

     

  • 相关阅读:
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业
    第一次个人作业
    个人总结-人生如戏
    第二次结对编程
    第一次结对作业
    第二次个人编程作业:代码互改
    第一次个人编程作业
    软件工与UML程第一次作业
  • 原文地址:https://www.cnblogs.com/xiaodai12138/p/10159916.html
Copyright © 2011-2022 走看看