系统监控平台ZABBIX的安装、配置和使用(二)

版权声明: https://blog.csdn.net/laotou1963/article/details/80910580

系统监控平台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-agentos-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主动报告和警告触发的配置已全部完成。

猜你喜欢

转载自blog.csdn.net/laotou1963/article/details/80910580