zabbix3.2.7之监控硬盘
一、监控硬盘脚本
#脚本存放目录
[root@zabbix-client-node1]# cd /etc/zabbix/zabbix_agentd.d [root@zabbix-client-node1 zabbix_agentd.d]# vi disk_scan.sh #!/bin/bash diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq 2>/dev/null`) length=${#diskarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#DISKNAME}\":\"${diskarray[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n"
#添加执行权限
[root@zabbix-client-node1 scripts]# chmod a+x disk_scan.sh [root@zabbix-client-node1 zabbix_agentd.d]# ll total 8 -rwxr-xr-x 1 root root 465 Sep 22 03:53 disk_scan.sh
#获取返回值
[root@zabbix-client-node1 zabbix_agentd.d]# su -s /bin/bash zabbix bash-4.2$ /etc/zabbix/zabbix_agentd.d/disk_scan.sh { "data":[ {"{#DISKNAME}":"sda"} ] }
#在zabbix agent通过iostat获取硬盘性能信息,并将该信息写入文本中
bash-4.2$ nohup iostat -m -x -d 30 >> /tmp/iostat_output
返回结果:
nohup: ignoring input and redirecting stderr to stdout #会一直停在这里
#为了以后方便使用,可将该命令写入到自动启动中。
[root@zabbix-client-node1 ~]# iostat -mx -d 30 Linux 3.10.0-327.el7.x86_64 (zabbix-client-node1) 09/22/2017 _x86_64_ (2 CPU) Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.03 0.45 0.20 0.01 0.00 51.82 0.00 1.62 0.88 3.30 0.50 0.03 scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.91 0.91 0.00 0.91 0.00 dm-0 0.00 0.00 0.41 0.21 0.01 0.00 52.14 0.00 2.21 0.96 4.65 0.51 0.03 dm-1 0.00 0.00 0.01 0.00 0.00 0.00 16.95 0.00 0.08 0.08 0.00 0.07 0.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 0.13 0.00 0.00 7.25 0.00 1.00 0.00 1.00 1.00 0.01 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 0.00 0.13 0.00 0.00 7.25 0.00 1.00 0.00 1.00 1.00 0.01 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.03 0.00 0.17 0.00 0.00 9.00 0.00 1.20 0.00 1.20 0.60 0.01 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 0.00 0.20 0.00 0.00 7.50 0.00 1.33 0.00 1.33 0.50 0.01 dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数说明
单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分: avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值; Device: 各磁盘设备的IO统计信息.
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并 wrqm/s: 每秒对该设备的写请求被合并次数 r/s: 每秒完成的读次数 w/s: 每秒完成的写次数 rkB/s: 每秒读数据量(kB为单位) wkB/s: 每秒写数据量(kB为单位) avgrq-sz:平均每次IO操作的数据量(扇区数为单位) avgqu-sz: 平均等待处理的IO请求队列长度 await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位) svctm: 平均每次IO请求的处理时间(毫秒为单位) %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
注意: iostat在Centos7系统中多了两个参数 r_await w_await
[root@zabbix-client-node1 ~]# iostat -dxkt Linux 3.10.0-327.el7.x86_64 (zabbix-client-node1) 09/22/2017 _x86_64_ (2 CPU) 09/22/2017 06:03:34 AM Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.03 0.45 0.20 14.71 1.90 51.63 0.00 1.62 0.88 3.28 0.50 0.03 scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.91 0.91 0.00 0.91 0.00 dm-0 0.00 0.00 0.40 0.21 14.14 1.72 51.92 0.00 2.20 0.96 4.60 0.51 0.03 dm-1 0.00 0.00 0.01 0.00 0.09 0.00 16.95 0.00 0.08 0.08 0.00 0.07 0.00
三、通过python脚本获取磁盘方法
[root@zabbix-client-node1]# cd /etc/zabbix/zabbix_agentd.d [root@zabbix-client-node1 zabbix_agentd.d]# vi disk_discovery.py #/usr/bin/python #This script is used to discovery disk on the server import subprocess import json args="cat /proc/diskstats |grep -E '\ssd[a-z]\s|\sxvd[a-z]\s|\svd[a-z]\s'|awk '{print $3}'|sort|uniq 2>/dev/null" t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0] disks=[] for disk in t.split('\n'): if len(disk) != 0: disks.append({'{#DISK_NAME}':disk}) print json.dumps({'data':disks},indent=4,separators=(',',':'))
运行结果:
[root@zabbix-client-node1 zabbix_agentd.d]# python disk_discovery.py { "data":[ { "{#DISK_NAME}":"sda" } ] }
四、zabbix 添加磁盘剩余容量监控方法
1、新建监控模板
Configuration--Templates--Create template
在Template name中输入disk space 50Gb 然后,保存即可。
2、新建Items
Name为The free disk space is less than 50Gb
key为:vfs.fs.size[/data,free]
保存即可
3、创建Triggers
Trigger的名字为The free disk space is less than 50Gb
Expression为{disk space 50Gb:vfs.fs.size[/data,free].last()}<50000000000
4、效果显示

