七、自定义监控项
例如:监控客户端的用户数
1、在客户端启动自定义监控项功能
# vim /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf #默认监控命令的配置文件目录,可自定义
UnsafeUserParameters=1 #启用自定义监控项功能
2、在客户端定义监控命令
在/etc/zabbix/zabbix_agentd.d目录默认有一个配置模板,可以参考里面的格式修改
自定义配置文件:
# vim /etc/zabbix/zabbix_agentd.d/customize_usernums.conf
#UserParameter=\<key\>,\<shell command\>
UserParameter=user_nums,wc -l /etc/passwd | awk '{print $1}'
说明:
UserParameter:自定义命令的关键字
user_nums:命令名称
wc -l /etc/passwd | awk '{print $1}':shell命令
重启客户端agent:service zabbix-agent restart
3、在监控端测试客户端自定义的监控命令
zabbix_get -s 10.100.2.200 -k user_nums
35 #结果为35,表示有35个用户
4、在监控端调用自定义命令
创建模板:配置-->模板-->创建模板
创建应用集:配置-->模板-->应用集-->创建应用集
创建监控项:输入名称、键值(自定义的监控命令),选择应用集,添加即可。
5、调用自定义的模板
配置-->主机,选择要添加模板的主机-->模板,输入custom搜索模板,添加、更新。
此时,在主机的监控项即可看到自定义的监控项目了
在监测中-->最新数据,可以看到监控数据了。
例如:监控FTP服务器服务和端口
1、一个一个服务(端口)的去监控,如ntp服务,端口号UDP:123
1> 修改配置文件:# vim /etc/zabbix/zabbix_agentd.conf
启用自定义监控项:UnsafeUserParameters=1
修改监控项:使用服务名UserParameter=mon_ntpd,ps -ef|grep -w ntpd|grep -v grep|wc -l
等同于:使用端口号UserParameter=mon_udp123, netstat -unpl|grep -w 123|awk '{print $4}'|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|uniq|wc -l
注:如有多个监控服务,分多行即可。
2>重启zabbix-agent:# service zabbix-agent restart
3>在监控端测试:# zabbix_get -s 10.100.2.5 -p 10050 -k mon_ntpd
结果为1表示服务正常。
4>创建应用集:Services #在Template OS Linux模板创建
5>创建监控项:#在对应的主机监控项中创建
名称:如Monitor_ntpd
键值:mon_ntpd
应用集:Services
6>创建触发器:#在对应的主机监控项中创建
名称:ntpd process not running
严重性:如警告
表达式:{ftp-server:mon_ntpd.last()}<>1
7>测试:# service ntpd stop,查看是否报警。
2、通过脚本批处理监控所有端口
1>创建shell脚本
vim /usr/local/zabbix_agent/zabbix_tcp.sh
输入以下脚本:
#!/bin/bash
portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk '{print $4}'|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort -n|uniq`)
length=${#portarray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
保存并授予执行权限:# chmod +x /usr/local/zabbix_agent/zabbix_tcp.sh
2>修改配置文件:# vim /etc/zabbix/zabbix_agentd.conf
增加一行:UserParameter=mon_tcpport,/root/shell/zabbix_tcp.sh "$1"
3>重启zabbix-agent:# service zabbix-agent restart
4>在监控端测试:# zabbix_get -s 10.100.2.5 -k mon_tcpport
如果提示以下错误:表示没有权限
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
解决办法:在脚本中使用sudo netstat命令,并修改sudoers文件:
vim /etc/sudoers
#Defaults requiretty #注释掉此行
zabbix ALL=(ALL) NOPASSWD: ALL #添加此行
5>创建自动发现规则:在Template OS Linux模板创建
名称:tcp port discovery
键值:mon_tcpport
6>创建监控项原型:在自动发现规则中创建
名称:tcp port {#TCP_PORT} status
键值:net.tcp.listen[{#TCP_PORT}]
应用集:Services
7>创建触发器原型:在自动发现规则中创建
名称:tcp port {#TCP_PORT} status
严重性:警告
表达式:{Template OS Linux:net.tcp.listen[{#TCP_PORT}].count(#3,0,"eq")}>2
注:{.count(#3,0,”eq”)}>2,表示最近3个值中等于0的个数大于2时则报警。
8>测试
9>在监测中-->最新数据状态如下:
注:net.tcp.listen[port] 检查 TCP 端口 是否处于侦听状态。返回 0 - 未侦听;1 - 正在侦听
八、图形管理
同(配置和管理Zabbix(一))监控项管理,可以根据需要添加想查看的图形。
九、Zabbix历史(history)和趋势(trends)数据
历史数据:即每1、5、15分钟的数据。
趋势数据:即每小时的平均数据,每小时收集一次,占用的资源很小。
保留历史和趋势数据:如下图,在监控项里设置。一般保存历史记录14天,趋势数据5年就可以了。根据磁盘空间来定义。超过保留时间的数据会被删除。
可以看到默认的监控项为历史数据7天(7d即1w一周),趋势数据1年(365d)
注:时间单位后缀
s - 秒(一般不写s,即表示默认为s)
m - 分、h - 小时、d - 天、w - 周
十、报警媒介
在触发器触发了一条报警信息后,需要通过报警媒介发送给用户,Zabbix支持Email、Jabber、SMS、自定义脚本等媒介。
通过Email发报警信息给用户:
1、配置sendmail或postfix:
报警信息将会使用系统自带的sendmail发送,CentOS7默认没有安装sendmail,而是安装和启用了postfix。若要使用sendmail还需要禁用postfix并安装sendmail。但可以使用postfix来代替sendmail发送邮件,效果是一样的,不过都要安装mailx。
yum install mailx
由于邮箱服务器有多个不同的域名服务器,可以修改main.cf,指定转发服务器
# vim /etc/postfix/main.cf
relayhost = [10.100.2.103]
systemctl restart postfix
2、配置Email:
管理-->报警媒介类型-->Email,如下图:
SMTP服务器:邮件服务器域名或IP地址,如exchange hub
SMTP HELO:一般为邮件服务器顶级域名
SMTP电邮:收件人From看到的邮件地址
注:可根据需要选择是否开启安全验证,如使用通过验证的账号密码发邮件。另外Exchange服务器,还要在服务器配置集线器传输中,修改接收连接器(如有限制),在网络中添加允许匿名发送邮件的服务器或设备的IP地址。
3、配置用户
使用定义的媒介:管理-->用户-->报警媒介
点击添加,在弹出的页面输入收件人地址,根据需要选择触发级别。
点击添加后再更新即可
4、配置动作:
配置-->动作-->创建动作:定义名称和条件(可定义多个条件)
定义操作:添加操作细节,发送对象、发送方式、发送类型等
恢复操作和确认操作类似:
动作配置完成:
测试:
例如# systemctl stop zabbix-agent
将收到以下告警邮件提醒
故障恢复后邮件提醒:
在仪表板可以看到问题的描述:
使用自定义脚本和sendEmail发送邮件:
Zabbix默认Email使用系统自带的sendmail发送邮件,但有邮件会被当成垃圾邮件。更简单和自由的方式,可以使用自定义脚本和sendEmail(或外部邮件服务器)。
1、安装sendEmail软件
# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
# cp sendEmail-v1.56/sendEmail /usr/local/bin/
测试发送邮件
/usr/local/bin/sendEmail -f zabbix@test.com -t xxxx@test.com -s 10.100.2.103 -u "测试邮件" -o message-charset=utf8 -m "测试邮件内容"
发送成功,将收到以下提示。
Mar 19 18:16:54 zabbix sendEmail[22980]: Email was sent successfully!
命令说明:
/usr/local/bin/sendEmail 命令主程序
-f zabbix@test.com 发件人邮箱
-t xxxx@test.com 收件人邮箱
-s 10.100.2.103 发件人邮箱的smtp服务器
-u "测试邮件" 邮件的主题
-o message-charset=utf8 邮件内容编码
-o message-content-type=html 邮件内容的格式,html表示它是html格式
-xu senduser@test.com 发件人邮箱的用户名(SMTP验证的用户名)
-xp 123456 发件人邮箱密码(SMTP验证的密码,注意特殊符号)
-m “测试邮件内容" 邮件的具体内容
-cc xxx@xx.com 抄送地址
-bcc yyy@yy.com 暗送地址
2、检查告警脚本路径
egrep -v '^#|^$' /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
3、创建邮件发送脚本
# vim /usr/lib/zabbix/alertscripts/send_mail.sh
#!/bin/sh
to=$1
subject=$2
body=$3
/usr/local/bin/sendEmail -f zabbix@test.com -t "$to" -s 10.100.2.103 -u "$subject" -o message-content-type=html -o message-charset=utf8 -m "$body" 2>>/tmp/stderr2.log
赋于执行权限:chmod +x /usr/lib/zabbix/alertscripts/send_mail.sh
4、配置自定义脚本媒介
管理-->报警媒介类型-->创建媒体类型,输入名称,选择类型为脚本,输入脚本名称,添加即可。
5、使用自定义脚本媒介
管理-->用户-->选择用户-->报警媒介-->添加
选择类型为自定义的sendEmail,输入收件人,添加即可。
添加了报警媒介,更新完成。
6、配置动作
同Email配置,只是在配置操作时,选择发送到sendEmail即可。
十一、拓扑图
添加拓扑图:
监测中-->拓扑图-->Local network-->编辑拓扑图-->(图标)添加,点击新增图标进行编辑,输入标签,选择主机和图标,应用。
应用后,点击更新,完成拓扑图编辑。
点击右上角的星号,添加到常用。在仪表板显示,便于从仪表盘查看。
来源:51CTO
作者:lorysun
链接:https://blog.51cto.com/lorysun/2134297