zabbix简介安装

zabbix简介

zabbix官方的一句话描述zabbix:

  • 监视任何事情适用于任何IT基础架构,服务,应用程序和资源的解决方案

  • Monitor anythingSolutions for any kind of IT infrastructure, services, applications, resources

  • 监控基础概论

  1. zabbix并非监控,而是实现监控的工具

  2. Zabbix-server是一个c/s和b/s结构

  3. 安装zabbbix的服务器安装时和php7.1有冲突:若此机器上已经安装php7.1就安装不上zabbix

为什么要使用监控?

1.对系统不间断实时监控

2.实时反馈系统当前状态

3.保证服务可靠性安全性

4.保证业务持续稳定运行

我们去一家新的公司应该如何入手

1.硬件监控–路由器、交换机、防火墙

2.系统监控–cpu、内存、磁盘、网络、进程、tcp

3.服务监控–nginx、php、tomcat、redis、memcache、mysql

4.web监控–响应时间、加载时间、渲染时间

5.日志监控–ELK、(收集、存储、分析、展示)日志

6.安全监控–firewalld、WAF(nginx+lua)、安全宝、牛盾云、安全狗

zabbix宿主机安装

注意:此安装脚本目前只支持Rock8或者更高版本

由于官方文档写的非常详细我这里直接使用centos的一键安装脚本,可以根据需求修改脚本内容

(单机)–> LAMP

(架构)–> LAP + MYSQL

端口介绍

服务端端口:10051

客户端端口:10050

Java-gateway:10052

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/bin/bash
#
#********************************************************************
#Author: Mr.yang
#QQ: 29308620
#Date: 2022-03-05
#FileName: install_zabbix_server6.0.sh
#URL: www.yanghongtao.cn
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************

ZABBIX_VER=6.0
URL="mirror.tuna.tsinghua.edu.cn/zabbix"

MYSQL_HOST=localhost
MYSQL_ZABBIX_USER="zabbix@localhost"

#MYSQL_HOST=10.0.0.100
#MYSQL_ZABBIX_USER="zabbix@'10.0.0.%'"

MYSQL_ZABBIX_PASS='123456'
MYSQL_ROOT_PASS='123456'

FONT=msyhbd.ttc

ZABBIX_IP=`hostname -I|awk '{print $1}'`
GREEN="echo -e \E[32;1m"
END="\E[0m"

. /etc/os-release

color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}

install_mysql () {
[ $MYSQL_HOST != "localhost" ] && return
if [ $ID = "centos" -o $ID = "rocky" ] ;then
VERSION_ID=`echo $VERSION_ID | cut -d . -f1`
if [ ${VERSION_ID} == "8" ];then
yum -y install mysql-server
systemctl enable --now mysqld
elif [ ${VERSION_ID} == "7" ];then
yum -y install mariadb-server
systemctl enable --now mariadb
else
color "不支持的操作系统,退出" 1
fi
else
apt update
apt -y install mysql-server
sed -i "/^bind-address.*/c bind-address = 0.0.0.0" /etc/mysql/mysql.conf.d/mysqld.cnf
systemctl restart mysql
fi
mysqladmin -uroot password $MYSQL_ROOT_PASS
mysql -uroot -p$MYSQL_ROOT_PASS <<EOF
create database zabbix character set utf8 collate utf8_bin;
create user $MYSQL_ZABBIX_USER identified by "$MYSQL_ZABBIX_PASS";
grant all privileges on zabbix.* to $MYSQL_ZABBIX_USER;
quit
EOF
if [ $? -eq 0 ];then
color "MySQL数据库准备完成" 0
else
color "MySQL数据库配置失败,退出" 1
exit
fi
}

install_zabbix () {
if [ $ID = "centos" -o $ID = "rocky" ] ;then
rpm -Uvh https://${URL}/zabbix/${ZABBIX_VER}/rhel/${VERSION_ID}/x86_64/zabbix-release-${ZABBIX_VER}-1.el${VERSION_ID}.noarch.rpm
if [ $? -eq 0 ];then
color "YUM仓库准备完成" 0
else
color "YUM仓库配置失败,退出" 1
exit
fi
sed -i "s#repo.zabbix.com#${URL}#" /etc/yum.repos.d/zabbix.repo
if [[ ${VERSION_ID} == 8 ]];then
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent zabbix-get langpacks-zh_CN
else
yum -y install zabbix-server-mysql zabbix-agent zabbix-get
yum -y install centos-release-scl
rpm -q yum-utils || yum -y install yum-utils
yum-config-manager --enable zabbix-frontend
yum -y install zabbix-web-mysql-scl zabbix-apache-conf-scl
fi
else
wget https://${URL}/zabbix/${ZABBIX_VER}/ubuntu/pool/main/z/zabbix-release/zabbix-release_${ZABBIX_VER}-1+ubuntu${VERSION_ID}_all.deb
if [ $? -eq 0 ];then
color "APT仓库准备完成" 0
else
color "APT仓库配置失败,退出" 1
exit
fi
dpkg -i zabbix-release_${ZABBIX_VER}-1+ubuntu${VERSION_ID}_all.deb
sed -i.bak "s#repo.zabbix.com#${URL}#" /etc/apt/sources.list.d/zabbix.list
apt update
apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent zabbix-get language-pack-zh-hans
fi
}
config_mysql_zabbix () {
if [ -f "$FONT" ] ;then
mv /usr/share/zabbix/assets/fonts/graphfont.ttf{,.bak}
cp "$FONT" /usr/share/zabbix/assets/fonts/graphfont.ttf
else
color "缺少字体文件!" 1
fi
if [ $MYSQL_HOST = "localhost" ];then
zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p$MYSQL_ZABBIX_PASS -h$MYSQL_HOST zabbix
fi
sed -i -e "/.*DBPassword=.*/c DBPassword=$MYSQL_ZABBIX_PASS" -e "/.*DBHost=.*/c DBHost=$MYSQL_HOST" /etc/zabbix/zabbix_server.conf
if [ $ID = "centos" -o $ID = "rocky" ];then
if [[ ${VERSION_ID} == 8 ]];then
sed -i -e "/.*date.timezone.*/c php_value[date.timezone] = Asia/Shanghai" -e "/.*upload_max_filesize.*/c php_value[upload_max_filesize] = 20M" /etc/php-fpm.d/zabbix.conf
systemctl enable --now zabbix-server zabbix-agent httpd php-fpm
else
sed -i "/.*date.timezone.*/c php_value[date.timezone] = Asia/Shanghai" /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
fi
else
sed -i "/date.timezone/c php_value date.timezone Asia/Shanghai" /etc/apache2/conf-available/zabbix.conf
chown -R www-data.www-data /usr/share/zabbix/
systemctl enable zabbix-server zabbix-agent apache2
systemctl restart zabbix-server zabbix-agent apache2
fi
if [ $? -eq 0 ];then
echo
color "ZABBIX-${ZABBIX_VER}安装完成!" 0
echo "-------------------------------------------------------------------"
${GREEN}"请访问: http://$ZABBIX_IP/zabbix"${END}
else
color "ZABBIX-${ZABBIX_VER}安装失败!" 1
exit
fi
}

