zabbix 自动发现 监控ssd状态及年限

张映 发表于 2020-12-22

分类目录: 服务器相关

标签:, , ,

zabbix能监控到的硬盘信息,其实很多了。但是监控ssd的状态,以及预估使用年限方面是没有的。

zabbix监控支持自定义脚本以及自制模板来扩展监控,这里的脚本既可以用shell也可以用python、php等语言,另外自定义了脚本主要目的是获取业务相关的监控数据,还需要结合zabbix web GUI上的模板才能生效,通过自定义程序脚本后,zabbix监控的灵活度,会高很多。

一,修改zabbix-agent2配置

  1. [root@ticdc1 ~]# egrep -v "(^#|^$)" /etc/zabbix/zabbix_agent2.conf  
  2. PidFile=/var/run/zabbix/zabbix_agent2.pid  
  3. LogFile=/var/log/zabbix/zabbix_agent2.log  
  4. LogFileSize=0  
  5. Server=10.0.10.11,127.0.0.1,10.0.10.15  
  6. UnsafeUserParameters=1 #允许自定义参数  
  7. ServerActive=10.0.10.11  
  8. Hostname=ticdc1  
  9. Include=/etc/zabbix/zabbix_agent2.d/*.conf  
  10. ControlSocket=/tmp/agent.sock  

在这里要注意一下,Server=10.0.10.11,127.0.0.1,10.0.10.15,有三个IP。10.0.10.11这个zabbix服务端IP,剩下二个本地和本机对应的局域网IP。加后面二个IP,是为了在本机能检验zabbix的配置。

如果不加,会报以下错

[root@tikv1 script]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk.status[/dev/sda,status]"
zabbix_get [36161]: Get value error: ZBX_TCP_READ() failed: [104] Connection reset by peer

怎么安装zabbix,请参考:centos7 zabbix5 nginx 安装

二,zabbix账户,免密获取root权限

  1. [root@ticdc1 ~]# ps aux |grep zabbix  
  2. zabbix 37381 0.3 0.0 2722340 19468 ? Ssl 12月21 4:02 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf  
  3. root 43549 0.0 0.0 112680 976 pts/2 S+ 16:21 0:00 grep --color=auto zabbix  
  4.   
  5. [root@ticdc1 ~]# echo 'zabbix ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers  

三,创建python脚本(网上找的脚本改了改)

1,安装smartmontools

  1. [root@ticdc1 ~]# yum -y install smartmontools  

2,硬盘发现脚本

  1. [root@ticdc1 ~]# cat /etc/zabbix/script/blk_discovery.py  
  2. #!/usr/bin/env python  
  3.   
  4. # Discovery block device.  
  5. # Usage: ./blk_discovery {type}  
  6. #    type: ssd/hdd/all  
  7. # Example:  
  8. #   ./blk_discovery ssd  
  9. # Return Json:  
  10. #  {  
  11. #    "data": [  
  12. #            {  
  13. #               "{#DEV}": /dev/sda,  
  14. #               "{#DEVTYPE}": ssd  
  15. #             },  
  16. #            {  
  17. #               "{#DEV}": /dev/sdb,  
  18. #               "{#DEVTYPE}": ssd  
  19. #            }  
  20. #            ]  
  21. # }  
  22.   
  23. import sys  
  24. import json  
  25. import commands  
  26.   
  27. result = {}  
  28.   
  29. blk_type = sys.argv[1]  
  30.   
  31. def discovery_blk():  
  32.     result["data"] = []  
  33.     (status, output) = commands.getstatusoutput("lsscsi | grep 'disk' | awk '{ print $NF }'")  
  34.     if status != 0:  
  35.         return {}  
  36.     devs = output.split('\n')  
  37.     for dev in devs:  
  38.         disk = {}  
  39.         //不带raid卡的  
  40.         cmmd = "smartctl -i %s | grep 'Rotation Rate:' | awk -F':' '{ print $NF }'" % dev  
  41.         (status, output) = commands.getstatusoutput(cmmd)  
  42.         if status != 0:  
  43.             continue  
  44.         if len(output) == 0:   //带raid卡的  
  45.             cmmd = "smartctl -d megaraid,0 -i %s | grep 'Rotation Rate:' | awk -F':' '{ print $NF }'" % dev  
  46.             (status, output) = commands.getstatusoutput(cmmd)  
  47.             if status != 0:  
  48.                 continue  
  49.         dev_type = output.strip().lower()  
  50.         if dev_type == "solid state device" and (blk_type == "ssd" or blk_type == "all"):  
  51.             disk["{#DEV}"] = dev  
  52.             if blk_type == "all":  
  53.                 disk["{#DEVTYPE}"] = "ssd"  
  54.             else:  
  55.                 disk["{#DEVTYPE}"] = blk_type  
  56.         if dev_type != "solid state device" and (blk_type == "hdd" or blk_type == "all"):  
  57.             disk["{#DEV}"] = dev  
  58.             if blk_type == "all":  
  59.                 disk["{#DEVTYPE}"] = "hdd"  
  60.             else:  
  61.                 disk["{#DEVTYPE}"] = blk_type  
  62.         if len(disk) != 0:  
  63.             result["data"].append(disk)  
  64.     print json.dumps(result, sort_keys=True, indent=2)  
  65.   
  66. discovery_blk()  

3,状态和ssd年限脚本

  1. [root@ticdc1 ~]# cat /etc/zabbix/script/blk_parse.py  
  2. #!/usr/bin/env python  
  3.   
  4. # Parse Block Device Status  
  5. # Usage: ./blk_parse.py {dev} {feature}  
  6. # Example:  
  7. # ssd endurance:  
  8. #   ./blk_parse.py /dev/sda endurance  
  9. # Return:  
  10. #   - 34  # Which means SSD has consumed 34% life  
  11. # ssd/hdd status:  
  12. #   ./blk_parse.py /dev/sda status  
  13. # Return:  
  14. #   - UP(1),  
  15. #   - Down(0)  
  16.   
  17. import sys  
  18. import commands  
  19.   
  20. key = sys.argv[1]  
  21. feature = sys.argv[2]  
  22.   
  23. class BlkStatus():  
  24.     UP = 1  
  25.     Down = 0  
  26.   
  27. def get_status(dev):  
  28.     cmmd = "smartctl -H %s | grep -i 'health' | awk '{ print $NF }'" % dev  
  29.     (status, output) = commands.getstatusoutput(cmmd)  
  30.     if status != 0:  
  31.         return ""  
  32.   
  33.     if len(output) == 0:  //-d megaraid,0表示带raid卡,反之没有  
  34.         cmmd = "smartctl -d megaraid,0 -H %s | grep -i 'health' | awk '{ print $NF }'" % dev  
  35.         (status, output) = commands.getstatusoutput(cmmd)  
  36.         if status != 0:  
  37.             return ""  
  38.     status = output.strip().upper()  
  39.     if status == "OK" or status == "PASSED":  
  40.         return BlkStatus.UP  
  41.     return BlkStatus.Down  
  42.   
  43. def get_endurance(dev):  
  44.     cmmd = "smartctl -l devstat  %s | grep 'Used Endurance' | awk '{ print $4 }'" % dev  
  45.     (status, output) = commands.getstatusoutput(cmmd)  
  46.     if status != 0:  
  47.         return ""  
  48.   
  49.     if len(output) == 0: //-d megaraid,0表示带raid卡,反之没有  
  50.         cmmd = "smartctl -d megaraid,0 -l devstat  %s | grep 'Used Endurance' | awk '{ print $4 }'" % dev  
  51.         (status, output) = commands.getstatusoutput(cmmd)  
  52.         if status != 0:  
  53.             return ""  
  54.     return int(output)  
  55.   
  56. def blk_parse():  
  57.     result = ""  
  58.     if feature == "endurance":  
  59.         result = get_endurance(key)  
  60.     elif feature == "status":  
  61.         result = get_status(key)  
  62.     else:  
  63.         pass  
  64.     print result  
  65.   
  66. blk_parse()  

注意:该脚本是跑在python2下,python3要自己改一下,因为python3没有commands。

4,配置zabbix-agent2自定义脚本

  1. [root@ticdc1 ~]# cat /etc/zabbix/zabbix_agent2.d/blk-status.conf  
  2. UserParameter=blk_discovery[*],sudo /etc/zabbix/script/blk_discovery.py $1  
  3. UserParameter=blk.status[*],sudo /etc/zabbix/script/blk_parse.py $1 $2  
  4. UserParameter=blk.hdd.status[*],sudo /etc/zabbix/script/blk_parse.py $1 "status"  
  5.   
  6. [root@ticdc1 ~]# chmod +x /etc/zabbix/script/blk_*  

注意:上面的*表示参数,可单个,可多个,后面会提到

5,测试自定义的python脚本

  1. //发现硬盘  
  2. [root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk_discovery[ssd]"  
  3. {  
  4.   "data": [  
  5.     {  
  6.       "{#DEVTYPE}""ssd",  
  7.       "{#DEV}""/dev/sda"  
  8.     }  
  9.   ]  
  10. }  
  11.   
  12. //硬盘状态  
  13. [root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk.status[/dev/sda,status]"  
  14. 1  
  15.   
  16. //ssd年限预估  
  17. [root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk.status[/dev/sda,endurance]"  
  18. 0  

如果有数据,那说明客户端配置没有问题了,剩下的就是和服务端整合了

四,zabbix管理后台配置

1,自定议脚本

左侧菜单=》配置=》模板=》创建模板

2,创建自动发现规则

zabbix 添加自动发现规则

zabbix 添加自动发现规则

zabbix 添加自动发现规则列表

zabbix 添加自动发现规则列表

hdd和ssd自动发现的区别,只是参数问题

3,添加sdd和hdd监控项原型

zabbix 添加监控项原型

zabbix 添加监控项原型

zabbix 添加监控项原型列表

zabbix 添加监控项原型列表

自动发现里面的监控项原型和模板里面监控项,是不一样的

4,添加触发器原型

zabbix 添加触发器原型1

zabbix 添加触发器原型1

zabbix 添加触发器原型2

zabbix 添加触发器原型2

zabbix 添加触发器原型3

zabbix 添加触发器原型3

zabbix 添加触发器原型列表

zabbix 添加触发器原型列表

自动发现里面的触发器原型和模板里面触发器,是不一样的

5,添加图形原型

zabbix 自动发现添加图形原型

zabbix 自动发现添加图形原型

6,将新增的模板加入主机

zabbix 主机绑定新的模板

zabbix 主机绑定新的模板

7,查看自动发现结果

zabbix 自动发现最新数据

zabbix 自动发现最新数据

zabbix 自动发现图形

zabbix 自动发现图形



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/server/2453.html

相关文章

    • 暂无相关日志