zabbix自定义监控(进程,日志,mysql主从状态,mysql主从延迟)
准备工作
准备三台主机:
主机名 | 系统版本 | ip地址 |
---|---|---|
controller | CentOS 8 | 192.168.200.10 |
node1 | CentOS 8 | 192.168.200.20 |
node2 | RedHat 8 | 192.168.200.30 |
这里controller是服务端,node1是客户端。
node2将作为主从数据库中的主数据库
node1将作为主从数据库中的从数据库
自定义监控进程
在客户端开启自定义监控功能
[root@node1 ~]# cd /usr/local/etc/
[root@node1 etc]# ls
zabbix_agentd.conf zabbix_agentd.conf.d
[root@node1 etc]#
[root@node1 etc]# vi zabbix_agentd.conf
...
# UnsafeUserParameters=0
UnsafeUserParameters=1
[root@node1 etc]#
创建一个目录用来存放脚本,并查看被监控的进程行数,
[root@node1 ~]# mkdir /script
[root@node1 ~]# cd /script/
[root@node1 script]#
[root@node1 script]# ps -ef | grep 'postfix' | grep -v grep
root 7183 1 0 14:48 ? 00:00:00 /usr/libexec/postfix/master -w
postfix 7184 7183 0 14:48 ? 00:00:00 pickup -l -t unix -u
postfix 7185 7183 0 14:48 ? 00:00:00 qmgr -l -t unix -u
[root@node1 script]#
[root@node1 script]# ps -ef | grep 'postfix' | grep -v grep | wc -l
3
[root@node1 script]#
编辑脚本,并加上执行权限
[root@node1 script]# vi jc.sh
[root@node1 script]# cat jc.sh
#!/bin/bash
process=$(ps -ef | grep "$1" | grep -Ev "grep | $0" | wc -l)
if [ $process -eq 0 ];then
echo "1"
else
echo "0"
fi
[root@node1 script]#
[root@node1 script]# ls
jc.sh
[root@node1 script]# chmod +x jc.sh
添加自定义监控项
[root@node1 ~]# cd /usr/local/etc/
[root@node1 etc]# ls
zabbix_agentd.conf zabbix_agentd.conf.d
[root@node1 etc]#
[root@node1 etc]# vi zabbix_agentd.conf
...
# ListenBacklog=
UserParameter=show_process_postfix,/bin/bash /script/jc.sh postfix
[root@node1 etc]#
重启zabbix_agentd服务
[root@node1 ~]# systemctl restart zabbix_agentd
[root@node1 ~]#
[root@node1 ~]# systemctl status zabbix_agentd
● zabbix_agentd.service - zabbix agentd
Loaded: loaded (/usr/lib/systemd/system/zabbix_agentd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-09-26 15:13:28 CST; 8s ago
Process: 7487 ExecStop=/usr/bin/pkill zabbix_agentd (code=exited, status=0/SUCCESS)
...
[root@node1 ~]#
在服务端获取客户端postfix的值
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process_postfix
0
[root@controller ~]#
[root@node1 ~]# systemctl stop postfix
[root@node1 ~]#
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process_postfix
1
[root@controller ~]#
postfix的值为0时说明postfix服务已开启,postfix的值为1时说明服务是停止状态。
添加show process of postfix监控项
创建监控项
name后面填写监控项名称
key后面选择监控类型
监控项添加成功
添加触发器
name后面填写触发报警后显示的内容
severity后面选择一个报警级别
点击add添加规则
Item后面点击select选择监控项目
设置result选择=1时触发报警
点击Add
触发器添加成功
手动触发并验证
停止postfix服务
[root@node1 ~]# systemctl stop postfix
[root@node1 ~]#
报警已触发
编辑zabbix_agentd.conf文件,修改自定义监控项使其能传输多个参数
[root@node1 ~]# vi /usr/local/etc/zabbix_agentd.conf
...
# ListenBacklog=
UserParameter=show_process[*],/bin/bash /script/jc.sh $1
[root@node1 ~]#
[root@node1 ~]# systemctl restart zabbix_agentd
重启zabbix_agentd服务
在服务端查看客户端多个服务状态
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process['postfix']
1
[root@controller ~]#
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process['httpd']
1
[root@controller ~]#
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process['mysql']
1
[root@controller ~]#
[root@controller ~]# zabbix_get -s 192.168.200.20 -k show_process['zabbix']
0
[root@controller ~]#
修改show process of postfix监控项
修改key后面的内容
查看监控项
添加httpd监控项
name后面填写监控项名称
key后面填写httpd监控类型
查看监控项
添加httpd触发器
name后面填写触发报警后显示的内容
severity后面选择一个报警级别
点击add添加规则
Item后面点击select选择监控项目
设置result选择=1时触发报警
点击Add
查看触发器
由于node1客户端没有httpd服务,等待触发报警就行
自定义监控日志
下载pyscripts包
下载地址:https://github.com/chendao2015/pyscripts
安装unzip解压工具,解压pyscripts-master.zip压缩包
[root@node1 ~]# ls
anaconda-ks.cfg pyscripts-master.zip zabbix-6.4.6 zabbix-6.4.6.tar.gz
[root@node1 ~]#
[root@node1 ~]# yum -y install unzip
Last metadata expiration check: 2:15:16 ago on Tue 26 Sep 2023 02:02:02 PM CST.
Dependencies resolved.
...
Installed:
unzip-6.0-45.el8_4.x86_64
Complete!
[root@node1 ~]#
[root@node1 ~]# unzip pyscripts-master.zip
Archive: pyscripts-master.zip
67a2f27e90f1cb27d46bbe855d255b3e0d302cd7
creating: pyscripts-master/
inflating: pyscripts-master/README.md
inflating: pyscripts-master/dmp4.py
inflating: pyscripts-master/log.py
inflating: pyscripts-master/mail_send.py
inflating: pyscripts-master/定时发微信群消息.zip
[root@node1 ~]#
[root@node1 ~]# ls
anaconda-ks.cfg pyscripts-master pyscripts-master.zip zabbix-6.4.6 zabbix-6.4.6.tar.gz
[root@node1 ~]#
将pyscripts-master目录下的log.py文件移动到script目录下,并给log.py加上执行权限
[root@node1 ~]# cd pyscripts-master
[root@node1 pyscripts-master]# ls
dmp4.py log.py mail_send.py README.md 定时发微信群消息.zip
[root@node1 pyscripts-master]#
[root@node1 pyscripts-master]# mv log.py /script/
[root@node1 pyscripts-master]#
[root@node1 pyscripts-master]# cd /script/
[root@node1 script]# ll
total 8
-rwxr-xr-x 1 root root 136 Sep 26 15:00 jc.sh
-rw-r--r-- 1 root root 1854 Mar 22 2020 log.py
[root@node1 script]#
[root@node1 script]# chmod +x log.py
[root@node1 script]# ll
total 8
-rwxr-xr-x 1 root root 136 Sep 26 15:00 jc.sh
-rwxr-xr-x 1 root root 1854 Mar 22 2020 log.py
[root@node1 script]#
删除pyscripts压缩包和文件
[root@node1 script]# cd
[root@node1 ~]#
[root@node1 ~]# ls
anaconda-ks.cfg pyscripts-master pyscripts-master.zip zabbix-6.4.6 zabbix-6.4.6.tar.gz
[root@node1 ~]#
[root@node1 ~]# rm -rf pyscripts*
[root@node1 ~]# ls
anaconda-ks.cfg zabbix-6.4.6 zabbix-6.4.6.tar.gz
[root@node1 ~]#
在客户端安装python3工具
[root@node1 ~]# yum -y install python3
Last metadata expiration check: 2:25:07 ago on Tue 26 Sep 2023 02:02:02 PM CST.
Dependencies resolved.
...
Installed:
python3-pip-9.0.3-20.el8.noarch python3-setuptools-39.2.0-6.el8.noarch python36-3.6.8-38.module_el8.5.0+895+a459eca8.x86_64
Complete!
[root@node1 ~]#
在tmp目录下创建一个日志文件,往里面随便加入内容
[root@node1 ~]# vi /tmp/test.log
[root@node1 ~]# cat /tmp/test.log
adsfvwwvaa
bbvbdgbylk
Error
bgavduaygd
mndaubdiuw
[root@node1 ~]#
执行脚本
[root@node1 ~]# python3 /script/log.py /tmp/test.log
1
[root@node1 ~]# python3 /script/log.py /tmp/test.log
0
[root@node1 ~]#
显示为1说明检索到了日志文件中的Error关键字
显示为0是应为第二次检索的时候是从上一次检索的最后位置开始检索,由于没有检索到关键字Error就显示为0。
编辑zabbix_agentd.conf配置文件添加自定义监控项
[root@node1 ~]# vi /usr/local/etc/zabbix_agentd.conf
...
# ListenBacklog=
UserParameter=show_process[*],/bin/bash /script/jc.sh $1
UserParameter=check_logs[*],python3 /script/log.py $1 $2 $3
"/usr/local/etc/zabbix_agentd.conf" 550L, 17166C written
[root@node1 ~]#
重启zabbix_agentd服务,删除logseek文件
[root@node1 ~]# systemctl restart zabbix_agentd
[root@node1 ~]# ls /tmp/
logseek testfile test.log vmware-root_938-2689078411 vmware-root_941-4022177618 zabbix_agentd.log zabbix_agentd.pid
[root@node1 ~]#
[root@node1 ~]# rm -f /tmp/logseek
[root@node1 ~]#
[root@node1 ~]# ls /tmp/
testfile test.log vmware-root_938-2689078411 vmware-root_941-4022177618 zabbix_agentd.log zabbix_agentd.pid
[root@node1 ~]#
由于客户端logseek文件属主为zabbix,在服务端测试时要先将logseek文件删除,否则无法查看。
在服务端测试客户端test.log文件
[root@controller ~]# zabbix_get -s 192.168.200.20 -k check_logs['/tmp/test.log']
1
[root@controller ~]#
创建check logs of /tmp/test.log 监控项
name后面填写监控项名称
key后面选择监控类型
查看监控项
添加触发器
name后面填写触发报警后显示的内容
severity后面选择一个报警级别
点击add添加规则
Item后面点击select选择监控项目
设置result选择=1时触发报警
点击Add
查看触发器
手动触发并验证
[root@node1 ~]# echo "Error" >> /tmp/test.log
[root@node1 ~]#
成功触发报警
自定义监控mysql主从状态
先在node1和node2上部署主从数据库
详细部署操作请参考:mysql主从数据库
创建mysql_status.sh脚本,查看从数据库状态,出现两个yes表示从数据库状态正常
[root@node1 ~]# cd /script/
[root@node1 script]# ls
jc.sh log.py
[root@node1 script]#
[root@node1 script]# vi mysql_status.sh
[root@node1 script]# cat mysql_status.sh
#!/bin/bash
mysql -e 'show slave status\G' | grep -i 'running:'
[root@node1 script]#
[root@node1 script]# chmod +x mysql_status.sh
[root@node1 script]# ./mysql_status.sh
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[root@node1 script]#
[root@node1 script]# vi mysql_status.sh
[root@node1 script]# cat mysql_status.sh
#!/bin/bash
mysql -e 'show slave status\G' | grep -i 'running:' | grep -c 'Yes'
[root@node1 script]#
[root@node1 script]# ./mysql_status.sh
2
[root@node1 script]#
修改mysql_status.sh脚本,添加条件变量
[root@node1 script]# vi mysql_status.sh
[root@node1 script]# cat mysql_status.sh
#!/bin/bash
count=$(mysql -uroot -p'redhat123' -e 'show slave status\G' | grep -i 'running:' | grep -c 'Yes')
if [ $count -ne 2 ];then
echo "1"
else
echo "0"
fi
[root@node1 script]#
[root@node1 script]# ./mysql_status.sh
1
[root@node1 script]#
当变量count不等于2输出为1时说明从数据库状态异常,相反输出为0时说明状态正常
编辑zabbix_agentd.conf配置文件添加自定义监控项
[root@node1 script]# vi /usr/local/etc/zabbix_agentd.conf
...
# ListenBacklog=
UserParameter=show_process[*],/bin/bash /script/jc.sh $1
UserParameter=check_mysql_status,/bin/bash /script/mysql_status.sh
UserParameter=check_logs[*],python3 /script/log.py $1 $2 $3
"/usr/local/etc/zabbix_agentd.conf" 551L, 17233C written
[root@node1 script]#
[root@node1 script]# systemctl restart zabbix_agentd
[root@node1 script]# ./mysql_status.sh
0
[root@node1 script]#
重启zabbix_agentd服务后,执行脚本输出显示为0说明从数据库状态正常
在服务端测试
[root@controller ~]# zabbix_get -s 192.168.200.20 -k check_mysql_status
0
[root@controller ~]#
添加mysql状态监控项
name后面填写监控项名称
key后面选择监控类型
点击Add
查看监控项
添加mysql触发器
name后面填写触发告警后显示的内容
severity后面选择一个告警级别
点击add添加规则
Item后面点击select选择监控项目
设置result选择=1时触发报警
点击Add
查看触发器
手动触发并验证
打开防火墙
[root@node2 ~]# systemctl start firewalld
[root@node2 ~]#
[root@node1 script]# mysql -uroot -predhat123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 47
...
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]>
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]>
MariaDB [(none)]> quit;
Bye
[root@node1 script]#
成功触发报警
自定义监控mysql主从延迟
关闭防火墙服务,查看主从数据库延迟
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]#
[root@node1 script]# mysql -uroot -predhat123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 59
...
MariaDB [(none)]>
MariaDB [(none)]> show slave status \G
...
Master_SSL_Key:
Seconds_Behind_Master: 201
Master_SSL_Verify_Server_Cert: No
...
1 row in set (0.000 sec)
MariaDB [(none)]>
MariaDB [(none)]> quit;
Bye
[root@node1 script]#
创建mysql_delay.sh脚本,将Seconds_Behind_Master后面的值取出来
[root@node1 script]# vi mysql_delay.sh
[root@node1 script]# cat mysql_delay.sh
#!/bin/bash
mysql -uroot -p'redhat123' -e 'show slave status\G' | grep 'Seconds_Behind_Master' | awk '{print $NF}'
[root@node1 script]#
[root@node1 script]# ls
jc.sh log.py mysql_delay.sh mysql_status.sh
给脚本加上执行权限,并运行脚本
[root@node1 script]# chmod +x mysql_delay.sh
[root@node1 script]#
[root@node1 script]# ll
total 16
-rwxr-xr-x 1 root root 136 Sep 26 15:00 jc.sh
-rwxr-xr-x 1 root root 1854 Mar 22 2020 log.py
-rwxr-xr-x 1 root root 116 Sep 26 19:46 mysql_delay.sh
-rwxr-xr-x 1 root root 171 Sep 26 18:13 mysql_status.sh
[root@node1 script]#
[root@node1 script]# ./mysql_delay.sh
201
[root@node1 script]#
延迟成功取出
编辑zabbix_agentd.conf配置文件添加自定义监控项
[root@node1 script]# vi /usr/local/etc/zabbix_agentd.conf
...
# ListenBacklog=
UserParameter=show_process[*],/bin/bash /script/jc.sh $1
UserParameter=check_mysql_status,/bin/bash /script/mysql_status.sh
UserParameter=check_mysql_delay,/bin/bash /script/mysql_delay.sh
UserParameter=check_logs[*],python3 /script/log.py $1 $2 $3
"/usr/local/etc/zabbix_agentd.conf" 552L, 17298C written
[root@node1 script]#
[root@node1 script]# systemctl restart zabbix_agentd
重启zabbix_agentd服务
在服务端测试
[root@controller ~]# zabbix_get -s 192.168.200.20 -k check_mysql_delay
201
[root@controller ~]#
添加mysql延迟监控项
name后面填写监控项名称
key后面选择监控类型
点击Add
查看监控项
添加mysql触发器
name后面填写触发告警后显示的内容
severity后面选择一个告警级别
点击add添加规则
Item后面点击select选择监控项目
设置result选择>200时触发报警
点击Add
查看触发器
触发报警