一、监控Linux TCP连接状态

1.1 监控TCP连接数脚本

脚本需要放在对应的zabbix-agent服务器上

root@web1:~# vim /etc/zabbix/zabbix_agentd.conf.d/tcp_conn_plugin.sh
#!/bin/bash
tcp_conn_status(){
        TCP_STAT=$1
        ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
        TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
        if [ -z $TCP_NUM ];then
                TCP_NUM=0
                fi
                echo $TCP_NUM
}
main(){
        case $1 in
            tcp_status)
                tcp_conn_status $2;
                ;;
        esac
}
main $1 $2

#添加执行权限
root@web1:~# chmod a+x /etc/zabbix/zabbix_agentd.conf.d/tcp_conn_plugin.sh

1.2 zabbix agent添加自定义监控项

zabbix agent添加自定义监控项并调用脚本获取到监控项数据

root@web1:~# vim /etc/zabbix/zabbix_agentd.conf
#添加如下配置
UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.conf.d/tcp_conn_plugin.sh "$1" "$2"

#重启zabbix-agent
root@web1:~# systemctl restart zabbix-agent.service

1.3 zabbix server测试监控项数据

root@zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 10.10.100.105 -k "linux_status["tcp_status","LISTEN"]"
12

1.4 zabbix web导入模板

zabbix 告警脚本 zabbix脚本监控_zabbix

1.5 将模板关联到主机

zabbix 告警脚本 zabbix脚本监控_linux_02

1.6 查看监控数据

zabbix 告警脚本 zabbix脚本监控_redis_03

二、监控Redis

2.1 安装redis

root@web1:~# apt install redis
root@web1:~# vim /etc/redis/redis.conf
root@web1:~# systemctl start redis

2.2 监控脚本

root@web1:~# vim /etc/zabbix/zabbix_agentd.conf.d/redis_monitor.sh
#!/bin/bash
redis_status(){
        R_PORT=$1
        R_COMMAND=$2
        (echo -en "INFO \r\n";sleep 1;) | ncat 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp
        REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
        echo $REDIS_STAT_VALUE
}
help(){
        echo "${0} + redis_status + PORT + COMMAND"
}
main(){
        case $1 in
            redis_status)
                redis_status $2 $3
                ;;
            *)
                help
                ;;
        esac
}
main $1 $2 $3

root@web1:~# chmod a+x /etc/zabbix/zabbix_agentd.conf.d/redis_monitor.sh

#需要安装脚本使用的ncat命令
root@web1:~# apt install nmap

2.3 zabbix agent添加自定义监控项

root@web1:~# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=redis_status[*],/etc/zabbix/zabbix_agentd.conf.d/redis_monitor.sh "$1" "$2" "$3"

root@web1:~# systemctl restart zabbix-agent.service

2.4 zabbix server测试监控项数据

root@zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 10.10.100.105 -k "redis_status["redis_status","6379","used_memory"]"
841272

2.5 zabbix web制作模板

2.5.1 创建模板

zabbix 告警脚本 zabbix脚本监控_zabbix_04

2.5.2 创建监控项

2.5.2.1 当前连接数监控项

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_05

2.5.2.2 已用内存监控项

zabbix 告警脚本 zabbix脚本监控_linux_06

2.5.3 创建触发器

在刚刚创建的redis模板里添加触发器

2.5.3.1 当前连接数触发器

zabbix 告警脚本 zabbix脚本监控_nginx_07

2.5.3.2 已用内存触发器

需要将已用内存单位转换,从G转换为字节,例如当内存使用达2G时就进行触发,则换算方式如下:

210241024*1024

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_08

2.5.4 创建图像

2.5.4.1 redis当前连接数图像

zabbix 告警脚本 zabbix脚本监控_zabbix_09

2.5.4.2 redis已用内存图像

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_10

2.5.4.3 验证查看图像

