背景
之前办公区服务器都是Windows Server 2012R2, 2016和2019。伴随着2012R2生命周期结束,将2012R2全部升级到了2022。 一直以来,宿主机的Raid监控是通过Megacli来实现的。升级到2022之后,偶然发现Raid信息监控失效了。通过测试Megacli工具获取不到Raid信息了。 经查询,原来Megacli已经不支持Windows Server 2022了。博通收购LSI之后,发布了新的工具,Storcli。
https://www.broadcom.com/support/knowledgebase/1211161499760/lsi-command-line-interface-cross-reference-megacli-vs-twcli-vs-s
需求
通过Storcli工具实现Raid信息监控。
思路
延续megacli监控的实现方式,主要包括以下步骤。
- powershell发现物理磁盘和虚拟磁盘,以及相关属性信息。
- zabbix userparameter中定义key,并调用脚本。
- zabbix中创建discovery模板、监控项和触发器。
实现监控
Storcli 参数部分
核心参数有4个,/c、 /e、 /s、/v 。
/c: Controller,即RAID控制。通常服务器只有一个,用/c0表示。 /e: Enclousure,服务器外壳,我这边的都是32,用/e32表示。 /s: Slot,磁盘位,比如/s0,/s1,/s3 /v:VitualDisk,指虚拟磁盘,如/v0,/v1
其他有用参数:
j: json格式 nolog:不生成日志
实例:
- 显示/c0 /e32 /s3磁盘信息
C:\Program Files\MegaCli\storcli64.exe /c0 /e32 /s3 show nolog
CLI Version = 007.2508.0000.0000 Feb 27, 2023
Operating system = Windows Server 2022
Controller = 0
Status = Success
Description = Show Drive Information Succeeded.
Drive Information :
=================
-------------------------------------------------------------------------------
EID:Slt DID State DG Size Intf Med SED PI SeSz Model Sp Type
-------------------------------------------------------------------------------
32:3 3 Onln 1 7.276 TB SATA HDD N N 512B ST8000NM0205-2FF112 U -
-------------------------------------------------------------------------------
- 看看json格式:
C:\Program Files\MegaCli\storcli64.exe /c0 /e32 /sall show nolog j
{
"Controllers":[
{
"Command Status" : {
"CLI Version" : "007.2508.0000.0000 Feb 27, 2023",
"Operating system" : "Windows Server 2022",
"Controller" : 0,
"Status" : "Success",
"Description" : "Show Drive Information Succeeded."
},
"Response Data" : {
"Drive Information" : [
{
"EID:Slt" : "32:3",
"DID" : 3,
"State" : "Onln",
"DG" : 1,
"Size" : "7.276 TB",
"Intf" : "SATA",
"Med" : "HDD",
"SED" : "N",
"PI" : "N",
"SeSz" : "512B",
"Model" : "ST8000NM0205-2FF112",
"Sp" : "U",
"Type" : "-"
}
]
}
}
]
}
- 查看虚拟磁盘
C:\Program Files\MegaCli\storcli64.exe /c0 /vall show nolog
CLI Version = 007.2508.0000.0000 Feb 27, 2023
Operating system = Windows Server 2022
Controller = 0
Status = Success
Description = None
Virtual Drives :
==============
----------------------------------------------------------------
DG/VD TYPE State Access Consist Cache Cac sCC Size Name
----------------------------------------------------------------
0/0 RAID1 Optl RW No RWBD - OFF 278.875 GB
1/1 RAID10 Optl RW Yes RWBD - OFF 43.661 TB
----------------------------------------------------------------
- 磁盘状态值
UGood(Unconfigured Good,未配置正常):硬盘状态正常,但还未划分给任何逻辑卷; UBad(Unconfigured Bad,未配置异常):UGood状态的硬盘出现无法恢复的错误; Onln(Online,在线):已经设置为某个虚拟硬盘的成员盘,并且处于在线正常可用状态; Offln(Offline,离线):某个虚拟硬盘的成员盘离线; Missing,Online状态的硬盘脱离RAID组的状态; Rbld(Rebuild,重建):硬盘正在重建数据。
Powershell脚本部分
脚本部分是核心,脚本搞不定,什么都白费。 脚本分成两部分,一部分是自动发现,唯一的功能是用来发现物理磁盘和虚拟磁盘。 一部分是信息获取,用来获取自动发现的物理或虚拟磁盘的属性信息。
- 自动发现脚本
物理磁盘发现脚本 Storcli_PhysicalDisk_Discovery.ps1
#author:shizhenning
#----20230921V001----#
$Path_tool = "C:\Program Files\MegaCli\"
cd $Path_tool
$Count_Physical_Disk = (.\storcli64.exe /c0 show |findstr "^Physical" | Out-String).Split("=")[-1] #获取物理磁盘总数量
$PDisk_Discovery = .\storcli64.exe /c0 show J nolog
$Data_Source = $PDisk_Discovery | ConvertFrom-Json #json转换成自定义对象
$Raid_Info = $Data_Source.Controllers[0]
$Location_Physical_Disk = $Raid_Info.'Response Data'.'PD LIST'.'EID:Slt' #获取物理磁盘位置,形如32:0,32:1,32:2
### 构造json格式
$VAR1="{"
$VAR2='"data": ['
$VAR3='"{#PDISK}":'
$VAR4="]"
$VAR5="}"
$VAR6="},"
Write-Output $VAR1
Write-Output " $VAR2"
ForEach($i in $Location_Physical_Disk)
{
Write-Output " $VAR1"
Write-Output " $VAR3 `"$i`""
if ($i -eq $Location_Physical_Disk[-1])
{
Write-Output " $VAR5"
}
else
{
Write-Output " $VAR6"
}
}
Write-Output " $VAR4"
Write-Output $VAR5
执行结果:
虚拟磁盘发现脚本: Storcli_VDisk_Discovery.ps1
#author:shizhenning
#----20231009V003----#
$Path_tool = "C:\Program Files\MegaCli\"
cd $Path_tool
$Count_Physical_Disk = (.\storcli64.exe /c0 show |findstr "^Virtual" | Out-String).Split("=")[-1] #获取虚拟磁盘总数量
$VDisk_Discovery = .\storcli64.exe /c0 show J nolog
$Data_Source = $VDisk_Discovery | ConvertFrom-Json #json转换成复的自定义对象
$Raid_Info = $Data_Source.Controllers[0]
$Number_VDisk = $Raid_Info.'Response Data'.'VD LIST'.'DG/VD' #获取虚拟磁盘名称,形如0/0,1/1
### 构造json格式
$VAR1="{"
$VAR2='"data": ['
$VAR3='"{#VDISK}":'
$VAR4="]"
$VAR5="}"
$VAR6="},"
Write-Output $VAR1
Write-Output " $VAR2"
if ($Number_VDisk -is "System.Array") {
ForEach($i in $Number_VDisk){
Write-Output " $VAR1"
Write-Output " $VAR3 `"$i`""
if ($i -eq $Number_VDisk[-1])
{
Write-Output " $VAR5"
}
else
{
Write-Output " $VAR6"
}
}
}
else
{
Write-Output " $VAR1"
Write-Output " $VAR3 `"$Number_VDisk`""
Write-Output " $VAR5"
}
Write-Output " $VAR4"
Write-Output $VAR5
执行结果:
- 磁盘信息脚本
物理磁盘信息: Storcli_PhysicalDisk_Info.ps1
#author:shizhenning
#----20231010V004----#
$Path_tool = "C:\Program Files\MegaCli\"
cd $Path_tool
$Location_Physical_Disk = $args[0] #参数格式[32:6],即磁盘盘位
$Attr_PDisk = $args[1] #参数选项 State, Size ,Interface(SAS\SATA),Model,
$Number_Enclousure = $Location_Physical_Disk.split(":")[0].Split("[")[-1] #获取Enclousure ID,比如32
$DID_Physical_Disk = $Location_Physical_Disk.split(":")[1].Split("]")[0] #从形如[32:2]格式的盘位获取磁盘ID 2,供storcli /s调用
$PDAttr_info = .\storcli64.exe /c0 /e $Number_Enclousure /s $DID_Physical_Disk show NOLOG J
$Attr_Source = $PDAttr_info | ConvertFrom-Json #获取磁盘属性列表,比如State, Size ,Interface(SAS\SATA),Model等
Write-Output $Attr_Source.Controllers[0].'Response Data'.'Drive Information'.$Attr_PDisk
测试执行结果:
虚拟磁盘信息: Storcli_VDisk_Info.ps1
#author:shizhenning
#----20230921V001----#
$Path_tool = "C:\Program Files\MegaCli\"
cd $Path_tool
$No_VDisk = $args[0] #参数为获取虚拟磁盘名称,形如0/0,1/1
$No_VDisk = $No_VDisk.split("/")[-1]
$Attr_VDisk_Query = $args[1] #参数选项name,size,type,state,cache,scc等
$Attr_VDisk = .\storcli64.exe /c0 /v$No_VDisk show J NOLOG
$Attr_Source = $Attr_VDisk | ConvertFrom-Json #获取虚拟磁盘属性列表,比如name,size,type,state,cache,scc等
Write-Output $Attr_Source.Controllers[0].'Response Data'.'Virtual Drives'.$Attr_VDisk_Query
测试执行结果:
Zabbix 模板配置
- 创建模板名称 IT_StorcliRAID_Template
- 创建磁盘discovery规则
- 创建物理磁盘item
- 创建虚拟磁盘item
绑定模板,观察效果
最后,确定没问题后,在模板中创建好trigger。