English version

Довольно часто сталкиваюсь с задачей сбора и анализа конфигурации виртуальной инфраструктуры. Любой аудит даже маленькой компании требует ручной проверки и использования инструментов анализа, такие как Best Practices Analyzer для Hyper-V. В Windows Server 2008 R для использования, BPA Analyzer требовалось установить отдельное обновление KB977238. Начиная с Windows Server 2012/2012 R2, как и многие другие BPA для ролей, стали доступны в RTM-версиях и готовы к использованию из "коробки" при помощи Server Manager или Powershell (модуль BestPractices).  BPA Analyzer запускает сканирование конфигурации Hyper-V сервера и конфигурации виртуальных машин на соблюдение "лучших практик". Отчет доступен из Server Manager или внутри консоли Powershell (Get-BPAResult). Если серверов достаточно много, то появляется потребность минимизации "кликов" и получения более детального отчета. Подобную задачу можно реализовать через довольно простой скрипт Powershell.

На данный момент "черновая" версия, но полностью рабочая. Работа проверена  в кластерной среде 2008 R2/2012.

Как работает скрипт?
  1. Создает необходимые папки C:\BPA и C:\BPA\Reports . Добавлено простое условие: если папка Reports уже есть, то пропускаем создание папок
  2. Создает файл HVHOSTS.CSV в C:\BPA для хранения NETBIOS-имен серверов Hyper-V
  3. Выводит подсказку для ввода имен серверов через запятую и заносит введенные имена в файл hvhosts.csv, учитывая необходимый формат. Т.е. процесс заполнения файла (и работы скрипта) полностью из консоли Powershell
  4. Запускает проверку наличия роли Hyper-V на введенных серверах и запускает сканирование BPA для каждого сервера при этом выводится статус на каком именно сервере происходит сбор данных.
  5. После сканирования BPA забираются результаты всех сканов, учитывая только Warnings и Errors , и конвертируются в HTML-файл с сохранением в C:\BPA\Reports\bpa_имясервера.html
  6. Автоматически открывается каждый файл отчета *

*скрипт заполняет HTML-файл используя наименования параметров из отчета BPA, поэтому,если Ваша ОС , к примеру, Russian , то необходимо изменить англоязычные термины на русские. К примеру, Error <> Ошибка.

 Ссылка на загрузку 

01.#Проверяем наличие необходимых файлов и папок
02.$test=Test-Path c:\BPA\Reports
03.If ($test -eq $false)
04.{ #Создаем папки и файл, если их нет
05.New-Item c:\BPA -ItemType Directory
06.New-Item c:\BPA\Reports -ItemType directory
07.New-Item C:\BPA\hvhosts.csv -ItemType file
08.Add-Content -Path C:\BPA\hvhosts.csv -Value "HyperVhost"
09.Write-Host "Folders/Files were created. Now you MUST define Hyper-V Server Names" -ForegroundColor Red -BackgroundColor white
10.}
11.#Если уже всё есть, то идем дальше
12.Else {Write-Host "There is nothing to create. Jump To The Next Step" -ForegroundColor Red -BackgroundColor white}
13.#Определяем source-Файл, в котором содержатся netbios-имена Hyper-V серверов
14.$csvfile="C:\BPA\hvhosts.csv"
15.#Заполняем файл
16.[string]$name=Read-Host "Enter Hyper-V NETBIOS Name (separated by commas)"
17.$name.Split(",")|% {$_.trim()}|Add-Content C:\BPA\hvhosts.csv
18.#Импортируем файл и делаем цикл для каждого Hyper-V сервера
19.Import-csv $csvfile|foreach {
20.#Всё, что под HyperVhost=переменной hv=имени сервера
21.$hv=$_.HyperVhost;
22.$grole=Get-WindowsFeature Hyper-V
23.#Доп.проверка правильности введенных серверов на предмет наличия Hyper-V на них.
24.ICM -ScriptBlock {
25.#Проверяем наличие установленного Hyper-V на каждом сервере
26.If ($grole.Installed -eq $False) {write-host "You don't have hyper-v on $hv" -ForegroundColor Red -BackgroundColor Blue}
27.else {write-host "Server $hv has hyper-v installed feauture. Everything is OK. Doing a BPA Scan. HTML will open automatically" -ForegroundColor red -BackgroundColor White}}
28.#Выводим статус выполнения задачи
29.Write-host "Collecting BPA Information on $hv" -foreground Yellow;
30.#Запускаем удаленное выполнение команд в скрипт блоке
31.ICM -ScriptBlock {
32. #Импортируем необходимые модули. для ps 3.0 это необязательно, но лучше оставить
33. Import-Module ServerManager
34. Import-Module BestPractices
35. #Запускаем сканирование BPA
36. Invoke-BPAModel –BestPracticesModelID Microsoft/Windows/Hyper-V
37. #HTML Style
38. $head = "<style>"
39. $head = $head + "BODY{background-color:white;}"
40. $head = $head + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
41. $head = $head + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:thistle}"
42. $head = $head + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:palegoldenrod}"
43. $head = $head + "</style>"
44. #Забираем только те результаты BPA, которые не прошли проверку
45. Get-BpaResult -BestPracticesModelId Microsoft/Windows/Hyper-V |
46. Where-Object {$_.Severity -eq "Error" -or $_.Severity -eq “Warning” }|
47. #Конвертируем стандартный вывод в более удобный формат html
48. ConvertTo-Html -Property Severity,Category,Title,Problem,Impact,Resolution,Help  -body "<H2>Hyper-V BPA Report</H2>" -head $head 
49.} |
50. #Собираем всю полученную информацию в отдельные файлы в формате bpa_имясервера.html
51. Out-File "C:\BPA\reports\bpa_$hv.html"
52. Invoke-Expression "C:\BPA\reports\bpa_$hv.html"
53.}
54.


Процесс выполнения для серверов HV100, HV101:



Отчеты в папке "Reports":



Отчет HTML:




free hit counter