zabbix 告警脚本 zabbix脚本监控_linux_11

三、监控nginx

对nginx的活动连接和当前状态等运行状态进行监控

3.1 nginx 配置状态页

#nginx配置文件 添加如下配置
        location /nginx_status {
                stub_status;
                allow 10.10.100.0/24;
                allow 127.0.0.1;
                deny all;
        }

访问验证

zabbix 告警脚本 zabbix脚本监控_nginx_12

3.2 监控脚本

root@web1:/etc# vim /etc/zabbix/zabbix_agentd.conf.d/nginx_status.sh
#!/bin/bash
nginx_status_fun(){
        NGINX_PORT=$1
        NGINX_COMMAND=$2
        nginx_active(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
        }
        nginx_reading(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
        }
        nginx_writing(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
        }
        nginx_waiting(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
        }
        nginx_accepts(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
        }
        nginx_handled(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
        }
        nginx_requests(){
                /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
        }
        case $NGINX_COMMAND in
                active)
                    nginx_active;
                    ;;
                reading)
                    nginx_reading;
                    ;;
                writing)
                    nginx_writing;
                    ;;
                waiting)
                    nginx_waiting;
                    ;;
                accepts)
                    nginx_accepts;
                    ;;
                handled)
                    nginx_handled;
                    ;;
                requests)
                    nginx_requests;
                    ;;
        esac
}

main(){
        case $1 in
                nginx_status)
                    nginx_status_fun $2 $3;
                    ;;
                *)
                    echo $"Usage: $0 {nginx_status key}"
        esac
}
main $1 $2 $3

3.3 zabbix-agent 添加自定义监控项

root@web1:/etc# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.conf.d/nginx_status.sh "$1" "$2" "$3"

#重启zabbix-agent
root@web1:/etc# systemctl restart zabbix-agent.service

在zabbix-server验证测试

root@zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 10.10.100.105 -k "nginx_status["nginx_status",80,"active"]"
1

3.4 导入Nginx监控模板

zabbix 告警脚本 zabbix脚本监控_redis_13

3.4 关联模板

zabbix 告警脚本 zabbix脚本监控_zabbix_14

3.5 验证监控数据

zabbix 告警脚本 zabbix脚本监控_redis_15

四、邮件通知

通过企业邮箱、第三方服务商邮箱发送报警邮件通知运维工程师

4.1 邮箱开启SMTP

如果是QQ邮箱需要单独开启SMTP,其他邮箱具体联系服务商

zabbix 告警脚本 zabbix脚本监控_zabbix_16


将页面生成后返回的授权码保存,后期会使用此授权码进行登录验证

zabbix 告警脚本 zabbix脚本监控_nginx_17

4.2 Zabbix Web创建报警媒介类型

报警媒介类型是一种给运维工程师发送消息通知的渠道,即当zabbix 的触发器触发一个事件后,怎么才能把这个事件通过某些方式通知给运维工程师呢?那么媒介类型就起到这样的作用,媒介类型创建好之后,需要在每个账户里面添加相应的收件配置,比如邮件类型的媒介类型要给zabbix账户添加邮箱,如果是微信类型的媒介类型那么就要在zabbix账户设置微信号,同样的到来,短信类型的媒介类型那就得给zabbix账户设置手机号用于接收报警消息内容。

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_18

密码使用刚刚保存的授权码

4.3 给用户添加报警报警媒介

用户界面选择用户添加

zabbix 告警脚本 zabbix脚本监控_redis_19

4.4 创建动作

动作是对zabbix 触发器触发后生成的事件的具体处理操作,可以是远程执行命令,也可以是发送通知给指定的管理员进行故障处理,发送命令是调用的上一步骤创建好的报警媒介类型。

zabbix 告警脚本 zabbix脚本监控_nginx_20

4.5 配置动作信息

4.5.1 告警操作

zabbix 告警脚本 zabbix脚本监控_linux_21

