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

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

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

Введение

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

Построение структуры цикла

Самый простой способ проанализировать журналы событий всей организации — создать цикл в теле скрипта. Это удивительно легко сделать. Чтобы показать вам, что я имею в виду, взгляните на блок кода ниже:

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

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

ForEach ($Server в $Servers) {

$ServerName = $Сервер

Get-MyData $ServerName

}

Этот блок кода на самом деле ничего не делает сам по себе и не имеет ничего общего с разрастанием виртуальных машин (по крайней мере, пока). Я хотел не усложнять и показать вам, как работает цикл. После этого мы можем адаптировать цикл к нашему скрипту.

Первая строка кода — не что иное, как комментарий, указывающий, что это тело скрипта. Во второй строке все становится интереснее. В этой строке кода мы создаем переменную с именем $Servers. Эта переменная будет действовать как массив и хранить имена всех серверов Hyper-V, которые я хочу проанализировать. В этом конкретном случае я жестко запрограммировал имена серверов, и шесть серверов перечислены в массиве.

Третья строка кода — это место, где начинается цикл. Эта строка кода создает цикл, в котором Windows просматривает каждый сервер ($server) в списке серверов ($servers). Обратите внимание, что используются две разные переменные — $server и $servers. $server будет хранить имя анализируемого в данный момент сервера, тогда как $servers будет хранить весь список серверов. Все действия цикла заключены в фигурные скобки {}.

В цикле две строки кода. Первая из этих строк присваивает имя анализируемого в данный момент сервера переменной с именем $ServerName. Я сделал это, потому что имя $SeverName немного упрощает отслеживание того факта, что переменная хранит имя одного отдельного сервера Hyper-V.

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

Итак, давайте продолжим и создадим функцию Get-MyData. Если вы вспомните предыдущую статью, то вспомните, что я написал массивный сценарий PowerShell, который анализирует журналы событий за целый год. Именно этот код мы будем помещать в функцию. Однако потребуется небольшая модификация кода.

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

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

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

 

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

$MySession = New-PSSession -ComputerName $Server

Invoke-Command -Session $MySession -ScriptBlock {

 

#январь 2015

 

$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){

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

 

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

$MySession = New-PSSession -ComputerName $Server

Invoke-Command -Session $MySession -ScriptBlock {

 

#январь 2016

 

$NumJanCreateEvents = '0'

$JanCreateEvents = ”

$NumJanDeleteEvents = '0'

$JanDeleteEvents = ”

Первая строка кода просто объявляет функцию и сообщает PowerShell, что функция будет принимать имя сервера. Вторая строка — это просто комментарий.

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

Следующие две строки предназначены для установления удаленного сеанса связи с анализируемым сервером. Мы создаем сеанс с именем $MySession и устанавливаем этот сеанс на сервере Hyper-V, имя которого было передано функции. Затем мы вызываем команду на удаленной машине Hyper-V. Обратите внимание на использование параметра ScriptBlock. Этот параметр позволяет нам запускать весь код, оставшийся в функции, на удаленном сервере.

Последнее, что я хотел показать вам, это то, что я добавил несколько строк кода после комментария от января 2016 года. Эти строки кода инициализируют мои переменные. Честно говоря, эти строки нам могут и не понадобиться. Я написал их в качестве меры предосторожности, просто чтобы убедиться, что мы случайно не перенесли какие-либо данные с ранее проанализированного сервера.

Вы можете увидеть результат этого скрипта на рисунке A. Как вы можете видеть на рисунке, сценарий разбивает создание и удаление виртуальных машин для каждого хост-сервера за январь и февраль 2016 года.

Изображение 14764
Рисунок A: Теперь скрипт анализирует несколько серверов.

Вывод

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

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