zabbix简介安装 zabbix简介 zabbix官方的一句话描述zabbix:
监视任何事情适用于任何IT基础架构,服务,应用程序和资源的解决方案
Monitor anythingSolutions for any kind of IT infrastructure, services, applications, resources
监控基础概论
zabbix并非监控,而是实现监控的工具
Zabbix-server是一个c/s和b/s结构
安装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 ZABBIX_VER=6.0 URL="mirror.tuna.tsinghua.edu.cn/zabbix" MYSQL_HOST=localhost MYSQL_ZABBIX_USER="zabbix@localhost" 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] 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 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的主动模式被动模式
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 ~] 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 创建只读用户
主页菜单中选择系统管理 ,选择用户和组-域-添加用户
输入用户名和密码
设置只读权限-(全局权限-添加) 添加好以后测试是否可以登录
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 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 vim /etc/zabbix/zabbbix_agent.d/redis_monitor.sh 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_get -s 10.0.0.12 -p 10050 -k "redis_monitor[" redis_status"," 6379"," used_memory"]" 然后我们就可以在web界面创建模板--创建应用集--创建监控项(key的值就是我们测试的key)--然后在创建图形查看监控项的值,后续如果还有redis的监控,我们就直接添加redis的模板就可以了
监控 redis_cluster
最后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 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 import osimport jsont=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/scriptschmod +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 Defaults:zabbix !requiretty zabbix ALL=(root) NOPASSWD:/bin/netstat
(5)、重启zabbix-agent,并在server端用zabbix_get测试
1 2 3 4 5 service zabbix-agent restart 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
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}
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 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 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.shcurl -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] 327 // agent创建脚本,重启agent echo "UserParameter=zabbix_hosts,/bin/bash /etc/zabbix/scripts/alarm_zabbix_hosts.sh" >>/etc/zabbix/zabbix_agentd.confsystemctl 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 -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 // 以下是华为官网说明 https://support.huawei.com/enterprise/zh/doc/EDOC1000004345/b910b7ac MegaCli64 -PDLocate -Start -PhysDrv[:0] -a1 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 物理磁盘故障分析 因为IBM的机器中,Media Error Count>10就当做是硬盘故障啦,可以直接收集DSA日志,找IBM售后处理了 这个预告警就要重点关注了,因为不论是DELL还是IBM,只要出现这个告警,肯定是硬盘已经出现故障了,这个时候各自收集日志保修吧 Failed Unconfigured(bad), Spun Up Unconfigured(good), Spun Up JBOD, Spun Up Hotspare , Spun Up 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 echo "UserParameter=check.disk,/bin/bash /etc/zabbix/script/check_disk.sh" >> /etc/zabbix/zabbix_agentd.confsystemctl restart zabbix-agent [root@cnhz-ops-monitor-c-0-253 alertscripts] 0 创建应用集-->创建监控项-->创建触发器--测试是否告警 应用集: 名称 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字节 {cnhz-prd-nginx-c-114-45:net.if.out["{#IFNAME}" ].last()}>52428800 当前发送流量超过50M on {
我这里点击的是某一台的主机,只对单台主机网卡进行监控,可以根据自己需求定义,点击 自动发现--> 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.shcat /var/log/secure|awk '/Failed/{print $(NF-3)}' |sort |uniq -c|awk '{print $2":"$1;}' >/etc/zabbix/scripts/ssh_failed.txtchown -R zabbix:zabbix /etc/zabbix/scripts/ssh_failed.txtssharray=(`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文件 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 ~] 3 [root@cnhz-ops-monitor-c-0-253 ~] { "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[{ 2、创建监控项原型 名称:Discovery of Brute Force SSH Hacking on Linux 监控项原型 - 名称: 监控linux暴力破解的IP地址 - 键值:custom.ssh.failed.num[{ 3、创建触发器类型: - 名称: 服务器{HOST.NAME}正遭受{ - 表达式:{CNSH-OPS-LOGCENTER-C-0-171:custom.ssh.failed.num[{ 下面这个可以当做SSH暴力破解的图表,有数据就会进入,主要是看服务器是几点入侵的 {
监控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] get_temp_cpu () { sensors|grep "Package id $1 " |cut -c 17-18 } get_temp_gpu () { nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader } 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 ~] 66 [root@zabbix ~] 36 [root@zabbix ~] 31
3、增加到配置文件让zabbix-server调用脚本(加入最后一行即可)
1 2 3 4 5 6 7 $ vim /etc/zabbix/zabbix_agent2.conf UserParameter=cpu_tmp[*],/etc/zabbix/scripts/temperature_monitoring.sh $1 $2 UserParameter=gpu_tmp[*],/etc/zabbix/scripts/temperature_monitoring.sh $1 UserParameter=gpu_memory_use[*],/etc/zabbix/scripts/temperature_monitoring.sh $1
4、zabbix-web 创建模板,创建触发器和图形
5、查看是否有数据,监控项是否生效,触发器是否正常,图形是否显示
这里不在介绍可以自己去主机里面查看最新数据即可