четверг, 13 сентября 2018 г.

VMWare ESXi Inventory with PowerShell 1

# VMWare ESXi Inventory with PowerShell

===START===
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore  -Confirm:$false
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$false
Connect-VIServer -User maniak@fignya.net -Password P@ssword vCenter.fignya.net

$AllWMHosts = (Get-VMHost).name
$Output = New-Object System.Collections.ArrayList
foreach ($WMHost in $AllWMHosts) {
    $WMHost
    $TCFound = $true

    Try { Test-Connection -ComputerName $WMHOST -Count 1 -ErrorAction Stop }
    Catch { $TCFound = $false }

    if ($TCFound) {
    $IPTC = Test-Connection -ComputerName $WMHOST -Count 1 | Select-Object Address,IPV4Address
    $PingResult = "UP"
    $IPV4 = $IPTC.IPV4Address

$VMHostHardware = Get-VMHostHardware -VMHost $VMHost | Select-Object VMHost,Manufacturer,Model,SerialNumber
### $WMHostIPAdapter = (Get-VMHostNetworkAdapter -VMHost $WMHost).IP | Where-Object { $_.ip -ne "" }

    $DnsHostName = ""
    $Domain = ""
    $OSSystem = "ESX"
    $OSServicePack = ""
    $OSVer = ""
    $LLStamp = ""
    $OSDate = ""
    $DomainRole = ""
    $CompVendor = $VMHostHardware.manufacturer
    $CompModel = $VMHostHardware.model
    $CompSerial = $VMHostHardware.serialnumber
    }

    ELSE {
    $PingResult = "DOWN"
    $IPV4 = ""
    $OSSystem = "ESX"
    $OSServicePack = ""
    $OSVer = ""
    $LLStamp = ""
    $DnsHostName = ""
    $OSDate = ""
    $Domain = ""
    $Domainrole = ""
    $CompVendor = ""
    $CompModel = ""
    $CompSerial = ""
    }
    $Computerinfo = New-Object -Type PSObject
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Name" -Value "$WMHost" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "DNSHostName" -Value "$dnshostname" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Domain" -Value "$Domain" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "IP Address" -Value "$IPV4" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Ping" -Value "$PingResult" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS" -Value "$OSSystem" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Service Pack" -Value "$OsServicePack" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS Install Date" -Value "$OSDate" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Last Logon" -Value "$LLStamp" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Vendor" -Value "$CompVendor" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Computer Model" -Value "$CompModel" -Force
    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Serial Number" -Value "$CompSerial" -Force
 
    $Output.Add($Computerinfo) | Out-Null

    $PingStatusCode = ""
    $PingResult = ""
    $VMHostHardware = ""
    $WMHostIPAdapter = ""
    }
$Output | Export-Csv H:\Scripts\Output_ESX.csv
ii C:\Output_ESX.csv
===END===

Теперь разбираем скрипт.
Первые две строчки нужны для благополучного и безошибочного протекания скрипта.

1. Set-PowerCLIConfiguration -InvalidCertificateAction Ignore  -Confirm:$false
2. Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$false

Следующая строка посоединяет нас к VMWare серверу.
3. Connect-VIServer -User maniak@fignya.net -Password P@ssword vCenter.fignya.net

В 4-ой строке мы видим "жирную" команду Get-VMHost, которая выдает довольно много информации обо всех подключенных ESXi хостах. В варианте (Get-VMHost).name команда выдает только имена хостов ESXi, что нам и нужно. Результат записывается в переменную $AllWMHosts.
4. $AllWMHosts = (Get-VMHost).name

Теперь нам нужно создать массив (фактически, набор строк и колонок), который будет находиться в памяти до конца работы скрипта. Массив (пока пустой) будет сидеть в переменной $Output и послужит заготовкой для создания таблицы Excel.
5. $Output = New-Object System.Collections.ArrayList