4.5.2 恢复操作

zabbix 告警脚本 zabbix脚本监控_linux_22


点击添加保存动作

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_23

4.6 验证动作

将某个被监控的服务手动停止,验证能否收到zabbix 发送的报警通知

这里手动挺掉web1上的nginx服务验证

root@web1:~# systemctl stop nginx

zabbix-web界面已显示邮件已发送

zabbix 告警脚本 zabbix脚本监控_linux_24


登入到邮箱可以看到已经收到邮件了

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_25

启动nginx测试下恢复通知

root@web1:~# systemctl start nginx

nginx恢复后,收到恢复通知

zabbix 告警脚本 zabbix脚本监控_zabbix_26

五、微信通知

5.1 企业微信注册及配置

https://work.weixin.qq.com/ 打开企业微信官网注册账号,使用自己的手机号进行注册。

5.2 登录PC版

注册完成账号之后扫码登录PC版web界面,创建应用

5.2.1 创建应用

**点击应用管理,选择创建应用 **

zabbix 告警脚本 zabbix脚本监控_nginx_27


zabbix 告警脚本 zabbix脚本监控_redis_28


填写信息

zabbix 告警脚本 zabbix脚本监控_zabbix_29

创建完成

AgentID和Secret会在发送微信报警信息的时候调用

zabbix 告警脚本 zabbix脚本监控_redis_30

5.2.2 查看企业信息

企业ID在发送微信报警信息的时候会调用

zabbix 告警脚本 zabbix脚本监控_linux_31

5.3 zabbix server配置

zabbix server实现微信通知基于python调用脚本实现且需要安装requests模块:

#官方教程
https://work.weixin.qq.com/api/doc#90000/90003/90487

先获取token,token是通过corpid(企业ID)和corpsecret(应用 Secret)获取到的,然后通过API发送消息,根据官方文档可以看到,发送的消息其实就是一个post请求,请求方式如下:

请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
post 参数为 access_token 和 消息体。

服务端API调用:https://work.weixin.qq.com/api/doc#90000/90135/90664

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_32

5.3.1 编写python脚本

在zabbix server安装基础模块并编写pyhton脚本,python脚本通过调用企业微信的API实现自动发送通知消息,具体内容如下:

root@zabbix-server:~# apt install python-pip
root@zabbix-server:~# pip install requests

root@zabbix-server:~# vim /apps/zabbix_server/share/zabbix/alertscripts/wx.py
#!/usr/bin/python3.6
#coding:utf-8
import requests
import sys
import os
import json
import logging
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
        datefmt = '%a, %d %b %Y %H:%M:%S',
        filename = os.path.join('/tmp','weixin.log'),
        filemode = 'a')

corpid='企业ID'
appsecret="秘钥"
agentid="AgentID"
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']

msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
touser=sys.argv[1]
subject=sys.argv[2]
message=sys.argv[2] + "\n\n" +sys.argv[3]

params={
        "touser": touser,
        "msgtype": "text",
        "agentid": agentid,
        "text": {
            "content": message
            },
        "safe":0
        }
req=requests.post(msgsend_url, data=json.dumps(params))
logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)

5.3.2 添加微信报警媒介类型

zabbix 告警脚本 zabbix脚本监控_nginx_33

5.3.3 添加联系人报警媒介

zabbix 告警脚本 zabbix脚本监控_nginx_34

5.3.4 添加微信报警动作

zabbix 告警脚本 zabbix脚本监控_linux_35

5.3.5 配置故障操作

zabbix 告警脚本 zabbix脚本监控_redis_36

5.3.6 配置恢复操作

zabbix 告警脚本 zabbix脚本监控_linux_37

5.4 测试微信报警

root@web1:~# systemctl stop nginx

zabbix 告警脚本 zabbix脚本监控_zabbix 告警脚本_38


zabbix 告警脚本 zabbix脚本监控_nginx_39