背景
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.
获取物理磁盘列表:
- 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.
获取指定磁盘的特定属性
支持的属性包括: “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.
用来获取虚拟磁盘列表:
- 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.
获取指定的虚拟磁盘的特定属性:
- 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安装
- zabbix_sender安装,操作系统版本 Rocky Linux release 8.8
- 脚本路径
将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:
物理磁盘item prototype:
物理磁盘trigger prototype:
虚拟磁盘item prototype:
虚拟磁盘trigger prototype:
模板创建item, item type 使用 zabbix-trapper:
效果展示
-
物理磁盘
-
虚拟磁盘