install_mysql
install_zabbix
config_mysql_zabbix

最新zabbix6.4使用docker-compose一键部署

首先安装docker和docker-compose这里不在叙述,docker-compose可以直接在GitHub下载,这里我的docker-compose版本是
[root@zabbix ~]# docker compose version
Docker Compose version v2.18.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
mkdir /data/zabbix/ -p
[root@zabbix zabbix]# cat docker-compose.yml
version: '3'

services:
zabbix-mysql:
image: mysql:8.0.30
hostname: zabbix-mysql
restart: always
networks:
- zabbix-net
ports:
- "3306:3306"
command: --character-set-server=utf8 --collation-server=utf8_bin
volumes:
- /etc/localtime:/etc/localtime
- ./mysql/conf:/etc/my.cnf.d
- ./mysql:/var/lib/mysql
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: zabbix

zabbix-java-gateway:
hostname: zabbix-java-gateway
image: zabbix/zabbix-java-gateway:latest
restart: always
networks:
- zabbix-net
volumes:
- /etc/localtime:/etc/localtime

zabbix-server:
depends_on:
- zabbix-mysql
hostname: zabbix-server
restart: always
image: zabbix/zabbix-server-mysql:latest
ports:
- "10051:10051"
volumes:
- /etc/localtime:/etc/localtime
- ./zabbix/data:/var/lib/zabbix
- ./zabbix/conf:/etc/zabbix
- ./zabbix/alertscripts:/usr/lib/zabbix/alertscripts
networks:
- zabbix-net
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: zabbix
ZBX_JAVAGATEWAY: zabbix-java-gateway
ZBX_DB_TYPE: mysql

zabbix-nginx:
depends_on:
- zabbix-server
hostname: zabbix-nginx
restart: always
image: zabbix/zabbix-web-nginx-mysql:latest
ports:
- "80:8080"
networks:
- zabbix-net
volumes:
- /etc/localtime:/etc/localtime
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: zabbix
ZBX_SERVER_HOST: 192.168.99.27
# ZBX_SERVER_HOST: zabbix-server-mysql

networks:
zabbix-net:

基础模板制作流程

1.编写脚本或者命令,能够获取指定监控对象的数据 并发连接
2.在zabbix agent配置文件添加自定义监控项
    指定key的名称和脚本路径
    key在同一个zabbix agent不能重名
    重启zabbix agent 
    UserParameter=redis_monitor[*],/bin/bash /etc/zabbix/zabbix_agentd.d/redis_monitor.sh $1 $2 $3
3.在zabbix server使用zabbix_get命令测试监控项能不能获取到数据
    避免出现权限问题
    数据格式问题
    路径问题
    # zabbix_get -s 172.31.0.106 -p 10050 -k "redis_monitor["redis_status","6379","connected_clients"]"    

