背景


之前办公区服务器都是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


执行结果: image.png

虚拟磁盘发现脚本: 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


执行结果: image.png

  • 磁盘信息脚本

物理磁盘信息: 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 

测试执行结果: image.png

虚拟磁盘信息: 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

测试执行结果: image.png

Zabbix 模板配置

  • 创建模板名称 IT_StorcliRAID_Template
  • 创建磁盘discovery规则

image.png

image.png image.png

  • 创建物理磁盘item image.png

image.png

  • 创建虚拟磁盘item

image.png

image.png

绑定模板,观察效果

image.png image.png

image.png

image.png

最后,确定没问题后,在模板中创建好trigger。 image.png