背景

IT团队物理服务器基本都是windows系统,所以之前Raid监控的脚本也是powershell写的。最近有几台Linux物理服务器上线了,也需要对Raid信息进行监控。 因此用python写了下。

基础介绍

脚本有5个。每个脚本功能如下:

  • storcli_pdisk_discovery.py
#!/usr/bin/python3
#------Get Physical Disk List ------#
#author:shizhenning
#version:20240822v1
import os
import json

def get_pdisk():
    pdisk_json = {"data": []}
    datasource  = os.popen("/opt/MegaRAID/storcli/storcli64 /c0 show J")
    datasource = datasource.read()
    data_json  = json.loads(datasource)
    data_temp = data_json["Controllers"][0]["Response Data"]["PD LIST"]
    for i in data_temp:
        eid = i['EID:Slt']
        pdisk_json["data"].append({"{#PDISK}": eid})

    push_pdisk = json.dumps(pdisk_json)
    print(push_pdisk)

if __name__ == '__main__':
    get_pdisk()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

获取物理磁盘列表:

[root@host01 scripts]# python3 storcli_pdisk_discovery.py
{"data": [{"{#PDISK}": "252:0"}, {"{#PDISK}": "252:1"}, {"{#PDISK}": "252:2"}, {"{#PDISK}": "252:3"}, {"{#PDISK}": "252:4"}, {"{#PDISK}": "252:5"}]}
  • 1.
  • 2.
  • storcli_pdisk_info.py
#!/usr/bin/python3
#------Get Physical Disk Info ------#
#author:shizhenning
#version:20240822v1
import os
import json
import sys

eid,sid = sys.argv[1].split(':')
disk_attr = sys.argv[2]

def get_diskinfo(eid_para,sid_para):
    datasource  = os.popen("/opt/MegaRAID/storcli/storcli64 /c0 /e %s /s %s show J" %(eid_para,sid_para))
    datasource = datasource.read()
    data_json  = json.loads(datasource)
    attr_dict = data_json["Controllers"][0]['Response Data']['Drive Information'][0]
    disk_info = attr_dict[disk_attr]
    print(disk_info.strip())

if __name__ == "__main__":
    get_diskinfo(eid,sid)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

获取指定磁盘的特定属性

[root@host01 scripts]# python3 storcli_pdisk_info.py  252:0 State
Onln
[root@host01 scripts]# python3 storcli_pdisk_info.py  252:0 Size
893.75 GB
[root@host01 scripts]# python3 storcli_pdisk_info.py  252:0 Model
SAMSUNG MZ7LH960HAJR-00005
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

支持的属性包括: “EID:Slt”、“DID”、“State”、“Size”、“Intf”、“Med”、"Model"等。如结果中展示