4.在zabbix web界面创建模板或者创建监控项、如果已经有模板就直接把模板关联到指定主机
5 配置触发器(邮件'微信),用来报警
6 宕机测试

agent的主动模式被动模式

  • 无论是主动模式还是被动模式都是站在zabbix-agent的角度来讲的

  • 主动模式

    主动模式是由zabbix agent主动向zabbix server的10051端口发起tcp连接请求,因此主动模式下必须在zabbix

agent配置文件中指定zabbix server的IP或者主机名(必须可以被解析为IP地址),在连接到zabbix server之前
zabbix agent是不知道自己要采集那些数据以及间隔多久采集一次数据的,然后在连接到zabbix server以后获取到
自己的监控项和数据采集间隔周期时间,然后再根据监控项采集数据并返回给zabbix server,在主动模式下不再需
要zabbix serve向zabbix agent发起连接请求,因此主动模式在一定程度上可减轻zabbix server打开的本地随机端
口和进程数,在一定程度就减轻看zabbix server的压力。

  • 被动模式

    被动模式的特点就是,在默认的被动模式下zabbix-agent什么都不做,zabbix-server什么时候发生什么事情,zabbix-agent就去采集什么数据,优点就是配置简单,安装就是被动模式,缺点就是数百上千台机器会导致zabbix-server轮训想每个zaibbix-agent发送数据采集指令,如果server负载过高可能导致不能及时获取到最新数据

优点是配置简单
公司规模非常小的时候 ,几十个服务器 在被动模式下的模板直接使用就可以
公司规模比较大的时候几百个服务器,这个时候决定使用主动还是被动,结合zabbix-proxy

zabbix-proxy 介绍

zabbix 作为一个分布式监控系统(分布式监控解决方案),支持通过代理(proxy)收集zabbix agent的监控数据然后由 zabbix proxy再把数据发送给zabbix server,也就是zabbix proxy 可以代替 zabbix server 收集监控数据,然后把数据汇报给 zabbix server,所以zabbix proxy可以在一定程度上分担了zabbix server 的数据收集压力,从而降低了数据的采集时间、也相应的增加了zabbix server的监控能力。

zabbix 作为一个分布式监控系统(分布式监控解决方案),支持通过代理(proxy)收集zabbix agent的监控数据然后由 zabbix proxy再把数据发送给zabbix server,也就是zabbix proxy 可以代替 zabbix server 收集监控数据,然后把数据汇报给 zabbix server,所以zabbix proxy可以在一定程度上分担了zabbix server 的数据收集压力,从而降低了数据的采集时间、也相应的增加了zabbix server的监控能力。

proxy主动模式和被动模式的区别

另外zabbix proxy也区分主动模式和被动模式,通信方式与zabbix server主动模式和被动模式一样,区别是zabbixproxy由于没有zabbix agent的配置,所以zabbix proxy在主动模式下要向zabbix server周期性的向zabbix server申请获取zabbix agent的监控项信息,但是zabbix proxy在被动模式下也是等待zabbix server的连接并接受zabbixserver发送的监控项指令,然后再有zabbix proxy向zabbix agent发起请求获取数据。- 另外zabbix proxy也区分主动模式和被动模式,通信方式与zabbix server主动模式和被动模式一样,区别是zabbixproxy由于没有zabbix agent的配置,所以zabbix proxy在主动模式下要向zabbix server周期性的向zabbix server申请获取zabbix agent的监控项信息,但是zabbix proxy在被动模式下也是等待zabbix server的连接并接受zabbixserver发送的监控项指令,然后再有zabbix proxy向zabbix agent发起请求获取数据。

被动模式的proxy

server并不主动连接agent而是由proxy去替代server去连接,这样proxy相当于代理,每个proxy都有数据库,把agent返回的数据存在自己的数据库里。因为如果和server连接错误,数据会暂时放在proyx的数据里面,防止数据丢失。 等可以连接server之后就会主动放在server的数据库里面 这个是被动模式

主动模式的proxy

主动模式下 agent的配置文件 ServerActice= 指向我的代理(proxy) ,而且还要告诉proxy我的server是哪个 ,proxy才会把agent的数据传给server ,相互转发,好处是缓解我们server的负载压力

zabbix接入LDAP

由于目前公司运维人员过多每次都需要手动创建账号,而且服务太多导致账号不好维护,所以使用Windows-server2016部署了AD服务,并且接入了password 用户可以随时自己修改密码

这里只说zabbix如何接入LDAP,参考博客

  • 说明:LDAP接入成功以后需要先在认证里面修改成LDAP登录认证
  • 每次都需要手动先创建好LDAP用户名(一般都是英文,密码可以不创建,然后对用户授权角色用户即可登录)

1、首先创建一个账号作为LDAP登录认证的账号(用于统一认证)

2、点击管理->认证(不通版本位置可能不同)

3、输入LDAP的认证信息(可以添加多个LDAP默认从上往下匹配,一般公司只有一个LDAP足够了)

cn输入创建好的账号,然后输入密码,先更新,更新好以后在点击进入选择测试,这个时候输入任何一个LDAP用户名提示测试成功即可

4、这个时候我们在点击认证,把默认认证设置更改成LDAP即可使用

5、创建LDAP相同的一个账号,并授权,密码可以不设置,创建成功以后LDAP用户即可使用域密码进行登录

实战监控案例

监控 vmvare vsphere

说明: 由于监控单台Esxi的话比较浪费时间,所以可以直接监控vcenter集群的状态,zabbix自带了Template VM VMware模板会自动关联其他的两个模板,实现自动发现集群的Esxi主机。本zabbix监控版本是5.0 LTS

zabbix_server.conf配置文件参数可用于调整虚拟机监控,修改好以后重启服务

1、修改zabbix-server配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
StartVMwareCollectors=5      // vmware 收集器实例的数量。
此值取决于要监控的 VMware 服务的数量。在大多数情况下,这应该是:
servicenum < < (servicenum * 2)
其中 servicenum 是 VMware 服务的数量。例如:如果您有 1 个 VMware 服务要将 StartVMwareCollectors 设置为 2,那么如果您有 3 个 VMware 服务,请将其设置为 5。请注意,在大多数情况下,此值不应小于 2,不应大于 VMware 数量的 2 倍服务。还要记住,此值还取决于 VMware 环境大小和 VMwareFrequency 和

VMwarePerfFrequency // 配置参数
VMwareFrequency: //从单个Vmware服务收集数据之间的延迟
VMwarePerfFrequency: //从单个VMware服务检索性能计数器统计信息之间的延迟
VMwareCacheSize: //VMware缓存的大小
VmwareTimeout:20 // 相应超时时间

// 以下是线上服务器配置,8C 16G
[root@cnhz-ops-monitor-c-0-253 ~]# egrep -v "^$|#" /etc/zabbix/zabbix_server.conf
ListenPort=10051
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBName=zabbix
DBUser=zabbix
DBPassword=woxihuan123.
StartPollers=10
StartTrappers=100
StartPingers=15
StartDiscoverers=20
StartHTTPPollers=6
StartVMwareCollectors=5
VMwareFrequency=60
VMwarePerfFrequency=60
VMwareCacheSize=160M
VMwareTimeout=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
CacheSize=512M
HistoryCacheSize=2G
ValueCacheSize=512M
Timeout=10
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1

查看zabbix日志查看VMware monitoring 是否为YES正常

2、进入esxi全部开启 Config.HostAgent.plugins.solo.enableMob

鼠标右键每一台Esxi –> 高级系统设置 –> 右上角点击(编辑) 找到筛选器搜索

3、vsphere 创建只读用户

  1. 主页菜单中选择系统管理 ,选择用户和组-域-添加用户

  1. 输入用户名和密码

  2. 设置只读权限-(全局权限-添加) 添加好以后测试是否可以登录

4、在zabbix中添加esxi主机

主机名称:根据事情情况自定义填写,建议用主机ip

可见名称:用于主机列表内显示用,建议填写一个能够一看看清用途的名称

群组:创建一个新的群组

客户端:主义此处一定要填写的是127.0.0.1,并且确保部署zabbix的主机10050端口是防火墙放行的

然后在【宏】标签下,配置身份验证键值对

添加好地址可能需要等三分钟到五分钟左右,点击最新数据看到数据传输即可

5、修改模板组 不然会自动在主机群组创建

点击Template VM VMware主机模板 – 群组都改成我们自己创建的群组即可

6、 确认监控

对应条目选择并点击启用,等待添加完成即可(10分钟左右),也可以点击进入主机,选择自动发现规则,勾选所有条目(可以去掉不需要勾选的项目,点击现在检查,快速获取被监控主机信息)另外不需要监控的虚拟机可以手动删除

自带模板只支持心跳线检测以及虚拟机重启告警,如需其他可以自己手动添加监控项

监控 redis

zabbix最主要的就是自定义监控项获取数据,以及做模板等等

正常redis的连接数1500 左右应该就没问题,如果在多可能就会造成服务器宕机的情况
学习一个模板中创建多个监控项、多个触发器和多个图形,在模板中创建监控项,创建图形
我们希望我们的redis内存,状态,连接数等等,一般都是通过命令行连接过去,然后输入info 查看我们的监控项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#在zabbix-agent安装redis让我们的server去监控
apt install redis
grep "^bind" /etc/redis/redis.conf
sed -ri 's/bind 127.0.0.1/\bind 0.0.0.0/' /etc/redis/redis.conf
systemctl restart redis && systemctl enable redis
# 编辑监控redis的脚本,创建存放脚本的路径
vim /etc/zabbix/zabbbix_agent.d/redis_monitor.sh
#!/bin/bash
#Author:Mr.yang
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
本机测试是否可以取到监控项
cd /etc/zabbix/zabbix_agent.d/
bash redis_monitor.sh redis_status 6379 used_memory
#测试成功我们添加可执行权限
chomod a+x redis_mointor.sh
在配置文件添加脚本路径让我们的server可以执行远程命令
vim /etc/zabbix/zabbix_agentd.conf
UserParameter=redis_monitor[*],/bin/bash /etc/zabbix/zabbix_agentd.d/redis_monitor.sh $1 $2 $3
#在zabbix-server测试
zabbix_get -s 10.0.0.12 -p 10050 -k "redis_monitor["redis_status","6379","used_memory"]"
然后我们就可以在web界面创建模板--创建应用集--创建监控项(key的值就是我们测试的key)--然后在创建图形查看监控项的值,后续如果还有redis的监控,我们就直接添加redis的模板就可以了

监控 redis_cluster

  • 编写监控脚本,由于公司redis是没有账密的所以可以直接监控,而且公司的cluster是开启了多实例,一共三台主机每台主机8个节点一共是24个节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    [root@redis1-143 scripts]# cat /etc/zabbix/scripts/redis_cluser.sh
    #!/bin/bash
    cluster_state () {
    for(( i=1; i<9; i++ ));do redis-cli -h 172.16.0.$1 -p 700$i cluster info;done|grep cluster_state|wc -l
    }

    cluster_slots () {
    for(( i=1; i<9; i++ ));do redis-cli -h 172.16.0.$1 -p 700$i cluster info;done|grep "cluster_slots_assigned:"|grep "16384"|wc -l
    }

    cluster_disconnected () {
    for(( i=1; i<9; i++ ));do redis-cli -h 172.16.0.$1 -p 700$i cluster nodes;done|grep "disconnected" |wc -l
    }

    $1 $2

    # 测试返回值,8代表我的八个槽位都是正常的
    [root@redis1-143 scripts]# bash redis_cluser.sh cluster_slots 143
    8

    // 添加监控脚本
    # tail /etc/zabbix/zabbix_agentd.conf
    UserParameter=redis_cluster[*],/bin/bash /etc/zabbix/scripts/redis_cluser.sh $1 $2


最后web界面创建应用集 ,创建监控项,创建触发器,然后全部监控在一台主机上面即可

监控memcached

根据上面的案例我直接写了memcached的脚本,和监控redis一样的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@ubuntu1804:/etc/zabbix/zabbix_agentd.d# vim /etc/zabbix/zabbix_agentd.d/memcached_monitor.sh 
#!/bin/bash
#Author:Mr.yang
memcached_status(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\nquit" ' ncat 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND" |awk '{print $3}' #ubuntu使用ncat, 安装nmap
}
main(){
case $1 in
memcached_status)
memcached_status $2 $3
;;
esac
}
main $1 $2 $3

