系统监控平台ZABBIX的使用
本文将介绍使用ZABBIX对一些不同设备进行监控,同时也会简单介绍一下如何使用自定义监控。
ZABBIX服务器监控
启用 Zabbix Agent
Zabbix Agent已经安装在服务器上,我们要做的是修改agent的配置文件,然后启用agent。
vi /etc/zabbix/zabbix_agentd.conf
修改配置文件中的下列内容,我们建议用FQDN。
Server=zabbix.lswin.cn
# ServerActive=127.0.0.1
Hostname=zabbix.lswin.cn
我们不适用Active Check,所以注释掉ServerActive。
重启并启用agent:
systemctl restart zabbix-agent
systemctl enable zabbix-agent
检查zabbix agent:
root@zabbix:~# zabbix_get -s zabbix.lswin.cn -k system.uname
Linux zabbix 4.15.0-24-generic #26-Ubuntu SMP Wed Jun 13 08:44:47 UTC 2018 x86_64
root@zabbix:~#
如看到类似的输出,说明agent已正常启动。如果出现zabbix_get没有安装错误,请用
apt install zabbix-get
系统出现的提示是不正确的。
在Zabbix服务器上配置监控主机
配置
自动发现规则
以admin登陆Zabbix前台,选择【配置】->【自动发现】
安装时已经有一个样板在那,我们只需要根据该样板设置。
首先点击名称local network
在点击【克隆】
按现实情况填写表单,我们的被监控设备IP地址都在192.168.220.0/24 网段。
名称:192.168.220.0/24
IP范围:192.168.220.1-254
更新间隔:10,单位是分钟。默认值是60,即每60分钟扫描一遍寻找zabbix agent,这是很耗资源的工作,特别是在设备较多的情况下。我们缩短到10,只是为了演示方便。
检查:zabbix客户端 “system.uname”
设备唯一性准则:Zabbix客户端“system.uname”
勾选【已启用】
填完后,点击【添加】
新的自动发现规则`192.168.220.0/24`已添加成功。配置 被监控
主机
规则
选择【配置】->【主机】
系统默认已经设置了自身监控规则,只是没有启动。我们将修改该规则然后启用。点击名称Zabbix server
默认IP地址
用的是127.0.0.1,在我们的示例中,IP地址
都会采用DNS名称
,在DNS名称
框中填入zabbix.lswin.cn
,然后点击连接到
的选项DNS
,再勾选【已选用】。点击【更新】,结束修改。
在监控仪表板得到了错误警告!
【自动发现状态】显示有一台设备,证明agent是工作的。错误一定是在被监控主机
规则上。从主机配置的图上,我们可以看到哪里错了,我们键入了错误的主机FQDN - zabbix.lswin.com,正确的应该是zabbix.lswin.cn
。
修改被监控主机
配置,并更新。
已恢复正常。仔细看一下出现的问题:
下图是一张zabbix.lswin.cn的状态聚合图:
ZABBIX服务器的简单监控设置已完成,问题触发报告后面统一介绍。
OPNsense服务器监控
启用 Zabbix Agent
安装Zabbix Agent
以root登陆OPNsense,然后选择【系统】->【固件】->【插件】,寻找os-zabbix-agent
或os-zabbix-agent-devel
,我们将安装os-zabbix-agent-devel
。
点击右面的+
号,完成agent的安装。
os-zabbix-agent-devel
安装完成,开始配置。配置Zabbix Agent
选择【服务】->【Zabbix Agent】->【设置】,如【Zabbix Agent】没有出现在服务列表中,登出然后再登陆。
我们的OPNsense的FQDN是lsgateway.lswin.cn
,IP地址是192.168.220.1
;Zabbix服务器的FQDN是zabbix.lswin.cn
。表单填写完成后,点击【应用】。
【Zabbix Features】和 【Tuning Parameters】保留默认即可。
完成后,重启Zabbix Agent服务。检查Zabbix Agent是否工作:
在Zabbix服务器端:
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k system.uname
zabbix_get [7067]: Check access restrictions in Zabbix agent configuration
root@zabbix:~#
如看到上述结果,OPNsense的Zabbix Agent未正确配置,或配置后没有重启Zabbix Agent。检查配置并重启。
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k system.uname
FreeBSD lsgateway.lswin.cn 11.1-RELEASE-p11 FreeBSD 11.1-RELEASE-p11 116e406d37f(stable/18.1) amd64
root@zabbix:~#
这说明Zabbix Agent已在OPNsense上正常工作。
在Zabbix服务器上配置监控主机
添加
主机群组
在zabbix下,任何被监控主机必须属于某个主机群组
,所以先添加主机群组
。
【配置】->【主机群组】->【创建主机群组】
然后点击【添加】完成创建群组。导入定制模板
我们使用pfsense的定制模板来监控OPNsense,因为OPNsense是从pfsense来的,基本架构和pfsense一致。
pfsense菜单模板来自Keenton,见github链接。
【配置】->【模板】->【导入】
为Zabbix Agent添加定制命令和启用SNMP
打开OPNsense的命令行终端,编辑/usr/local/etc/zabbix_agentd.conf.d/local_zabbix.conf
vi /usr/local/etc/zabbix_agentd.conf.d/local_zabbix.conf
将下列行加入文件:
UserParameter=pfsense.states.current,grep "current entries" /tmp/pfctl_si_out | tr -s ' ' | cut -f4 -d ' '
UserParameter=pfsense.mbuf.current,netstat -m | grep "mbuf clusters" | cut -f1 -d ' ' | cut -d '/' -f1
UserParameter=pfsense.mbuf.cache,netstat -m | grep "mbuf clusters" | cut -f1 -d ' ' | cut -d '/' -f2
UserParameter=pfsense.mbuf.max,netstat -m | grep "mbuf clusters" | cut -f1 -d ' ' | cut -d '/' -f4
重启Zabbix Agent,在Zabbix服务器上检查添加的Agent本地命令是否工作。应可看到类似于下面的结果,否则设置有问题。
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k pfsense.states.current
265
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k pfsense.mbuf.current
258
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k pfsense.mbuf.cache
1532
root@zabbix:~# zabbix_get -s lsgateway.lswin.cn -k pfsense.mbuf.max
125444
root@zabbix:~#
因定制模板采用SNMP获取OPNsense的信息,我们还需在OPNsense启用SNMP服务。
首先我们需要安装SNMP插件包os-snmp-devel
(前面已介绍如何安装插件,这就不再重复)。
安装完成后,进入【服务】【SNMP】配置SNMP服务(如【SNMP】没有出现在服务列表中,登出然后再登陆)。
启用【SNMP进程】和所有模块,不需要启用【SNMP陷阱】,点击【保存】完成配置。保存后再重启SNMP。
记住【读取社区字符串】的值,一会而配置被监控主机时需要。
- 配置 被监控
主机
规则
在Zabbix前台,选择【配置】->【主机】->【创建主机】
填写内容,后点击【添加】。
然后在【配置】->【主机】下点击LSGATEWAY
点击【模板】->【选择】,在下拉菜单中选择Template OS pfSense
后再点击【选择】
点击【添加】将Template OS pfSense
加入链接的模板
。加入后点击【宏】
点击【继承以及主机 宏】,将SNMP【读取社区字符串】填入【可用值】,然后点击【更新】完成配置。
Zabbix的【自动发现】进程,会慢慢从LSGATEWAY获取所有值。下图是Zabbix获取所有之后的结果。
SAN设备监控监控
安装 Zabbix Agent
- 安装Zabbix Agent
从Ubuntu 18.04仓库直接安装Zabbix Agent
apt install zabbix-agent
- 配置agent
修改 /etc/zabbix/zabbix_agentd.conf
中的下列内容:
Server=zabbix.lswin.cn
#ServerActive=127.0.0.1
Hostname=san.lswin.cn
SAN设备的FQDN是:san.lswin.cn
注释掉ServerActive
,因为不使用Active Check。
添加配置文件/etc/zabbix/zabbix_agentd.conf.d/userparameter_md.conf
# Software raid Monitoring
# - Static items to return capabilities and unused devices
UserParameter=vfs.md.personalities, grep '^Personalities' /proc/mdstat | cut -d ' ' -f 3- | grep '[[:alpha:]]' || echo '<none>'
UserParameter=vfs.md.unused, grep '^unused devices:' /proc/mdstat | cut -d ' ' -f 3- | grep '[[:alpha:]]' || echo '<none>'
# - LLD Discovery item that will return all 'md*' devices with raid level and status. The raid level and status macro's can be used as filters in the discovery rule.
UserParameter=vfs.md.discovery, echo -n '{ "data":[ ' ; awk '/^md/ { gsub("raid","",$4); printf "{ \"{#MDDEVICE}\":\"" $1 "\",\"{#MDSTATUS}\":\"" $3 "\",\"{#MDLEVEL}\":\"" $4 "\" }," }' /proc/mdstat | sed 's/,$//'; echo ' ] }'
# - Prototype items to be used with each 'md*' device
UserParameter=vfs.md.status[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep $1 | awk '{ print $$3 }'
UserParameter=vfs.md.level[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep $1 | awk '{ gsub("raid","",$$4); print $$4 }'
UserParameter=vfs.md.members[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep $1 | cut -d ' ' -f 5- | tr -d ';'
UserParameter=vfs.md.nummembers[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep $1 | cut -d ' ' -f 5- | tr -d ';' | wc -w
UserParameter=vfs.md.size[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o '[[:digit:]].* blocks' | sed 's/ blocks//'
UserParameter=vfs.md.needed[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o '\[[[:digit:]]*\/[[:digit:]]\]' | sed -e 's/.*\[\([[:digit:]]*\)\/[[:digit:]]*\]/\1/'
UserParameter=vfs.md.active[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o '\[[[:digit:]]*\/[[:digit:]]\]' | sed -e 's/.*\[[[:digit:]]*\/\([[:digit:]]*\)\]/\1/'
UserParameter=vfs.md.up[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o '\[[U_F]*\]' | grep -o 'U' | wc -l
UserParameter=vfs.md.down[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o '\[[U_F]*\]' | grep -o '_' | wc -l
UserParameter=vfs.md.recoverperc[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o 'recovery\ =\ .*%' | sed -e 's/recovery\ =\ \(.*\)%/\1/' | grep '[[:digit:]]' || echo 100
UserParameter=vfs.md.recoverspeed[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o 'speed=[[:digit:]].*\/sec' | sed -e 's/speed=\(.*\)\/sec/\1/' -e 's/K/000/' -e 's/M/000000/' -e 's/G/000000000/' | grep '[[:digit:]]' || echo 0
UserParameter=vfs.md.recovereta[*], sed -e 's/^\ *$/EoB/' -e 's/$/;/' -n -e "/$1/,/EoB;/p" /proc/mdstat | grep -o 'finish=.*\ ' | sed -e 's/finish=\(.*\)/\1/' | grep '[[:digit:]]' || echo 0
因为我们将应用专门的SoftRAID模板,该模板需要这些额外的配置。
- 启用agent
systemctl restart zabbix-agent
systemctl enable zabbix-agent
我们从Zabbix服务器端检查SAN上的Zabbix Agent和客户定制是否工作。
root@zabbix:~# zabbix_get -s san.lswin.cn -k system.uname
Linux san 4.15.0-23-generic #25-Ubuntu SMP Wed May 23 18:02:16 UTC 2018 x86_64
root@zabbix:~# zabbix_get -s san.lswin.cn -k agent.hostname
san.lswin.cn
root@zabbix:~# zabbix_get -s san.lswin.cn -k vfs.md.personalities
[raid1] [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid10]
root@zabbix:~# zabbix_get -s san.lswin.cn -k vfs.md.discovery
{ "data":[ { "{#MDDEVICE}":"md1","{#MDSTATUS}":"active","{#MDLEVEL}":"1" },{ "{#MDDEVICE}":"md0","{#MDSTATUS}":"active","{#MDLEVEL}":"6" } ] }
root@zabbix:~#
当我们看到类似的结果,证明agent和客户定制都以正常工作。
配置被监控主机
- 导入SoftRAID监控模板
【配置】->【模板】->【导入】
我们使用的模板来自Raymond Kuiper。导入成功后,我们就能见到我们需要的模板Template_Linux_MD_Raid
创建主机群组
【配置】->【主机群组】->【创建主机群组】
为方便管理,我们将SAN设备归入SAN主机群组。
创建被监控主机
【配置】->【主机】->【创建主机】
主机名称使用了SAN设备的FQDN:san.lswin.cn
可见名称:SAN1
agent接口使用SAN设备的FQDN:san.lswin.cn,端口为标准端口:10050给监控规则添加模板
【配置】->【主机】,点击主机名SAN1
,然后是【模板】来添加模板。
我们在这只添加了模板Template_Linux_MD_Raid
,如需监控系统状态,可再添加Template OS Linux
模板Template_Linux_MD_Raid
中最长的更新周期是1小时,所以我们需要等待一小时,所有的内容才会全部出现。
- san.lswin.cn的监控显示
Zabbix Agent主动报告和警告触发
前面介绍的监控,都是通过Zabbix服务器通过被监控设备上的agent定时抓取数据,不一定能第一时间发现问题并触发警告。这能满足一般的监控任务,当并一定能满足所有任务,如UPS发生断电问题、磁盘阵列发生急需处理的问题等。这就需要被监控设备上的Zabbix Agent在设备发生继续处理问题时主动先Zabbix服务器发出报告并触发警告。这里将介绍如何实现Zabbix Agent主动报告和警告触发。
示例:当SoftRAID发生急需处理的问题时,向Zabbix服务器发送报告,报告的key值是:vfs.md.alerts[mdx],数据为非负整数(1:发生问题,2:问题已解决),显示事件名为:Device mdx Needs Attention Immediately!
。
扩展现有的
Template_Linux_MD_Raid
我们将通过扩展
Template_Linux_MD_Raid
的途径,支持主动报告和警告触发功能。
【配置】->【模板】在模板列表中点击Template_Linux_MD_Raid
,打开Template_Linux_MD_Raid
模板。
因为SoftRAID可能有多个磁盘阵列,所以我们需要通过自动发现规则来实现我们的目标。
点击【自动发现规则】
我们将在此发现规则中增加新的监控项和触发器。点击【监控项】下的监控项原型
,打开监控项原型列表。
点击右上角的【创建监控项原型】,开始创建新的监控项。
点击【添加】完成创建监控项原型。
Device {#MDDEVICE} Needs Attention Immediately!
已经成功创建。准备为它创建新的触发器。点击【触发器类型】,打开触发器类型列表。
点击右上角的【创建触发器原型】,开始创建新的触发器。
点击【添加】完成创建触发器原型。
我们可以看到,新的触发器已成功添加。
为保证新修改的模板被成功加载和应用,我们重启Zabbix服务器。
systemctl restart zabbix-server
- SAN设备端自动监控和报告
先测试一下,看Zabbix服务器是否能正确处理vfs.md.alert事件
# 发送MD0需立刻处理事件
root@san:~# date
Fri Jul 6 16:11:13 CST 2018
root@san:~# zabbix_sender -z zabbix.lswin.cn -s san.lswin.cn -k vfs.md.alert[md0] -o 1
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000112"
sent: 1; skipped: 0; total: 1
root@san:~#
检查最新数据:
仪表盘上的状态显示:
从图中可以看到,Zabbix收到了上报的状态,并正确触发了告警。
再测试一下恢复事件:
# 发送MD0需恢复事件
root@san:~# date
Fri Jul 6 16:18:39 CST 2018
root@san:~# zabbix_sender -z zabbix.lswin.cn -s san.lswin.cn -k vfs.md.alert[md0] -o 2
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000074"
sent: 1; skipped: 0; total: 1
root@san:~#
仪表盘上的状态显示:
我们新建的报告接收和警告触发已正常工作。
下面是SAN设备端自动监控和报告:
确认需立刻处理事件条件:
1. 磁盘阵列出现失败的磁盘
2. 磁盘阵列运行在退化状态
下面的shell脚本用于监控磁盘阵列,在发生需立刻处理事件时,上报Zabbix服务器。
#!/bin/bash
# if there is no zabbix conf file, exit
CONFFILE=/etc/zabbix/zabbix_agentd.conf
if [ ! -f $CONFFILE ]; then
exit 1
fi
DIRNAME=/tmp/$(/bin/hostname -f)
if [ ! -d $DIRNAME ]; then
/bin/mkdir -p $DIRNAME
fi
##
srvname=
hostname=
# get zabbix server address
while read line; do
if [[ ${line:0:1} != '#' ]]; then
line=$(echo $line | sed 's/[[:space:]]//g')
if [[ "$line" != "" ]]; then
name=$(echo $line | grep "Server=" | sed "s/Server=//")
if [[ "$name" != "" ]]; then
srvname=$name
fi
name=$(echo $line | grep "Hostname=" | sed "s/Hostname=//")
if [[ "$name" != "" ]]; then
hostname=$name
fi
fi
fi
done < $CONFFILE
# if server or hostname not defined, exit
if [[ "$srvname" = "" || "$hostname" = "" ]]; then
exit 2
fi
# echo MD status
key=vfs.md.alert
needsattn=2
str=$(awk '/^md/ { gsub("raid","",$4); printf $1 " " }' /proc/mdstat | sed 's/^[ \t]*//;s/[ \t]*$//')
devs=(${str})
for i in "${devs[@]}"
do
needsattn=2
keyword=$key"["$i"]"
while read line; do
res=$(echo $line | grep "Failed Devices : ")
if [[ "$res" != "" ]]; then
tmp=$(echo $res | sed "s/Failed Devices : //" | sed 's/[[:space:]]//g')
if [[ "$tmp" != "0" ]]; then
needsattn=1
fi
fi
res=$(echo $line | grep "State : " | grep degraded)
if [ "$res" != "" ]; then
needsattn=1
fi
done <<< $(mdadm --detail /dev/$i)
if [[ ! -f $DIRNAME/$i ]]; then
zabbix_sender -z $srvname -s $hostname -k $keyword -o $needsattn
# sent successfully, update status
if [[ "$?" == "0" ]]; then
echo $needsattn > $DIRNAME/$i
fi
else
pstatus=$(head -n 1 $DIRNAME/$i)
if [[ "$needsattn" != "$pstatus" ]]; then
zabbix_sender -z $srvname -s $hostname -k $keyword -o $needsattn
# sent successfully, update status
if [[ "$?" == "0" ]]; then
echo $needsattn > $DIRNAME/$i
fi
fi
fi
done
shell脚本不做具体介绍了,它的基本工作方式是:
1. 新启动的设备,会将最新状态报送服务器。
2. 当监控脚本发现状态变化时,报送新的状态到Zabbix服务器。
3. 报送成功后,再更新当前状态,避免漏报。
4. 状态分二种:1-有需要立刻处理事件;2-磁盘阵列已恢复。
监控脚本是以cron任务的形式运行
#
# cron.d/chkmd -- schedules periodic checks of MD devices
#
* * * * * root /etc/zabbix/utils/check-md > /dev/null 2>&1
Zabbix Agent主动报告和警告触发的配置已全部完成。