Цикл ForEach будет брать имена хостов из переменной $AllWMHosts и по-очереди забрасывать их в переменную $WMHost (которая здесь и создается).
Далее, в фигурных скобках обрабатывается имя одного хоста, затем процесс повторяется со следующим именем и т.д., пока не закончатся имена. Обработка заключается в проверке пингуемости хоста и, в случае удачи, вытаскивании из него Software/Hardware информации.
6. ForEach ($WMHost in $AllWMHosts) {

Для контроля $WMHost выдает на экран имя хоста, который обрабатывается в данном обороте цикла.
7.     $WMHost

Изначально в переменную $TCFound закладывается положительный результат.
8.     $TCFound = $true

Try/Catch пытается разделить ситуации пингуемости и непингуемости.
9.     Try { Test-Connection -ComputerName $WMHOST -Count 1 -ErrorAction Stop }
10.    Catch { $TCFound = $false }

Если в соединением все в порядке, командлет Test-Connection вытаскивает в переменную $IPTC информацию об имени и IP-адресе хоста, а также присваивает переменной $PingResult значение "UP", а переменной $IPV4 значение найденного IP-адреса.
11.    IF ($TCFound) {
12.    $IPTC = Test-Connection -ComputerName $VMHost -Count 1 | Select-Object Address,IPV4Address
13.    $PingResult = "UP"
14.    $IPV4 = $IPTC.IPV4Address

Далее, для получения "железной" информации, используется коммандлет Get-VMHostHardware. Из него вынимаются несколько значений и закладываются в переменную $VMHostHardware.
15. $VMHostHardware = Get-VMHostHardware -VMHost $VMHost | Select-Object VMHost,Manufacturer,Model,SerialNumber

Здесь показан альтернативный путь получения сетевой информации. Им мы решили пока не пользоваться.
### $WMHostIPAdapter = (Get-VMHostNetworkAdapter -VMHost $WMHost).IP | Where-Object { $_.ip -ne "" }

В следующих строках происходят 3 вещи:
- обнуляются показатели, которые присутствуют для совместимости,
- жестко закладывается название OS ESX, т.к. оно известно заранее,
- из переменной $VMHostHardware вынимаются несколько нужных значений.
16.    $DnsHostName = ""
17.    $Domain = ""
18.    $OSSystem = "ESX"
19.    $OSServicePack = ""
20.    $OSVer = ""
21.    $LLStamp = ""
22.    $OSDate = ""
23.    $DomainRole = ""
24.    $CompVendor = $VMHostHardware.manufacturer
25.    $CompModel = $VMHostHardware.model
26.    $CompSerial = $VMHostHardware.serialnumber
27.    }

В случае неудачи поля заполняются пустыми значениями, за исключением $PingResult (ведь нам известно, что хост в "дауне") и название операционной системы.
28.    ELSE {
29.    $PingResult = "DOWN"
30.    $IPV4 = ""
31.    $OSSystem = "ESX"
32.    $OSServicePack = ""
33.    $OSVer = ""
34.    $LLStamp = ""
35.    $DnsHostName = ""
36.    $OSDate = ""
37.    $Domain = ""
38.    $Domainrole = ""
39.    $CompVendor = ""
40.    $CompModel = ""
41.    $CompSerial = ""
42.    }

Далее создается новый объект $Computerinfo, который, фактически, является заготовкой заголовков будущей таблицы Excel, а также создания одной строки. В дальнейшем эти строки войдут в массив $Output.
43.    $Computerinfo = New-Object -Type PSObject
44.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Name" -Value "$WMHost" -Force
45.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "DNSHostName" -Value "$dnshostname" -Force
46.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Domain" -Value "$Domain" -Force
47.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "IP Address" -Value "$IPV4" -Force
48.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Ping" -Value "$PingResult" -Force
49.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS" -Value "$OSSystem" -Force
50.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Service Pack" -Value "$OsServicePack" -Force
51.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "OS Install Date" -Value "$OSDate" -Force
52.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Last Logon" -Value "$LLStamp" -Force
53.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Vendor" -Value "$CompVendor" -Force
54.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Computer Model" -Value "$CompModel" -Force
55.    $Computerinfo | Add-Member -MemberType NoteProperty -Name "Serial Number" -Value "$CompSerial" -Force

Здесь каждый оборот цикла одна строка из $Computerinfo заполняет массив $Output. В итоге, полностью заполненный массив будет передан в таблицу Excel.
56.    $Output.Add($Computerinfo) | Out-Null

Здесь происходит очистка переменных перед следующим оборотом цикла.
57.    $PingStatusCode = ""
58.    $PingResult = ""
59.    $VMHostHardware = ""
60.    $WMHostIPAdapter = ""
61.    }

Наконец массив заполнен и передается в файл Excel.
62. $Output | Export-Csv H:\Scripts\Output_ESX.csv

Строчка запускает полученный файл csv.
63. ii C:\Output_ESX.csv

Комментариев нет:

Отправить комментарий