自动发现Redis端口监控

由于一台服务器开启许多Redis实例,如果一台一台的监控太耗费时间,也非常容器出错。这种费力不讨好的事情我们是坚决杜绝的,幸好ZABBIX有自动发现功能,今天我们就来用该功能来监控我们的Redis实例。

原文连接: 连接1 连接2

监控项

Redis的监控信息主要通过info命令来获取.

1
2
3
4
5
6
7
8
9
10
11
uptime_in_days              ##redis启动的天数
connected_clients ##redis连接的客户端数
blocked_clients: ##正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
used_memory_peak_human: ##reids所用内存的高峰期
used_memory: ##redis运行起来使用的内存数
expired_keys: ##过期的key数量
evicted_keys: ##删除过期的key数量
keyspace_misses: ##没命中的key数量
keyspace_hits: ##命中的key数量
connected_slaves: ##已连接的从服务器数
rejected_connections: ##因为超过最大连接数被拒接的请求数量

Shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# 自动发现Redis端口脚本
port=(`sudo netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'`)
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'

Python脚本

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
import os
import json
t=os.popen("""sudo netstat -tlpn |grep redis-server|grep 0.0.0.0|awk '{print $4}'|awk -F: '{print $2}' """)
ports = []
for port in t.readlines():
r = os.path.basename(port.strip())
ports += [{'{#REDISPORT}':r}]
print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))

