Взятие под контроль разрастания виртуальных машин (часть 16)

Опубликовано: 18 Апреля, 2023

  • Взятие под контроль разрастания виртуальных машин (часть 2)
  • Взятие под контроль разрастания виртуальных машин (часть 3)
  • Взятие под контроль разрастания виртуальных машин (часть 4)
  • Взятие под контроль разрастания виртуальных машин (часть 5)
  • Взятие под контроль разрастания виртуальных машин (часть 6)
  • Взятие под контроль разрастания виртуальных машин (часть 7)
  • Взятие под контроль разрастания виртуальных машин (часть 8)
  • Взятие под контроль разрастания виртуальных машин (часть 9)
  • Взятие под контроль разрастания виртуальных машин (часть 10)
  • Взятие под контроль разрастания виртуальных машин (часть 11)
  • Взятие под контроль разрастания виртуальных машин (часть 12)
  • Взятие под контроль разрастания виртуальных машин (часть 13)
  • Взятие под контроль разрастания виртуальных машин (часть 18)

Введение

Как вы помните, мой сценарий немного запутался в предыдущей статье этой серии. Казалось бы, простое действие по подсчету событий создания и удаления виртуальных машин на серверах привело к осложнениям, связанным с ограничениями, которые PowerShell накладывает на использование переменных. Тем не менее, я придумал исправление. Теперь пришло время интегрировать это исправление в сценарий, который мы создавали. Если вы еще не читали предыдущую статью из этой серии или если это было давно, то я настоятельно рекомендую вернуться и прочитать ее, прежде чем переходить к этой.

Сценарий в его нынешнем виде

Код, который я предоставил вам в предыдущей статье, был разработан больше для иллюстрации концепций, которые я буду использовать, а не для того, чтобы действовать непосредственно как часть нашего скрипта. Таким образом, я хотел пойти дальше и дать вам код сценария в том виде, в каком он существует прямо сейчас. Вот код:

Функция Get-MyData($Server){

#Функция для получения информации о данных журнала ВМ

 

Write-Host «Имя текущего сервера» -NoNewLine; Запись-хост $Server

$MySession = New-PSSession -ComputerName $Server

Invoke-Command -Session $MySession -ScriptBlock {

 

#январь 2016

 

$NumJanCreateEvents = '0'

$JanCreateEvents = ”

$NumJanDeleteEvents = '0'

$JanDeleteEvents = ”

$JanStartDate = '01.01.2016 00:00:00'

$JanEndDate = '30.01.2016 23:59:59'

$JanCreateEvents = Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13002;StartTime=$JanStartDate;EndTime=$JanEndDate} -ErrorAction 'SilentlyContinue'

$NumJanCreateEvents = $JanCreateEvents.count

$JanDeleteEvents = Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13003;StartTime=$JanStartDate;EndTime=$JanEndDate} -ErrorAction 'SilentlyContinue'

$NumJanDeleteEvents = $JanDeleteEvents.count

Пишите-Ведущий «В январе 2016 года были» -NoNewLine; Write-Host $NumJanCreateEvents -NoNewLine; Write-Host «Созданы новые виртуальные машины».

Write-Host «В тот же период времени были» -NoNewLine; Write-Host $NumJanDeleteEvents -NoNewLine; Write-Host «виртуальные машины удалены».

 

#февраль 2016

 

$NumFebCreateEvents = '0'

$FebCreateEvents = ”

$NumFebDeleteEvents = '0'

$FebDeleteEvents = ”

$FebStartDate = '01.02.2016 00:00:00'

$FebEndDate = '29.02.2016 23:59:59'

$FebCreateEvents = Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13002;StartTime=$FebStartDate;EndTime=$FebEndDate} -ErrorAction 'SilentlyContinue'

$NumFebCreateEvents = $FebCreateEvents.count

$FebDeleteEvents = Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13003;StartTime=$FebStartDate;EndTime=$FebEndDate} -ErrorAction 'SilentlyContinue'

$NumFebDeleteEvents = $FebDeleteEvents.count

Пишите-Ведущий «В феврале 2016 года были» -NoNewLine; Write-Host $NumFebCreateEvents -NoNewLine; Write-Host «Созданы новые виртуальные машины».

