Недавно понадобилось собрать информацию о характеристиках серверов в удаленных сайтах, а так как серверов несколько десятков, то потребовалась некоторая автоматизация процесса сбора данных. Для сбора данных с группы серверов я использовал скрипт 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}}