文章目录

  • 一、部署server端和agent端
  • 1、实验准备
  • 2、部署zabbix-server【监控端】
  • (1)安装zabbix-server
  • (2)启动mariadb
  • (3)准备数据库及授权
  • (4)导入数据库文件
  • (5)修改zabbix配置文件
  • (6)启动zabbix-server
  • (7)修改Apache配置文件,修改时区
  • (8)启动Apache服务
  • 3、部署zabbix-agent【被监控端】
  • (1)安装zabbix-agent
  • (2)zabbix-agent配置
  • (3)启动zabbix-agent
  • (4)准备网站测试环境(redis)
  • 4、 实现对web服务器监控【监控端】
  • (1)定义监控项
  • (2)定义触发器
  • (3)定义动作(action)
  • 二、邮件报警
  • 1、配置需要的邮件信息
  • 2、zabbix监控端配置
  • 3、web网页配置(脚本)
  • (1)添加报警媒介
  • (2)添加用户
  • (3)创建动作
  • (4)测试
  • 3、另一种方式:web网页配置(电子邮件)
  • 二、钉钉报警
  • 三、微信报警
  • 1、python报警监控脚本
  • 2、zabbix 创建告警媒介
  • 3、zabbix 添加告警用户
  • 5.8 Zabbix 添加报警动作
  • 5.9 测试微信报警


一、部署server端和agent端

1、实验准备

centos7.4 系统服务器2台、 一台作为监控服务器, 一台作为被监控节点, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信。
1)所有机器关闭防火墙和selinux

setenforing 0 (修改配置文件关闭)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
systemctl stop firewalld.service

2)根据架构图,实验基本设置如下:

机器名称

IP配置

服务角色

备注

server

192.168.246.228

zabbix-server

开启监控功能

node1

192.168.246.226

zabbix-agent-none1

开启

2、部署zabbix-server【监控端】

