背景
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()
获取物理磁盘列表:
[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"}]}
- 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)
获取指定磁盘的特定属性
[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
支持的属性包括: "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"
}
]
}
}
]
}
- 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()
用来获取虚拟磁盘列表:
[root@host01 scripts]# python3 storcli_vdisk_discovery.py
{"data": [{"{#VDISK}": "0/0"}, {"{#VDISK}": "1/1"}]}
- 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)
获取指定的虚拟磁盘的特定属性:
[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
- 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)
获取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
- 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
- 脚本路径
mkdir /etc/zabbix/scripts
将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
- zabbix web端创建模板
discovery rule:
物理磁盘item prototype:
物理磁盘trigger prototype:
虚拟磁盘item prototype:
虚拟磁盘trigger prototype:
模板创建item, item type 使用 zabbix-trapper:
效果展示
-
物理磁盘
-
虚拟磁盘