[root@host01 scripts]# /opt/MegaRAID/storcli/storcli64 /c0 /e252 /s1 show J
{
"Controllers":[
{
	"Command Status" : {
		"Controller" : 0,
		"Status" : "Success",
		"Description" : "Show Drive Information Succeeded."
	},
	"Response Data" : {
		"Drive Information" : [
			{
				"EID:Slt" : "252:1",
				"DID" : 9,
				"State" : "Onln",
				"DG" : 0,
				"Size" : "893.75 GB",
				"Intf" : "SATA",
				"Med" : "SSD",
				"SED" : "N",
				"PI" : "N",
				"SeSz" : "512B",
				"Model" : "SAMSUNG MZ7LH960HAJR-00005",
				"Sp" : "U"
			}
		]
	}
}
]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • storcli_vdisk_discovery.py
#!/usr/bin/python3
#------Get Virtual Disk List ------#
#author: shizhenning
#version:20240822v1
import os
import json

def get_vdisk():
    vdisk_json = {"data": []}
    datasource  = os.popen("/opt/MegaRAID/storcli/storcli64 /c0 show J")
    datasource = datasource.read()
    data_json  = json.loads(datasource)
    data_temp = data_json["Controllers"][0]['Response Data']['VD LIST']
    for i in data_temp:
        vid = i['DG/VD']
        vdisk_json["data"].append({"{#VDISK}": vid})
    push_vdisk = json.dumps(vdisk_json)
    print(push_vdisk)

if __name__ == '__main__':
    get_vdisk()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

用来获取虚拟磁盘列表:

[root@host01 scripts]# python3 storcli_vdisk_discovery.py
{"data": [{"{#VDISK}": "0/0"}, {"{#VDISK}": "1/1"}]}
  • 1.
  • 2.
  • storcli_vdisk_info.py
#!/usr/bin/python3
#------Get VirtualDisk Info ------#
#author:shizhenning
#version:20240822v1
import os
import json
import sys

vid = sys.argv[1].split('/')[-1]
disk_attr = sys.argv[2]

def get_vdiskinfo(para):
    datasource  = os.popen("/opt/MegaRAID/storcli/storcli64 /c0 /v %s  show J" %para)
    datasource = datasource.read()
    data_json  = json.loads(datasource)
    attr_dict = data_json["Controllers"][0]["Response Data"]["Virtual Drives"][0]
    disk_info = attr_dict[disk_attr]
    print(disk_info.strip())

if __name__ == "__main__":
    get_vdiskinfo(vid)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

获取指定的虚拟磁盘的特定属性:

[root@host01 scripts]# python3 storcli_vdisk_info.py 1/1 State
Optl
[root@host01 scripts]# python3 storcli_vdisk_info.py 1/1 Size
1.745 TB
  • 1.
  • 2.
  • 3.
  • 4.
  • storcli_raidcard_info.py
#!/usr/bin/python3
#------ Get Raid Card Model AND Name------#
import os
import json

datasource  = os.popen("/opt/MegaRAID/storcli/storcli64 /c0 show J")
datasource = datasource.read()
data_json  = json.loads(datasource)
data_temp =  data_json["Controllers"][0]
card_model = data_temp['Response Data']['Product Name']
card_sn = data_temp['Response Data']['Serial Number']
print('"'+card_model+'"')
print(card_sn)
os.system("/bin/zabbix_sender -z zabbix-proxy.example.com -p 10051 -s host01.example.com -v -k raid_card_model -o '%s'"  %card_model)
os.system("/bin/zabbix_sender -z zabbix-proxy.example.com -p 10051 -s host01.example.com -v -k raid_card_sn -o '%s'"  %card_sn)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

获取raid卡硬件信息,型号和SN,并通过zabbix_sender到 proxy或server。

配置

  • Storcli安装
wget https://mirror.nforce.com/pub/software/raidtools/storcli/storcli-1.19.04-1.noarch.rpm
rpm -ivh storcli/storcli-1.19.04-1.noarch.rpm
  • 1.
  • 2.
  • zabbix_sender安装,操作系统版本 Rocky Linux release 8.8
yum install compat-openssl10 -y
wget  https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-sender-4.4.10-1.el7.x86_64.rpm
rpm -ivh zabbix-sender-4.4.10-1.el7.x86_64.rpm
  • 1.
  • 2.
  • 3.
  • 脚本路径
mkdir /etc/zabbix/scripts 
  • 1.

将5个python脚本下载到该路径下。

  • 修改配置文件zabbix_agentd.conf 增加配置:
UserParameter=Storcli.PDisk.discovery, /usr/bin/python3 /etc/zabbix/scripts/storcli_pdisk_discovery.py
UserParameter=Storcli.PDisk.info[*], /usr/bin/python3 /etc/zabbix/scripts/storcli_pdisk_info.py $1 $2
UserParameter=Storcli.VDisk.discovery, /usr/bin/python3 /etc/zabbix/scripts/storcli_vdisk_discovery.py
UserParameter=Storcli.VDisk.info[*], /usr/bin/python3 /etc/zabbix/scripts/storcli_vdisk_info.py $1 $2
  • 1.
  • 2.
  • 3.
  • 4.
  • zabbix web端创建模板

discovery rule:

Python 实现Linux Raid信息监控_python

物理磁盘item prototype:
Python 实现Linux Raid信息监控_python_02

物理磁盘trigger prototype:
Python 实现Linux Raid信息监控_python_03

虚拟磁盘item prototype:
Python 实现Linux Raid信息监控_zabbix_04

虚拟磁盘trigger prototype:
Python 实现Linux Raid信息监控_raid_05

模板创建item, item type 使用 zabbix-trapper:
Python 实现Linux Raid信息监控_zabbix_06

效果展示
  • 物理磁盘
    Python 实现Linux Raid信息监控_python_07
    Python 实现Linux Raid信息监控_raid_08

  • 虚拟磁盘
    Python 实现Linux Raid信息监控_raid_09