注:我这里直接监控的是Redis,所以上方两个脚本获取的直接是Redis的端口,你也可以将脚本内容改一下,比如服务名通过参数形式传递,那么该脚本就可以发现你想发现的服务端口了。

(1)、将上方的脚本其一拷贝到被监控主机上,比如我这里的10.2.42.16主机,主要命令如下

1
2
3
4
5
# 创建脚本存放路径
mkdir /etc/zabbix/scripts
# 在脚本存放路径下存放我们上面开发的脚本任一,我这里取名为discovery_redis.py
# 给脚本加执行权限
chmod +x discovery_redis.py

(2)、创建zabbix的key。在/etc/zabbix/zabbix_agentd.d/目录下创建配置文件,如下:

1
2
3
4
vim userparameter_disvocery_redis.conf
UserParameter=redis.discovery,python /etc/zabbix/scripts/redis_discovery1.py
UserParameter=redis.stats[*],redis-cli -h 127.0.0.1 -p $1 info | grep -w $2 | cut -d : -f2
UserParameter=redis.health[*], redis-cli -h 127.0.0.1 -p $1 ping 2> /dev/null | grep PONG | wc -l

(3)、修改zabbix_agentd.conf配置文件

1
2
3
4
# 添加配置目录
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
# 允许自定义脚本
UnsafeUserParameters=1

(4)、增加sudo权限

之所以要增加sudo权限,是因为zabbix_agentd是zabbix用户启动的,默认不能执行netstat -p等命令,因此可以配置sudo解决,也可以使用chmod +s /bin/netstat进行解决。

1
2
3
4
5
# visudo
#Defaults requiretty # 注释掉
Defaults:zabbix !requiretty
zabbix ALL=(root) NOPASSWD:/bin/netstat

(5)、重启zabbix-agent,并在server端用zabbix_get测试

1
2
3
4
5
# 重启zabbix-agent
service zabbix-agent restart
# 在服务端用zabbix_get测试
zabbix_get -s 10.2.42.16 -p 10050 -k redis.discovery
zabbix_get -s 10.2.42.16 -p 10050 -k redis.stats[6383,expired_keys]

服务器端直接在WEB界面操作

创建模板 –> 创建应用集 –> 创建正则表达式

创建监控项 –> 配置过滤器(可选选择管理,一般,正则表达式),我这里配置的主要原因是还有其他我不需要监控的集群

最后关联模板,等待一段儿时间就会发现端口全部生成,或者选择自动发现规则 点击 (Excute now)就会优先执行这个监控项

视频教程

监控Zabbix-Proxy

背景:

项目需要通过zabbix-proxy 来获取监控数据【网络是单向的,zabbix-proxy 通过公网主动连接 zabbix-server ,上报监控数据,已达到监控的目的】

需求:

因为是单向网络,proxy 挂了后,zabbix master 都无法获取到 zabbix-proxy 和 下面的agent 机器的离线的状态,更不会触发告警;现需要对 zabbix-proxy 的状态实行监控,利用 zabbix-proxy 主动上传到 zabbix 页面上的 agent 代理程序的 状态 来判断 zabbix-proxy 的存活

官方文档

思路

通过获取 zabbix api 中 Proxy 代理 的 信息 来实现 监控

官方api说明:

版本:zabbix5.0

1
2
获取token:https://www.zabbix.com/documentation/5.0/zh/manual/api/reference/user/login
获取proxy 代理信息: https://www.zabbix.com/documentation/5.0/zh/manual/api/reference/proxy/get
  • #获取token: 使用登录的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#入参:
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "A123!@#b200"
},
"id": 1
}' http://61.174.50.116:9222/api_jsonrpc.php;


#回参:
{"jsonrpc":"2.0","result":"4975bb96c344446c4b2014e3808f0c08","id":1}

#得到token 为40c7d25ebe8c4439a5c99067bc9bd2ec


1
2
3
4
5
6
7
8
9
# 登出方式
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.logout",
"params": [],
"id": 1,
"auth": "29383eeba1c8262bef789180142608f7"
}' http://61.174.50.116:9222/api_jsonrpc.php;

#获取proxy 代理信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#利用上面获取的token,来获取api 中proxy 的代理信息

#入参:
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "proxy.get",
"params": {
"output": "extend",
"selectInterface": "extend"
},
"auth": "40c7d25ebe8c4439a5c99067bc9bd2ec",
"id": 1
}' http://61.174.50.116:9222/api_jsonrpc.php |jq


#回参
{
"jsonrpc": "2.0",
"result": [
{
"proxy_hostid": "0",
"host": "usln-prd-zbxproxy-c-0-253",
"status": "5",
"disable_until": "0",
"error": "",
"available": "0",
"errors_from": "0",
"lastaccess": "1666597879",
"ipmi_authtype": "-1",
"ipmi_privilege": "2",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_disable_until": "0",
"ipmi_available": "0",
"snmp_disable_until": "0",
"snmp_available": "0",
"maintenanceid": "0",
"maintenance_status": "0",
"maintenance_type": "0",
"maintenance_from": "0",
"ipmi_errors_from": "0",
"snmp_errors_from": "0",
"ipmi_error": "",
"snmp_error": "",
"jmx_disable_until": "0",
"jmx_available": "0",
"jmx_errors_from": "0",
"jmx_error": "",
"name": "",
"flags": "0",
"templateid": "0",
"description": "",
"tls_connect": "1",
"tls_accept": "1",
"tls_issuer": "",
"tls_subject": "",
"tls_psk_identity": "",
"tls_psk": "",
"proxy_address": "",
"auto_compress": "1",
"discover": "0",
"proxyid": "10537",
"interface": []
}
],
"id": 1
}