(1)安装zabbix-server
[root@youngfit ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
[root@youngfit ~]# yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent	httpd  mariadb mariadb-server
(2)启动mariadb
[root@youngfit ~]# systemctl restart mariadb
[root@youngfit ~]# systemctl enable mariadb
(3)准备数据库及授权
[root@youngfit ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> \q
Bye
(4)导入数据库文件
[root@youngfit ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -pzabbix zabbix
(5)修改zabbix配置文件
[root@youngfit ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
注意删除前面的空格
(6)启动zabbix-server
[root@youngfit ~]# systemctl restart zabbix-server zabbix-agent  //重启zabbix服务和agent
[root@youngfit ~]# systemctl enable zabbix-server zabbix-agent  //设置为开机自启动
(7)修改Apache配置文件,修改时区
[root@youngfit ~]# vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai
(8)启动Apache服务
[root@youngfit ~]# systemctl restart httpd
[root@youngfit ~]# systemctl enable httpd

3、部署zabbix-agent【被监控端】

(1)安装zabbix-agent
[root@web1  ~]# rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm     
[root@web1  ~]# yum -y install zabbix-agent
(2)zabbix-agent配置
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=47.75.81.162 //zabbix-server IP 即监控端的IP
ServerActive=47.75.81.162 //zabbix-server IP 即监控端的IP
UnsafeUserParameters=1 是否限制用户自定义 keys 使用特殊字符 1是可以启用特殊字符 0是不可以启用特殊字符
EnableRemoteCommands=0 是否允许别人执行远程操作命令,默认是禁用的,打开的话会有安全风险.
(3)启动zabbix-agent
[root@web1 ~]# systemctl start zabbix-agent
[root@web1  ~]# systemctl enable zabbix-agent
(4)准备网站测试环境(redis)

如果已经在前安装redis,则不需要操作
首先,我们在agent端使用yum安装一下redis

[root@zabbix-agent-none1 ~]# yum -y install epel-release
[root@zabbix-agent-none1 ~]# yum install -y redis

修改一下配置文件:

[root@zabbix-agent-none1 ~]# vim /etc/redis.conf 
bind 0.0.0.0        #不做任何认证操作

修改完成以后,我们启动服务,并检查端口:

[root@zabbix-agent-none1 ~]# systemctl start redis
[root@zabbix-agent-none1 ~]# netstat -lntp | grep redis 
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      1353/redis-server 0

4、 实现对web服务器监控【监控端】

接着,我们就可以去网站上来定义相关的操作了

(1)定义监控项

进入 配置 —> 主机 —> node1 —> 监控项(items)—> 创建监控项

android短信中收件手机号码 短信收件人怎么填_redis

填写完毕以后,我们点击下方的添加。

android短信中收件手机号码 短信收件人怎么填_zabbix_02

该监控项已成功添加。

  我们可以去查看一下他的值:

  检测中 —> 最新数据

android短信中收件手机号码 短信收件人怎么填_redis_03

(2)定义触发器

定义好了监控项以后,我们亦可来定义一个触发器,当服务有问题的时候,我们才能及时知道:

  进入 配置 —> 主机 —> none1 —> 触发器(trigger)—> 创建触发器

android短信中收件手机号码 短信收件人怎么填_zabbix_04

android短信中收件手机号码 短信收件人怎么填_redis_05


 填写完毕以后,我们点击下方的添加。

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_06

该触发器已成功添加。

  我们去查看一下:

  监测中 —> 最新数据

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_07

我们来手动关闭redis服务来检测一下:

[root@zabbix-agent-none1 ~]# systemctl stop redis

进入 监测中 —> 问题

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_08

可以看到,现在已经显示的是问题了。并且有持续的时间,当我们的服务被打开,会转为已解决状态:

[root@zabbix-agent-none1 ~]# systemctl start redis

android短信中收件手机号码 短信收件人怎么填_redis_09

(3)定义动作(action)

现在我们就可以去定义action了。

进入 配置 —> 动作 —> 创建动作(注意选择事件源为触发器)

android短信中收件手机号码 短信收件人怎么填_zabbix_10

android短信中收件手机号码 短信收件人怎么填_数据库_11

android短信中收件手机号码 短信收件人怎么填_数据库_12

我们可以进行操作添加:

android短信中收件手机号码 短信收件人怎么填_redis_13

我们可以看出,还需要在虚拟机上进行两项操作,一是修改sudo配置文件使zabbix用户能够临时拥有管理员权限;二是修改zabbix配置文件使其允许接收远程命令。我们进行如下操作:

[root@zabbix-agent-none1 ~]# visudo          #相当于“vim /etc/sudoers”
    ## Allow root to run any commands anywhere
    root    ALL=(ALL)   ALL
    zabbix    ALL=(ALL)   NOPASSWD:ALL     #添加的一行,表示不需要输入密码

[root@zabbix-agent-none1 ~]# vim /etc/zabbix/zabbix_agentd.conf
    EnableRemoteCommands=1          #允许接收远程命令
    LogRemoteCommands=1             #把接收的远程命令记入日志

[root@zabbix-agent-none1 ~]# systemctl restart zabbix-agent.service

我们添加了第一步需要做的事情,也就是重启服务,如果重启不成功怎么办呢?我们就需要来添加第二步:

android短信中收件手机号码 短信收件人怎么填_redis_14

添加完成以后,我们可以看一下:

android短信中收件手机号码 短信收件人怎么填_redis_15

操作添加完了,如果服务自动恢复了,我们可以发送消息来提示:

android短信中收件手机号码 短信收件人怎么填_zabbix_16

至此,我们的动作设置完毕,可以点击添加了,添加完成会自动跳转至如下页面:

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_17

现在我们可以手动停止服务来进行测试:

[root@zabbix-agent-none1 ~]# systemctl stop redis.service

然后我们来到问题页面来查看,发现确实有问题,并且已经解决: 等一会

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_18

也可以去agent端查看端口是否开启:

[root@zabbix-agent-none1 ~]# systemctl stop redis 
[root@zabbix-agent-none1 ~]# netstat -lntp | grep redis 
[root@zabbix-agent-none1 ~]# netstat -lntp | grep redis 
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      1957/redis-server 0

查看邮箱是否成功
[root@zabbix-server ~]# yum -y install mailx
[root@zabbix-server ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 1 message 1 unread
>U  1 zabbix@localhost.loc  Thu Oct 10 00:51  21/865   "Resolved: redis service down"

邮箱也已经成功

可以看出端口正常开启,我们的动作触发已经完成。

补充:我们也可以使用脚本来发送警报,我们的脚本存放路径在配置文件中可以找到,定义为:AlterScriptsPath=/usr/lib/zabbix/alertscripts

然后我们将这个动作关闭掉为后期的邮件报警做准备。

android短信中收件手机号码 短信收件人怎么填_redis_19

二、邮件报警

1、配置需要的邮件信息

android短信中收件手机号码 短信收件人怎么填_运维_20

android短信中收件手机号码 短信收件人怎么填_redis_21

2、zabbix监控端配置

yum -y install mailx

vim /etc/mail.rc
'//末尾添加'
set from=邮箱
set smtp=smtp.qq.com
set smtp-auth-user=邮箱
set smtp-auth-password=邮箱授权码
set smtp-auth=login

测试下邮件是否可以发送

echo "hello tomorrow" | mail -s "test" 邮箱

android短信中收件手机号码 短信收件人怎么填_数据库_22

编写邮件脚本

cd /usr/lib/zabbix/alertscripts
vim mailx.sh
#!/bin/bash
#send mail
messages=`echo $3 | tr '\r\n' '\n'`
subject=`echo $2 | tr '\r\n' '\n'`
echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1

创建日志文件并修改权限并测试

touch /tmp/mailx.log
chown -R zabbix.zabbix  /tmp/mailx.log 
chmod +x mailx.sh 
chown -R zabbix.zabbix /usr/lib/zabbix/
sh mailx.sh 邮箱 zabbix "this is test"

android短信中收件手机号码 短信收件人怎么填_zabbix_23

3、web网页配置(脚本)

(1)添加报警媒介
管理 > 报警媒介类型 > 创建媒体类型

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_24

名称自定义,后面会用到 类型选择脚本 脚本名称是之前编辑的脚本名称 脚本的三个参数: {ALERT.SENDTO} { ALERT.SUBJECT} {ALERT.MESSAGE}

android短信中收件手机号码 短信收件人怎么填_运维_25

(2)添加用户

管理 > 用户 > 点击Admin > 报警媒介 > 添加

类型选择之前自定义的名称
收件人填自己邮箱
点击添加
点击更新

android短信中收件手机号码 短信收件人怎么填_zabbix_26

android短信中收件手机号码 短信收件人怎么填_运维_27

(3)创建动作

配置 > 动作 >创建动作 > 删除默认 > 创建动作

android短信中收件手机号码 短信收件人怎么填_redis_28

添加执行操作

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_29


android短信中收件手机号码 短信收件人怎么填_数据库_30


注:也可以自定义消息内容

默认标题   {TRIGGER.STATUS}:{TRIGGER.NAME}
消息内容   告警主机:{HOST.NAME}
          告警IP:{HOST.IP}
          告警时间:{EVENT.DATE}-{EVENT.TIME}
          告警等级:{TRIGGER.SEVERITY}
          告警信息:{TRIGGER.NAME}-{ITEM.VALUE}
          事件ID:{EVENT.ID}

添加恢复操作

除了消息内容的模板,其他和上一步基本一致

android短信中收件手机号码 短信收件人怎么填_redis_31

默认标题   {TRIGGER.STATUS}:{TRIGGER.NAME}

消息内容   恢复主机:{HOST.NAME}
          恢复IP:{HOST.IP}
          恢复时间:{EVENT.DATE}-{EVENT.TIME}
          恢复等级:{TRIGGER.SEVERITY}
          恢复信息:{TRIGGER.NAME}-{ITEM.VALUE}
          事件ID:{EVENT.ID}

最后再确认一下操作是不是都添加完成了,如果没完成是不会发送邮件的!!

(4)测试

被监控端停止sshd服务

systemctl stop redis

可以看到邮件已经发送过来了,并且仪表板的问题界面开始闪烁

重新开启服务后同样会有邮件发来

android短信中收件手机号码 短信收件人怎么填_zabbix_32

3、另一种方式:web网页配置(电子邮件)

android短信中收件手机号码 短信收件人怎么填_zabbix_33

二、钉钉报警

android短信中收件手机号码 短信收件人怎么填_数据库_34


android短信中收件手机号码 短信收件人怎么填_redis_35


android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_36


android短信中收件手机号码 短信收件人怎么填_redis_37

android短信中收件手机号码 短信收件人怎么填_redis_38

android短信中收件手机号码 短信收件人怎么填_数据库_39


android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_40


android短信中收件手机号码 短信收件人怎么填_redis_41


点击机器人的设置,把 webhook 的地址记录下来(很重要)

android短信中收件手机号码 短信收件人怎么填_运维_42

创建脚本,赋予执行权限

[root@zabbix-server ~]# cd /usr/lib/zabbix/alertscripts
[root@zabbix-server alertscripts]# vim dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author: sxdswc999 
import requests
import json
import sys
import os
 
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = ""  #机器人的Webhook地址
 
def msg(text):
    json_text= {
     "msgtype": "text",
        "text": {
            "content": text
        },
        "at": {
            "atMobiles": [
                ""    #手机号
            ],
            "isAtAll": False
        }
    }
    print requests.post(api_url,json.dumps(json_text),headers=headers).content
     
if __name__ == '__main__':
    text = sys.argv[1]
    msg(text)
[root@zabbix-server alertscripts]# chmod +x dingding.py

安装python-pip和requests库

[root@zabbix-server alertscripts]# yum -y install epel-release
[root@zabbix-server alertscripts]# yum -y install python-pip
[root@zabbix-server alertscripts]# pip install requests

android短信中收件手机号码 短信收件人怎么填_数据库_43

测试脚本是否可行

[root@zabbix-server alertscripts]# ./dingding.py 监控报警
{"errcode":0,"errmsg":"ok"}

android短信中收件手机号码 短信收件人怎么填_redis_44

pc端接收成功:

android短信中收件手机号码 短信收件人怎么填_zabbix_45

移动端App接收成功:

android短信中收件手机号码 短信收件人怎么填_redis_46

在监控页面创建媒介:

android短信中收件手机号码 短信收件人怎么填_redis_47

android短信中收件手机号码 短信收件人怎么填_数据库_48

将Admin用户关联到此媒介:

android短信中收件手机号码 短信收件人怎么填_redis_49

android短信中收件手机号码 短信收件人怎么填_数据库_50

收件人填钉钉的webhook

android短信中收件手机号码 短信收件人怎么填_redis_51

配置完成

三、微信报警

  • 部门ID
  • android短信中收件手机号码 短信收件人怎么填_运维_52

  • AgentID和Secret
  • android短信中收件手机号码 短信收件人怎么填_数据库_53


  • android短信中收件手机号码 短信收件人怎么填_zabbix_54

  • 企业ID
  • android短信中收件手机号码 短信收件人怎么填_zabbix_55

1、python报警监控脚本

需要修改脚本中的四个信息:
self.__corpid = 'wwd5348195e1cdd809' //公司的corpid
self.__secret = '2QvlfpUxh4k-JeIuxVNmkh2N7ijfkCs1lzb4Tkgr6xQ' //应用的secret
'toparty':1, //部门id
'agentid':"1000002", //应用id
[root@zabbix-server ~]# vim /usr/lib/zabbix/alertscripts/wechat.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib,urllib2,json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

class WeChat(object):
		__token_id = ''
		# init attribute
		def __init__(self,url):
				self.__url = url.rstrip('/')
				self.__corpid = 'wwd2385f23ad80ecef'
				self.__secret = '3gsEC6Mv3vQmdG5MOJBF65U0KzTl-1v2GKQhr479uso'
		# Get TokenID
		def authID(self):
				params = {'corpid':self.__corpid, 'corpsecret':self.__secret}
				data = urllib.urlencode(params)
				
				content = self.getToken(data)
				
				try:
						self.__token_id = content['access_token']
						# print content['access_token']
				except KeyError:
						raise KeyError
						
						
		# Establish a connection
		def getToken(self,data,url_prefix='/'):
				url = self.__url + url_prefix + 'gettoken?'
				try:
						response = urllib2.Request(url + data)
				except KeyError:
						raise KeyError
                result = urllib2.urlopen(response)
                content = json.loads(result.read())
				return content
				
				
        # Get sendmessage url
        def postData(self,data,url_prefix='/'):
				url = self.__url + url_prefix + 'message/send?access_token=%s' % self.__token_id
				request = urllib2.Request(url,data)
				try:
						result = urllib2.urlopen(request)
				except urllib2.HTTPError as e:
                        if hasattr(e,'reason'):
                       		 	print 'reason',e.reason
                        elif hasattr(e,'code'):
                        		print 'code',e.code
                        return 0
				else:
                        content = json.loads(result.read())
                        result.close()
				return content
		# send message
		def sendMessage(self,touser,message):
                self.authID()
                data = json.dumps({
                   	 	'touser':touser,
                    	'toparty':1,
                    	'msgtype':"text",
                    	'agentid':"1000002",
                    	'text':{
                    	'content':message
                         },
						 'safe':"0"
					},ensure_ascii=False)
                    response = self.postData(data)
                    print response
if __name__ == '__main__':
        a = WeChat('https://qyapi.weixin.qq.com/cgi-bin')
        a.sendMessage(sys.argv[1],sys.argv[3]

监控脚本测试:

注:Youngfit为上图的企业微信名 test为标题 yufei为内容,标题和内容均可自定义

[root@youngfit ~]# /usr/lib/zabbix/alertscripts/wechat.py Youngfit test yufei
{u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}

2、zabbix 创建告警媒介

注:(以哪种方式发送报警信息,短信,脚本等等)

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_56

android短信中收件手机号码 短信收件人怎么填_运维_57

3、zabbix 添加告警用户

创建用户组:web-group,包含yangge、alice...等用户
创建用户:yangge、alice...等用户,并关联到微信告警
希望的结果是:发微信到组web-group,组中的用户yangge、alice都能收到

android短信中收件手机号码 短信收件人怎么填_redis_58

android短信中收件手机号码 短信收件人怎么填_redis_59

5.8 Zabbix 添加报警动作
如果希望中文显示:
告警主机: {HOST.NAME}
告警地址: {HOST.IP}
监控项目: {ITEM.NAME}
告警等级: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警时间: {EVENT.DATE} {EVENT.TIME}

android短信中收件手机号码 短信收件人怎么填_redis_60

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_61

5.9 测试微信报警

被监控端操作

[root@web1 ~]# systemctl stop httpd

android短信中收件手机号码 短信收件人怎么填_android短信中收件手机号码_62