玖叶教程网

前端编程开发入门

Powershell 实现服务器Raid信息监控

背景


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



  • 绑定模板,观察效果



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


发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言