Недавно понадобилось собрать информацию о характеристиках серверов в удаленных сайтах, а так как серверов несколько десятков, то потребовалась некоторая автоматизация процесса сбора данных. Для сбора данных с группы серверов я использовал скрипт PowerShell, который представлен ниже.
# Функция сбора параметров с сервера
Function GetComputerInfo ($ComputerName)
{
$ComputerProperties = New-Object System.Object
$ComputerProperties | add-member -membertype noteproperty -name Name -Value $ComputerName
$P = Get-WmiObject -class "Win32_ComputerSystem" -computername $ComputerName | `
Select Model, @{Label="TotalPhysicalMemory";Expression={[Math]::Round($_.TotalPhysicalMemory `
/ 1024 / 1024 / 1024)}}
$ComputerProperties | Add-Member -MemberType NoteProperty -Name Model -Value $Null
$ComputerProperties.Model = $P.Model
$ComputerProperties | Add-Member -MemberType NoteProperty -Name RAMSize -Value $Null
$ComputerProperties.RAMSize = $P.TotalPhysicalMemory
$P = Get-WmiObject -class "Win32_SystemEnclosure" -computername $ComputerName | select SerialNumber
$ComputerProperties | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $Null
$ComputerProperties.SerialNumber = $P.SerialNumber
$P = Test-Connection -ComputerName $ComputerName -Count 1 | select IPV4Address
$ComputerProperties | Add-Member -MemberType NoteProperty -Name IPV4Address -Value $Null
$ComputerProperties.IPV4Address = $P.IPV4Address
$P = Get-WmiObject -class "Win32_Processor" -computername $ComputerName | `
Select Name, CurrentClockSpeed
$ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUName -Value $Null
$ComputerProperties.CPUName = $P[0].Name
$ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUCores -Value $Null
$ComputerProperties.CPUCores = ($P | Measure-Object).Count
$ComputerProperties | Add-Member -MemberType NoteProperty -Name CPUClockSpeed -Value $Null
$ComputerProperties.CPUClockSpeed = $P[0].CurrentClockSpeed
$P = Get-WmiObject -class "Win32_DiskDrive" -computername $ComputerName | `
Select @{Label="HDDModel";Expression={$_.Model}}, `
@{Label="HDDInterfaceType";Expression={$_.InterfaceType}}, `
@{Label="HDDSize";Expression={[Math]::Round($_.Size / 1024 / 1024 / 1024)}}, `
@{Label="HDDPartitions";Expression={$_.Partitions}}
$ComputerProperties | Add-Member -MemberType NoteProperty -Name HDD -Value $Null
$ComputerProperties.HDD = $P
$ComputerProperties
}
# Тело скрипта
$ErrorActionPreference = "Continue"
$Servers = Import-Csv Servers.csv
$Servers | Sort name | Where-Object {Test-Connection -Count 2 -ComputerName $_.Name `
-ErrorAction SilentlyContinue} | ForEach-Object { GetComputerInfo $_.name }
Этот скрипт использует в качестве входных данных файл CSV, в котором перечислены имена серверов, с которых требуется собрать данные.
Листинг файла Servers.csv:
Name Server1 Server2 Server3 Server4
На выходе скрипта получается список табличек по каждому серверу, в которых указаны следующие параметры: имя сервера, модель сервера, размер ОЗУ в ГБ, серийный номер сервера, IP адрес сервера, тип процессора, количество ядер процессора, такторая частота процессора, информация по жестким дискам.
Например:
Name : Server1
Model : ProLiant ML370 G4
RAMSize : 2
SerialNumber : GB850964TF
IPV4Address : 172.31.17.1
CPUName : Intel(R) Xeon(TM) CPU 3.60GHz
CPUCores : 2
CPUClockSpeed : 3600
HDD : {@{HDDModel=HP LOGICAL VOLUME SCSI Disk Device; HDDInterfaceType=SCSI;
HDDSize=34; HDDPartitions=4}, @{HDDModel=HP LOGICAL VOLUME SCSI Disk
Device; HDDInterfaceType=SCSI; HDDSize=203; HDDPartitions=1}}
