# 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
===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
Комментариев нет:
Отправить комментарий