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

张映 发表于 2020-12-22

分类目录: 服务器相关

标签:, , ,

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

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

一,修改zabbix-agent2配置

[root@ticdc1 ~]# egrep -v "(^#|^$)" /etc/zabbix/zabbix_agent2.conf
PidFile=/var/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=10.0.10.11,127.0.0.1,10.0.10.15
UnsafeUserParameters=1 #允许自定义参数
ServerActive=10.0.10.11
Hostname=ticdc1
Include=/etc/zabbix/zabbix_agent2.d/*.conf
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权限

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

[root@ticdc1 ~]# echo 'zabbix ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

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

1,安装smartmontools

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

2,硬盘发现脚本

[root@ticdc1 ~]# cat /etc/zabbix/script/blk_discovery.py
#!/usr/bin/env python

# Discovery block device.
# Usage: ./blk_discovery {type}
#    type: ssd/hdd/all
# Example:
#   ./blk_discovery ssd
# Return Json:
#  {
#    "data": [
#            {
#               "{#DEV}": /dev/sda,
#               "{#DEVTYPE}": ssd
#             },
#            {
#               "{#DEV}": /dev/sdb,
#               "{#DEVTYPE}": ssd
#            }
#            ]
# }

import sys
import json
import commands

result = {}

blk_type = sys.argv[1]

def discovery_blk():
    result["data"] = []
    (status, output) = commands.getstatusoutput("lsscsi | grep 'disk' | awk '{ print $NF }'")
    if status != 0:
        return {}
    devs = output.split('\n')
    for dev in devs:
        disk = {}
        //不带raid卡的
        cmmd = "smartctl -i %s | grep 'Rotation Rate:' | awk -F':' '{ print $NF }'" % dev
        (status, output) = commands.getstatusoutput(cmmd)
        if status != 0:
            continue
        if len(output) == 0:   //带raid卡的
            cmmd = "smartctl -d megaraid,0 -i %s | grep 'Rotation Rate:' | awk -F':' '{ print $NF }'" % dev
            (status, output) = commands.getstatusoutput(cmmd)
            if status != 0:
                continue
        dev_type = output.strip().lower()
        if dev_type == "solid state device" and (blk_type == "ssd" or blk_type == "all"):
            disk["{#DEV}"] = dev
            if blk_type == "all":
                disk["{#DEVTYPE}"] = "ssd"
            else:
                disk["{#DEVTYPE}"] = blk_type
        if dev_type != "solid state device" and (blk_type == "hdd" or blk_type == "all"):
            disk["{#DEV}"] = dev
            if blk_type == "all":
                disk["{#DEVTYPE}"] = "hdd"
            else:
                disk["{#DEVTYPE}"] = blk_type
        if len(disk) != 0:
            result["data"].append(disk)
    print json.dumps(result, sort_keys=True, indent=2)

discovery_blk()

3,状态和ssd年限脚本

[root@ticdc1 ~]# cat /etc/zabbix/script/blk_parse.py
#!/usr/bin/env python

# Parse Block Device Status
# Usage: ./blk_parse.py {dev} {feature}
# Example:
# ssd endurance:
#   ./blk_parse.py /dev/sda endurance
# Return:
#   - 34  # Which means SSD has consumed 34% life
# ssd/hdd status:
#   ./blk_parse.py /dev/sda status
# Return:
#   - UP(1),
#   - Down(0)

import sys
import commands

key = sys.argv[1]
feature = sys.argv[2]

class BlkStatus():
    UP = 1
    Down = 0

def get_status(dev):
    cmmd = "smartctl -H %s | grep -i 'health' | awk '{ print $NF }'" % dev
    (status, output) = commands.getstatusoutput(cmmd)
    if status != 0:
        return ""

    if len(output) == 0:  //-d megaraid,0表示带raid卡,反之没有
        cmmd = "smartctl -d megaraid,0 -H %s | grep -i 'health' | awk '{ print $NF }'" % dev
        (status, output) = commands.getstatusoutput(cmmd)
        if status != 0:
            return ""
    status = output.strip().upper()
    if status == "OK" or status == "PASSED":
        return BlkStatus.UP
    return BlkStatus.Down

def get_endurance(dev):
    cmmd = "smartctl -l devstat  %s | grep 'Used Endurance' | awk '{ print $4 }'" % dev
    (status, output) = commands.getstatusoutput(cmmd)
    if status != 0:
        return ""

    if len(output) == 0: //-d megaraid,0表示带raid卡,反之没有
        cmmd = "smartctl -d megaraid,0 -l devstat  %s | grep 'Used Endurance' | awk '{ print $4 }'" % dev
        (status, output) = commands.getstatusoutput(cmmd)
        if status != 0:
            return ""
    return int(output)

def blk_parse():
    result = ""
    if feature == "endurance":
        result = get_endurance(key)
    elif feature == "status":
        result = get_status(key)
    else:
        pass
    print result

blk_parse()

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

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

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

[root@ticdc1 ~]# chmod +x /etc/zabbix/script/blk_*

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

5,测试自定义的python脚本

//发现硬盘
[root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk_discovery[ssd]"
{
  "data": [
    {
      "{#DEVTYPE}": "ssd",
      "{#DEV}": "/dev/sda"
    }
  ]
}

//硬盘状态
[root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk.status[/dev/sda,status]"
1

//ssd年限预估
[root@ticdc1 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k "blk.status[/dev/sda,endurance]"
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

相关文章

    • 暂无相关日志