Write-Host «В тот же период времени были» -NoNewLine; Write-Host $NumFebDeleteEvents -NoNewLine; Write-Host «виртуальные машины удалены».

Exit-PSSession

}

}

 

#Тело сценария

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-4", "Prod1", "Prod2")

ForEach ($Server в $Servers) {

 

$ServerName = $Сервер

Get-MyData $ServerName

 

}

Подведение итогов

Итак, теперь нам нужно изменить код таким образом, чтобы мы могли подсчитывать события создания и удаления виртуальных машин для каждого хоста. Для этого мы собираемся применить методы, которые я показал вам в предыдущей статье. Позвольте мне пойти дальше и показать вам код, а затем я объясню, что я сделал. Вот код:

Функция Get-MyData($Server){

#Функция для получения информации о данных журнала ВМ

 

 

$MySession = New-PSSession -ComputerName $Server

 

#Инициализировать переменные

Invoke-Command -Session $MySession -ScriptBlock {

 

#январь

 

$NumJanCreateEvents = '0'

$JanCreateEvents = ”

$NumJanDeleteEvents = '0'

$JanDeleteEvents = ”

$JanStartDate = '01.01.2016 00:00:00'

$JanEndDate = '30.01.2016 23:59:59'

 

#февраль

 

$NumFebCreateEvents = '0'

$FebCreateEvents = ”

$NumFebDeleteEvents = '0'

$FebDeleteEvents = ”

$FebStartDate = '01.02.2016 00:00:00'

$FebEndDate = '29.02.2016 23:59:59'

 

}

 

#январь 2016

 

$JanCreateEvents = Invoke-Command -Session $MySession -ScriptBlock {Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13002;StartTime=$JanStartDate;EndTime=$JanEndDate} -ErrorAction 'Продолжить молча'}

$Global:NumJanCreateEvents = $JanCreateEvents.count

$JanDeleteEvents = Invoke-Command -Session $MySession -ScriptBlock {Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13003;StartTime=$JanStartDate;EndTime=$JanEndDate} -ErrorAction 'Продолжить молча'}

$Global:NumJanDeleteEvents = $JanDeleteEvents.count

 

#февраль 2016

 

$FebCreateEvents = Invoke-Command -Session $MySession -ScriptBlock {Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13002;StartTime=$FebStartDate;EndTime=$FebEndDate} -ErrorAction 'Продолжить молча'}

$Global:NumFebCreateEvents = $FebCreateEvents.count

$FebDeleteEvents = Invoke-Command -Session $MySession -ScriptBlock {Get-WinEvent –FilterHashTable @{LogName=”Microsoft-Windows-Hyper-V-VMMS-Admin”;ID=13003;StartTime=$FebStartDate;EndTime=$FebEndDate} -ErrorAction 'Продолжить молча'}

$Global:NumFebDeleteEvents = $FebDeleteEvents.count

 

# Ежемесячный выпуск

 

Пишите-Хозяин » «

Write-Host «Сервер:» -NoNewLine; Запись-хост $Server

Write-Host «Январь Создать события:» -NoNewLine; Запись хоста $NumJanCreateEvents

Write-Host «Январские события удаления: » -NoNewLine; Узел записи $NumJanDeleteEvents

Write-Host «Февральские события: » -NoNewLine; Запись хоста $NumFebCreateEvents

Write-Host «Февральские события удаления:» -NoNewLine; Запись хоста $NumFebDeleteEvents

Пишите-Хозяин » «

}

 

#Тело сценария

 

#Инициализировать переменные

$TotalJanCreateEvents = '0'

$TotalJanDeleteEvents = '0'

$TotalFebCreateEvents = '0'

$TotalFebDeleteEvents = '0'

 

 

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-4", "Prod1", "Prod2")

ForEach ($Server в $Servers) {

 

$ServerName = $Сервер

Get-MyData $ServerName

$TotalJanCreateEvents = [int]$TotalJanCreateEvents + [int]$NumJanCreateEvents

$TotalJanDeleteEvents = [int]$TotalJanDeleteEvents + [int]$NumJanDeleteEvents

$TotalFebCreateEvents = [int]$TotalFebCreateEvents + [int]$NumFebCreateEvents

$TotalFebDeleteEvents = [int]$TotalFebDeleteEvents + [int]$NumFebDeleteEvents

 

}

