Zabbix监控系统 (3) 之 添加自定义监控项目、配置邮件告警、测试告警

1. 添加自定义监控项目

该配置的用途是监控模板中没有的监控项目。

1.1 需求

监控某台web的80端口连接数,并出图。 步骤: 1) zabbix监控中心创建监控项目 2) 针对该监控项目以图形展现

1.2 配置客户端80端口的监控脚本

[root@yt-02 ~]# vim /usr/local/sbin/estab.sh
#!/bin/bash
# 获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
# 注意:80后面跟一个空格,保证匹配更精确,如果不加空格,会把8080端口同时过滤出来。

更改权限:
[root@yt-02 ~]# chmod 755 /usr/local/sbin/estab.sh

1.3 打开zabbix客户端的自定义脚本开关:

[root@yt-01 ~]# vim /etc/zabbix/zabbix_agentd.conf
# 搜索 /UnsafeUserParameters和UserParameter
……
UnsafeUserParameters=1 #表示使用自定义脚本
# 自定义监控项的key(监控web端“键值”)为my.estab.count,后面的[*]里面写的是脚本参数 
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
# 如果没有参数则可以省略,脚本为/usr/local/sbin/estab.sh

重启zabbix-agent服务
[root@z2 ~]# systemctl restart zabbix-agent

1.4 服务端使用zabbix自带命令测试该脚本

[root@yt-01 ~]# zabbix_get -s 192.168.122.131 -p 10050 -k 'my.estab.count'
0

-s:源地址
-p: 端口
-k: 键值
如上显示0即为没有任何连接。

出现的问题的话:

  • 关闭iptables
  • 关闭selinux
  • 检查脚本权限

1.5 配置web端参数

创建监控项

配置 → 主机 → 监控项 → 创建监控项 输入图片说明

创建图形

“配置”→“主机” →“图形” → 创建图形” 输入图片说明

添加该项目后,到“监测中” → “最新数据”查看刚添加的项目是否有数据出现 有了数据就可以添加图形了。 输入图片说明

创建触发器

输入图片说明

2. 配置邮件告警

配置告警是目前绝大多数企业必须要有的一个状态,遇到问题第一时间获得警告大大提升了运维的高效性,如果没有配置任何告警,等待客户反应,这是一个非常不明智的选择。

2.1 选择邮箱

建议配置一个163邮箱、移动139邮箱或者QQ邮箱,然后邮箱绑定微信,在遇到故障的第一时间就可以收到告警邮件。 以163为例子,记得开启授权码和POP3/SMTP/IMAP服务。

2.2 编辑zabbix报警媒介

管理 → 报警媒介类型 → 创建媒体类型(不建议用自带的脚本,不好用) 脚本名称一定要用自己自定义的!!!

脚本参数(不然不可以发邮件):

{ALERT.SENDTO} //发给谁
{ALERT.SUBJECT} //主题
{ALERT.MESSAGE} //邮件内容

输入图片说明

2.3 写一个报警的邮件脚本

服务端

查看报警脚本保存路径:
[root@yt-01 ~]# vim /etc/zabbix/zabbix_server.conf
脚本位置 AlertScriptsPath=/usr/lib/zabbix/alertscripts

创建报警脚本mail.py:

[root@z1 ~]# cd /usr/lib/zabbix/alertscripts
[root@z1 alertscripts]# vim mail.py

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
    gserver = 'smtp.qq.com'     # smtp服务器
    gport = 25                           # 默认端口是25
    try:
        msg = MIMEText(unicode(content).encode('utf-8'))
        msg['from'] = mailfrom
        msg['to'] = mailto
        msg['Reply-To'] = mailfrom
        msg['Subject'] = subject
        smtp = smtplib.SMTP(gserver, gport)
        smtp.set_debuglevel(0)
        smtp.ehlo()
        smtp.login(username,password)
        smtp.sendmail(mailfrom, mailto, msg.as_string())
        smtp.close()
    except Exception,err:
        print "Send mail failed. Error: %s" % err
def main():
    to=sys.argv[1]
    subject=sys.argv[2]
    content=sys.argv[3]
##定义163或者qq邮箱的账号和授权码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)
    sendqqmail('[email protected]','aaaaaaaaaa','[email protected]',to,subject,content)
if __name__ == "__main__":
    main()
#####脚本使用说明######
#1. 首先定义好脚本中的邮箱账号和密码
#2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"

更改脚本权限
[root@yt-01 alertscripts]# chmod 755 /usr/lib/zabbix/alertscripts/mail.py
测试能否发邮件
[root@yt-01 alertscripts]# python mail.py [email protected] "zhuti" "neirong"
# 用邮箱自己给自己发送邮件,保证其不出其他故障

发送成功! 输入图片说明

2.4 配置用户

创建一个接受告警邮件的用户,“管理”,“用户”,“创建用户”,“报警媒介”,类型选择“baojing”,注意用户的权限,如果没有需要到用户组去设置权限 输入图片说明

2.5 配置报警媒介

打开用户yuntai——报警媒介——添加报警媒介——更新 输入图片说明

2.6 配置权限

需要到用户所在的“用户群组”更改用户的权限 输入图片说明

2.7 配置动作

设置触发器被触发后所要执行的的操作! “配置”——“动作”——“创建动作”

输入图片说明

输入图片说明

输入图片说明

3. 测试告警

配置 → 主机 → 触发器 → 创建触发器

条件改成,并发数小于5,咱们的虚拟机压根就没有任何人去访问,所以轻轻松松报警。 输入图片说明

反应很快:

输入图片说明 输入图片说明 输入图片说明

把触发器改回 ">200",很快就好了,收到恢复邮件

输入图片说明

邮件乱码问题解决

如上图,告警邮件中文都是方块的问题,有2个方案

  1. 触发器和监控项都改为英文
  2. 更新告警邮件脚本
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_host = 'smtp.163.com'
mail_user = '[email protected]'
mail_pass = '1111111'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
    me = "zabbix 监控告警平台"+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = me
    msg['to'] = to_list
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        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])

猜你喜欢

转载自my.oschina.net/zhouyuntai/blog/1788830