再次过滤,找到lastaccess字段,该字段的值表示 proxy 当前的 时间戳,每5秒 内会发生变化;通过对比该字段的值 和 zabbix-server 当前时间戳的 时间差,来判断 proxy 的状态是否正常

添加监控项:

获取 lastaccess字段 的值

创建监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
# vim /etc/zabbix/scripts/zabbix_proxy_check.sh
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "proxy.get",
"params": {
"output": "extend",
"selectInterface": "extend"
},
"auth": "40c7d25ebe8c4439a5c99067bc9bd2ec",
"id": 1
}' http://61.174.50.116:9222/api_jsonrpc.php|awk -F '{"' '{print $3}' | awk -F ',' '{print $8}' | awk -F '"' '{print $4}'

编辑配置文件添加监控项

1
2
3
$ chmod 777 /etc/zabbix/scripts/zabbix_proxy_check.sh
$ echo "UserParameter=a_proxy_status,/bin/bash /etc/zabbix/scripts/zabbix_proxy_check.sh" >> /etc/zabbix/zabbix_agentd.conf
$ systemctl restart zabbix-agent

登录到zabbix web 控制台,

#添加监控项,触发器表达式表示: 当a-proxy 时间戳的 值 和 zabbix 当前时间戳的值 ,相差60 秒 ,触发告警

最后可以修改触发器值,模拟触发告警

监控zabbix主机数量

通过以上监控我们还可以实现,如果有人删除zabbix主机就触发告警等等,我这里对主机做了筛选,过滤出实际主机数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cat alarm_zabbix_hosts.sh
#!/bin/bash
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["host"]
},
"auth": "40c7d25ebe8c4439a5c99067bc9bd2ec",
"id": 1
}' http://61.174.50.116:9222/api_jsonrpc.php| python -m json.tool|grep "host\":"|sort |uniq -u|wc -l


// 我这里有327台主机,最终结果和我这里一致
[root@cnsh-env-center-c-0-253 scripts]# bash alarm_zabbix_hosts.sh
327


// agent创建脚本,重启agent
echo "UserParameter=zabbix_hosts,/bin/bash /etc/zabbix/scripts/alarm_zabbix_hosts.sh" >>/etc/zabbix/zabbix_agentd.conf
systemctl restart zabbix-agent

// web创建监控项
名称:zabbix 主机数状态检测
类型:客户端主动式
键值:zabbix_hosts

// 配置触发器,可以增加数量测试是否会告警
名称:zabbix-server 253 主机数量减少,请检查是否有人删除
表达式:{cnsh-env-center-c-0-253:zabbix_hosts.last()}<327

监控物理机Raid磁盘状态

环境介绍: 物理机:dell R640 操作系统:centos7

安装MegaCli

监控主要是通过MegaCli 软件获取到物理主机的read及硬盘相关状态信息。然后通过zabbix的自定义报警进行监控。

MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等。通常,我们对硬盘当前的状态不太好确定,一般通过机房人员巡检来完成,有没有通过软件的方式来检查确定这个问题呢。MegaCli就可以做到,一般通过 MegaCli 的Media Error Count: 0 Other Error Count: 0 这两个数值来确定阵列中磁盘是否有问题;Medai Error Count 表示磁盘可能错误,可能是磁盘有坏道,这个值不为0值得注意,数值越大,危险系数越高,Other Error Count 表示磁盘可能存在松动,可能需要重新再插入。MegaCli 可以对阵列中所有的磁盘进行检测,我们可以通过脚本的方式来检测相关参数,从而通知管理人员。

下载安装:Megacli

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
cat > install_megacli.sh << EOF
#!/bin/bash
[ -d /usr/local/src/megacli ] || mkdir /usr/local/src/megacli -p
wget https://download.lenovo.com/ibmdl/pub/pc/pccbbs/thinkservers/te8msm01sr17.tgz -O /usr/local/src/megacli/te8msm01sr17.tgz

[ $? -eq 0 ] || echo -e "无法安装unzip命令,请检测yum源"
cd /usr/local/src/megacli/
tar -zxvf te8msm01sr17.tgz && cd linux && unzip MegaCliLin.zip
rpm -ivh *.rpm
ln -s /opt/MegaRAID/MegaCli/MegaCli64 /bin/MegaCli64
ln -s /opt/MegaRAID/MegaCli/MegaCli64 /sbin/MegaCli64
MegaCli64 -pdlist -aALL
EOF


# MegaCli64命令使用:
MegaCli64 -LDInfo -Lall -aALL 查raid级别
MegaCli64 -AdpAllInfo -aALL 查raid卡信息
MegaCli64 -PDList -aALL '查看硬盘信息,主要用到这个'
MegaCli64 -AdpBbuCmd -aAll 查看电池信息
MegaCli64 -FwTermLog -Dsply -aALL 查看raid卡日志
MegaCli64 -adpCount 【显示适配器个数】
MegaCli64 -AdpGetTime –aALL 【显示适配器时间】
MegaCli64 -AdpAllInfo -aAll 【显示所有适配器信息】
MegaCli64 -LDInfo -LALL -aAll 【显示所有逻辑磁盘组信息】
MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL |grep ‘Charger Status’ 【查看充电状态】
MegaCli64 -AdpBbuCmd -GetBbuStatus -aALL 【显示BBU状态信息】
MegaCli64 -AdpBbuCmd -GetBbuCapacityInfo -aALL【显示BBU容量信息】
MegaCli64 -AdpBbuCmd -GetBbuDesignInfo -aALL 【显示BBU设计参数】
MegaCli64 -AdpBbuCmd -GetBbuProperties -aALL 【显示当前BBU属性】
MegaCli64 -cfgdsply -aALL 【显示Raid卡型号,Raid设置,Disk相关信息】
MegaCli64 -PdLocate -start -physdrv [32:2] -aALL # 硬盘灯闪烁(32是Enclosure Device ID,2是Slot Number)
// 以下是华为官网说明 https://support.huawei.com/enterprise/zh/doc/EDOC1000004345/b910b7ac#ZH-CN_TOPIC_0125804407
# 点亮slot 0硬盘的定位指示灯。
MegaCli64 -PDLocate -Start -PhysDrv[:0] -a1
# 关闭slot 0硬盘的定位指示灯。
MegaCli64 -PDLocate -Stop -PhysDrv[:0] -a1