Write-Host «Всего событий создания за январь:» -NoNewLine; Запись хоста $TotalJanCreateEvents

Write-Host «Всего событий удаления за январь: » -NoNewLine; Узел записи $TotalJanDeleteEvents

Write-Host «Всего событий за февраль: » -NoNewLine; Запись хоста $TotalFebCreateEvents

Write-Host «Всего событий удаления за февраль:» -NoNewLine; Запись хоста $TotalFebDeleteEvents

На первый взгляд может показаться, что код был полностью изменен. Однако самые большие изменения заключаются в том, что я изменил несколько вещей и добавил несколько новых строк, которые выводят значения переменных по мере выполнения скрипта. Таким образом, вы можете убедиться, что скрипт работает правильно. Хотите верьте, хотите нет, но я мало что сделал с кодом с точки зрения функциональности.

Прежде чем я расскажу о том, как работает код, я хочу показать вам, как выглядит вывод сценария. Как вы можете видеть на рисунке A, мой сценарий перечисляет имена всех серверов, которые он анализирует, а также количество событий создания и удаления за каждый месяц. Как вы помните, в настоящее время мы изучаем только январь и февраль, чтобы код был коротким. Я добавлю в другие месяцы позже. В конце вывода сценарий подсчитывает общее количество событий создания и удаления на всех серверах за каждый месяц.

Изображение 14709
Рисунок A: Вот результат моего скрипта.

Итак, давайте поговорим о коде. Я не буду вдаваться в исчерпывающие подробности, потому что мало что изменилось. Тело скрипта начинается с инициализации переменных, в которых будет храниться общее количество событий создания и удаления на всех серверах за каждый месяц. После инициализации этих переменных я добавляю имена своих серверов в переменную $Servers, а затем запускаю цикл сценария.

Цикл передает имена серверов функции Get-MyData одно за другим. Функция определяет сеанс для указанного сервера, а затем инициализирует ряд различных переменных. Эти переменные инициализируются на удаленном сервере, а не в локальной системе.

После инициализации переменных функция начинает собирать информацию о событиях создания и удаления для указанного сервера. Для каждого месяца предусмотрен отдельный процесс сбора. Этот раздел работает почти так же, как и раньше, но я сделал два важных изменения. Команды, которые назначают события создания и удаления переменной, теперь включают командлет Invoke-Command и ссылаются на удаленный сеанс. Именно это позволяет присваивать данные переменной в локальной системе.

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

Когда функция возвращается, основная часть скрипта подсчитывает количество событий создания и удаления за каждый месяц. Для этой цели в теле скрипта используются переменные, имена которых начинаются с $Total. Эти переменные были инициализированы 0 в самом начале скрипта. Теперь количество событий создания добавляется к переменной для каждого сервера отдельно, пока переменная не будет содержать общую сумму событий на всех серверах.

Кстати, вы заметите, что строки кода, которые подсчитывают общее количество событий создания и удаления, используют [int]. [int] указывает PowerShell обрабатывать содержимое переменных как целые числа. В противном случае содержимое переменных обрабатывается как текст и объединяется, а не суммируется.

Вывод

Теперь у нас есть сценарий, который подсчитывает события создания и удаления виртуальных машин в центре обработки данных. В следующей статье серии мы добавим оставшиеся месяцы, а затем поработаем над выводом значений на диаграмму.

  • Взятие под контроль разрастания виртуальных машин (часть 2)
  • Взятие под контроль разрастания виртуальных машин (часть 3)
  • Взятие под контроль разрастания виртуальных машин (часть 4)
  • Взятие под контроль разрастания виртуальных машин (часть 5)
  • Взятие под контроль разрастания виртуальных машин (часть 6)
  • Взятие под контроль разрастания виртуальных машин (часть 7)
  • Взятие под контроль разрастания виртуальных машин (часть 8)
  • Взятие под контроль разрастания виртуальных машин (часть 9)
  • Взятие под контроль разрастания виртуальных машин (часть 10)
  • Взятие под контроль разрастания виртуальных машин (часть 11)
  • Взятие под контроль разрастания виртуальных машин (часть 12)
  • Взятие под контроль разрастания виртуальных машин (часть 13)
  • Взятие под контроль разрастания виртуальных машин (часть 18)