五、zabbix自动发现监控磁盘(iops和读写量)
利用zabbix的自动发现把每个磁盘的iops监控起来
思路:自动发现所有的磁盘,然后监控各个磁盘的iops
解决思路:
1、自动发现列出所有磁盘
#在客户端上面操作(zabbix-client-node01)
#zabbix脚本存放路径
[root@zabbix-client-node1 ~]# mkdir /usr/local/zabbix
[root@zabbix-client-node1 ~]# cd /usr/local/zabbix/
[root@zabbix-client-node1 zabbix]# ll
total 8
-rwxr-xr-x 1 root root 1062 Sep 28 2017 check_disk.sh
-rwxr-xr-x 1 root root 460 Sep 28 2017 discover_disk.py
discover_disk.py
#coding:utf-8 try: import json except: import simplejson as json import commands (status, output) = commands.getstatusoutput('''cat /proc/diskstats |awk '{print $3}'|egrep 'sd|vd|hd'|egrep -v '[0-9]'|sort -u''') if output: outputs = output.split('\n') disks = [] for disk in outputs: disks += [{'{#DISKONE}': disk}] print json.dumps({'data':disks},sort_keys=True,indent=4) else: print 'discovery error'
#添加执行权限
[root@zabbix-client-node1 zabbix]# chmod a+x discover_disk.py [root@zabbix-client-node1 zabbix]# ll total 12 -rwxr-xr-x 1 root root 460 Sep 28 07:44 discover_disk.py
运行结果:
[root@zabbix-client-node1 zabbix]# python discover_disk.py { "data": [ { "{#DISKONE}": "sda" } ] }
2、监控每个磁盘的iops情况
vi check_disk.sh
#!/bin/sh # 8 0 sda 76880282531 8117316 937263519846 4237854729 62989000438 35668103347 777694636224 1190396494 3 2895102137 899093508 while getopts "d:o:" opt do case $opt in d ) disk=$OPTARG;; o ) option=$OPTARG;; ? ) echo 'parameter is wrong!' exit 1;; esac done if [ ! "${disk}" ] || [ ! "${option}" ];then echo "parameter is null" exit 1 fi if [[ ${option} == "read" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $6}' elif [[ ${option} == "write" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $10}' elif [[ ${option} == "readops" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $4}' elif [[ ${option} == "writeops" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $8}' elif [[ ${option} == "readtime" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $7}' elif [[ ${option} == "writetime" ]];then cat /proc/diskstats |grep "${disk} "|awk '{print $11}' fi
#添加执行权限
[root@zabbix-client-node1 zabbix]# chmod a+x check_disk.sh
[root@zabbix-client-node1 zabbix]# ll
total 16
-rwxr-xr-x 1 root root 1062 Sep 28 07:45 check_disk.sh
运行结果:(脚本是以传参的方式运行)
[root@zabbix-client-node1 zabbix]# sh check_disk.sh -d sda -o writeops 22040[root@zabbix-client-node1 zabbix]# sh check_disk.sh -d sda -o readops 6083
#在客户端上面操作(zabbix-client-node01)
[root@zabbix-client-node1 zabbix]# cd /etc/zabbix [root@zabbix-client-node1 zabbix]# ll total 24 -rw-r--r-- 1 root root 10354 Sep 24 01:23 zabbix_agentd.conf -rw-r--r-- 1 root root 11315 Sep 24 01:07 zabbix_agentd.conf.bak drwxr-xr-x 2 root root 80 Sep 24 02:43 zabbix_agentd.d
#把脚本加到zabbix-agent配置文件中
[root@zabbix-client-node1 zabbix]# vi zabbix_agentd.conf
### Option: UserParameter # User-defined parameter to monitor. There can be several user-defined parameters. # Format: UserParameter=<key>,<shell command> # See 'zabbix_agentd' directory for examples. # # Mandatory: no # Default: # UserParameter= UserParameter=disk.discover,python /usr/local/zabbix/discover_disk.py UserParameter=disk.status[*],sh /usr/local/zabbix/check_disk.sh -d $1 -o $2
#重启zabbix-agent和查看启动状态
[root@zabbix-client-node1 zabbix]# systemctl restart zabbix-agent [root@zabbix-client-node1 zabbix]# systemctl status zabbix-agent ● zabbix-agent.service - Zabbix Agent Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2017-09-24 02:47:32 CST; 11s ago Process: 3548 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS) Process: 3551 ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS) Main PID: 3553 (zabbix_agentd) CGroup: /system.slice/zabbix-agent.service ├─3553 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf ├─3554 /usr/sbin/zabbix_agentd: collector [idle 1 sec] ├─3555 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection] ├─3556 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection] ├─3557 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection] └─3558 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec] Sep 24 02:47:32 zabbix-client-node1 systemd[1]: Starting Zabbix Agent... Sep 24 02:47:32 zabbix-client-node1 systemd[1]: PID file /run/zabbix/zabbix_agentd.pid not readable (y...art. Sep 24 02:47:32 zabbix-client-node1 systemd[1]: Started Zabbix Agent.
#在服务端上面操作(zabbix-server)
#安装zabbix-get软件
[root@zabbix-server zabbix]# yum install zabbix-get
#获取客户端硬盘信息
[root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.discover { "data": [ { "{#DISKONE}": "sda" } ] }
#监控磁盘的结果如下
[root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.status[sda,readops] 5383 [root@zabbix-server zabbix]# zabbix_get -s 192.168.30.21 -k disk.status[sda,writeops] 3590
#以上都测试没问题就可以在zabbix的页面上添加自动发现规则了。可以新建个模板,发现规则截图如下:
选择模板--->直接导入模板:zbx_export_templates_discover_disk.xml

自动发现发现所有的磁盘,发现后就要项目原型进行监控磁盘的iops了 ,{#DISKONE}代表每个磁盘。监控的项目配置如下:

把自动发现模板应用到主机后,监控的项目如下:

最后,附上zabbix监控磁盘ipos的模板的链接:

浙公网安备 33010602011771号