# 名词解释
- DSA :IBM日志收集工具
- DSET :DELL日志收集工具
- TTY :硬盘日志收集工具
- Slot Number :服务器硬盘槽位号,dell/IBM服务器槽位号从O开始
- Media Error Count:硬盘物理错误数
- Other Error Count:硬盘逻辑错误数
- Predictive Failure Count:预告警数
- Raw Size:磁盘容量
- PD Type: 磁盘类型(SAS,STAT)
- Firmware state:硬盘状态
- RAID Level :阵列等级
- State :阵列状态
-----------------------------------
主要用到这一条命令检测磁盘状态
$ MegaCli64 -Pdlist -a0
Firmware state: Failed #就是这,固件状态提示硬盘Failed,就是说硬盘挂啦

物理磁盘故障分析
# Media Error Count>10
因为IBM的机器中,Media Error Count>10就当做是硬盘故障啦,可以直接收集DSA日志,找IBM售后处理了
# Firmware state 
这个预告警就要重点关注了,因为不论是DELL还是IBM,只要出现这个告警,肯定是硬盘已经出现故障了,这个时候各自收集日志保修吧
Failed #硬盘故障了
Unconfigured(bad), Spun Up #硬盘还未配置,但是故障了
Unconfigured(good), Spun Up #硬盘还未配置,可以使用
JBOD, Spun Up #硬盘使用non-Raid模式
Hotspare , Spun Up #硬盘做热备使用
CopyBack #硬盘回写状态,这个在有热备盘的情况下才会出现,当有热备盘的阵列中,出现有一块硬盘出现故障,则热备盘会直接进入rebuiled状态,重建完成后,阵列状态就会恢复正常,这个时候,我们如果把故障硬盘替换掉,在有开启copyback模式的服务器上,这块刚刚替换上的新盘就会被标记为copyback状态,会将原来的热备盘的数据,全部回写到新盘上,而原来的热备盘,会重新变为热备

编写zabbix磁盘检测脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cd /etc/zabbix/scripts/
cat > check_disk.sh <<EOF
#!/bin/bash
check_raid_disk () {
Media_Error_count=`MegaCli64 -pdlist -aALL | grep "Media Error" |awk -F ':' '{print $2}'|sort -nr|uniq|head -n1`
Firmware_state=`MegaCli64 -pdlist -aALL | grep "Firmware state"| awk -F : '{print $2}'| awk -F , '{print $1}'|egrep -i "(Failed|Unconfigured|CopyBack)" | wc -l`
#if [ ${Media_Error_count} -gt 10 -o ${Firmware_state} -gt 0 ];then
#if [[ ${Media_Error_count} -gt 10 ]] || [[ ${Firmware_state} -gt 0 ]];then
if [[ ${Media_Error_count} -gt 10 || ${Firmware_state} -gt 0 ]];then
echo "1"
else
echo "0"
fi
# 如果返回0代表磁盘正常,如果返回1代表磁盘故障
}
check_raid_disk
EOF

# 添加至zabbix-agent
echo "UserParameter=check.disk,/bin/bash /etc/zabbix/script/check_disk.sh" >> /etc/zabbix/zabbix_agentd.conf
systemctl restart zabbix-agent
# zabbix-server检测是否生成数据
[root@cnhz-ops-monitor-c-0-253 alertscripts]# zabbix_get -s 10.10.10.61 -p 10050 -k "check.disk"
0

# 添加至zabbix-web
创建应用集-->创建监控项-->创建触发器--测试是否告警
应用集: 名称 check_disk
创建监控项: 名称 check_disk 键值 check.disk
触发器: {HOST.NAME} 物理磁盘故障
表达式: {HZSQL4-CENTOS:check.disk.last()}<>0

监控windows超过30天

公司要求windows服务器超过30天以上的服务器可能要重启,但是我也不可能一台一台上去看,所以发现zabbix自动可以获取到服务器时间,以下是配置内容,可以使用zabbix_get获取查询,然后创建监控项和触发器

1
2
3
名称: 主机{HOST.NAME}需要重启,  运行 {ITEM.VALUE}
严重性: 信息 (因为告警内容太多所以我就放入信息里面,需要的时候进行观看)
键值(具体根据自己主机填写):{HZSTORE4-WIN16:system.uptime.last(,180)}>30d

最终实现效果如下图

监控网卡流量

主要监控zabbix监控网卡进出流量,使用默认模板 [Template OS Linux by Zabbix agent]即可监控

监控方式:自动发现,由于一台主机可能会有多个网卡,手动添加太费劲所以可以直接修改模板更改

也可以用 zabbix_get -s hostname -p 10050 -k net.if.discovery 去获取目标设备的所有信息。

另外zabbix监控默认监控项为字节,下面是字节的计算方式,可以根据自定义去修改

1
2
3
4
5
6
7
8
1K=1024B
1M=1024K
50M=50*1024*1024(B)
这里的B就是代表字节。所以50M=52428800字节
# 监控项原型zabbix模板里面就自带有(net.if.in代表入口流量) (net.if.out代表出口流量)
# 触发器内容
{cnhz-prd-nginx-c-114-45:net.if.out["{#IFNAME}"].last()}>52428800
当前发送流量超过50M on {#IFNAME}

我这里点击的是某一台的主机,只对单台主机网卡进行监控,可以根据自己需求定义,点击 自动发现--> Network interface discovery -->再点击触发器类型,创建触发器 最后创建好触发器以后可以在创建图表,分析流量。

监控 SSH暴力破解

一、背景需求

很多服务器设置安全组(防火墙),所以黑客一般是通过穷举法来进行暴力破解SSH登陆,为了阻止黑客们这一行为,所以想到监控暴力破解ssh

首先编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat alarm_ssh.sh
#!/bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2":"$1;}' >/etc/zabbix/scripts/ssh_failed.txt
chown -R zabbix:zabbix /etc/zabbix/scripts/ssh_failed.txt
ssharray=(`cat /etc/zabbix/scripts/ssh_failed.txt|awk -F[:] '{print $1}' 2>/dev/null`)
length2=${#ssharray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length2;i++))
do
printf '\n\t\t{'
printf "\"{#SSHIP}\":\"${ssharray[$i]}\"}"
if [ $i -lt $[$length2-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"

二、测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat添加可执行权限,否则zabbix_get 报错cat: /var/log/secure: Permission denied
chmod +s /usr/bin/cat

添加到agent.conf文件
#auto discovery ssh Failed
UserParameter=custom.ssh.failed.discovery, /bin/sh /etc/zabbix/scripts/alarm_ssh.sh
UserParameter=custom.ssh.failed.num[*], cat /etc/zabbix/scripts/ssh_failed.txt | egrep $1 | head -1 | awk -F[:] '{print $$2}'



# 最终实现结果,可以找台服务器先测试模拟暴力破解
[root@cnhz-ops-monitor-c-0-253 ~]# zabbix_get -s 10.10.10.171 -p10050 -k 'custom.ssh.failed.num[10.10.10.253]'
3

[root@cnhz-ops-monitor-c-0-253 ~]# zabbix_get -s 10.10.10.171 -p10050 -k 'custom.ssh.failed.discovery'
{
"data":[
{"{#SSHIP}":"10.10.10.253"}
]
}

三、制作模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
模板名称:Template APP For Linux SSH Login

1、创建自动发现规则
- 名称:Discovery of Brute Force SSH Hacking on Linux
- 键值:custom.ssh.failed.num[{#SSHIP}]
2、创建监控项原型
名称:Discovery of Brute Force SSH Hacking on Linux
监控项原型
- 名称: 监控linux暴力破解的IP地址
- 键值:custom.ssh.failed.num[{#SSHIP}]
3、创建触发器类型:
- 名称: 服务器{HOST.NAME}正遭受{#SSHIP}暴力破解,请运维人员注意服务器安全!
- 表达式:{CNSH-OPS-LOGCENTER-C-0-171:custom.ssh.failed.num[{#SSHIP}].last()}>1

# 另外如果需要关闭的时候可以手动关闭,或者对脚本优化,可以在添加上图标,方便分析
下面这个可以当做SSH暴力破解的图表,有数据就会进入,主要是看服务器是几点入侵的
{#SSHIP}_SSH_Login_Failed_Times

监控cpu,gpu温度和显存使用率

注意:以下模板只适合在Linux环境使用:如果是windows需要添加专门的监控模板

一、背景需求

监控CPU、GPU以及显存使用率是其中很重要的一个功能,主要目的是帮助用户实时了解服务器或计算机的性能状况。

zabbix自身并没有相关的模板所以需要自行编写脚本:如下

1、在需要监控的机器上编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@demo-gpu-01 scripts]# cat temperature_monitoring.sh
#!/bin/bash
# yum install lm_sensors.x86_64
get_temp_cpu () {
sensors|grep "Package id $1"|cut -c 17-18
}
get_temp_gpu () {
nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader
}
# Gpu显存使用率监控
get_gpu_memory () {
result=$(nvidia-smi -q | grep -A 3 "FB Memory Usage" | grep Used | awk '{ print $3 }' | tr -d 'MiB')
total_memory=$(nvidia-smi -q | grep -A 3 "FB Memory Usage" | grep Total | awk '{ print $3 }' | tr -d 'MiB')
usage_percent=$(bc <<< "scale = 2; $result/$total_memory*100")
echo ${usage_percent}|awk -F '[.]' '{print $1}'
}
$@

2、使用zabbix-server测试是否可以获取到值

1
2
3
4
5
6
[root@zabbix ~]# zabbix_get -s 172.16.0.103 -p10050 -k 'gpu_memory_use[get_gpu_memory]'
66
[root@zabbix ~]# zabbix_get -s 172.16.0.103 -p10050 -k 'cpu_tmp[get_temp_cpu,0]'
36
[root@zabbix ~]# zabbix_get -s 172.16.0.103 -p10050 -k 'gpu_tmp[get_temp_gpu]'
31

3、增加到配置文件让zabbix-server调用脚本(加入最后一行即可)

1
2
3
4
5
6
7
$ vim /etc/zabbix/zabbix_agent2.conf
#cpu温度监控(因为CPU可能存在多个,所以这里使用$2让zabbix-server定义的时候可以定义多个,默认CPU是从0开始计数)
UserParameter=cpu_tmp[*],/etc/zabbix/scripts/temperature_monitoring.sh $1 $2
#Gpu温度监控
UserParameter=gpu_tmp[*],/etc/zabbix/scripts/temperature_monitoring.sh $1
#Gpu显存使用监控
UserParameter=gpu_memory_use[*],/etc/zabbix/scripts/temperature_monitoring.sh $1

4、zabbix-web 创建模板,创建触发器和图形

5、查看是否有数据,监控项是否生效,触发器是否正常,图形是否显示

​ 这里不在介绍可以自己去主机里面查看最新数据即可

  • 监控windowscpu,gpu温度
1