Создание сценариев PowerShell для проверки окон обслуживания узла VMM

Опубликовано: 16 Апреля, 2023
Создание сценариев PowerShell для проверки окон обслуживания узла VMM

В недавней статье я рассказал о том, как окна обслуживания System Center Virtual Machine Manager можно использовать для определения допустимых периодов обслуживания для хостов Hyper-V. Однако, как бы удобно это ни было, можно создавать сценарии PowerShell, которые проверяют окно обслуживания хоста, прежде чем предпринимать какие-либо действия. Прежде чем я покажу вам, как это сделать, я должен указать, что окна обслуживания различаются по объему. Некоторые происходят ежедневно, в то время как другие могут происходить еженедельно или ежемесячно. Создание сценария PowerShell, который исследует каждую возможность, было бы большой задачей и намного превышало бы объем места, который я должен работать в рамках этой статьи. В таком случае я хочу подойти к этому, показав вам несколько основных приемов, которые вы можете применить к своему собственному сценарию. VMM предоставляет командлет PowerShell с именем Get-SCServicingWindow, который можно использовать для получения сведений об обслуживаемых окнах. На снимке экрана ниже показано, что происходит, когда вы вводите этот командлет без каких-либо параметров.
Изображение 14303

Сценарий PowerShell для окна обслуживания VMM: основные шаги

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

  • Проверьте, какое окно обслуживания относится к хосту, который нуждается в обслуживании.
  • Получите данные, связанные с окном обслуживания.
  • Проверьте текущую дату и время.
  • Проверьте, не началось ли окно обслуживания.
  • Проверьте, не закончилось ли окно обслуживания.

Хорошая новость заключается в том, что некоторые из этих шагов можно комбинировать. Предположим, например, что я хочу выполнить техническое обслуживание хоста с именем Hyper-V. Я мог бы получить имя окна обслуживания и данные окна обслуживания за один шаг, используя эту команду:

$ServicingWindow = Get-SCServicingWindow -VMHost Hyper-V

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

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

$Date = Get-Date $Time=([String] $Date.Hour + «:» + $Date.Minute)

Переменные упрощают

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

$Go=$False [DateTime]$StartDate = $ServicingWindow.StartDate $StartTime = $ServicingWindow.StartTimeOfDay If ($Date -gt $StartDate) {$Go = $True} else {$Go=$False} If ($Time -lt $StartTime) {$Go=$False}

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

Затем я устанавливаю две переменные: $StartDate и $StartTime. Эти переменные содержат дату и время начала периода обслуживания. Оттуда я сравниваю текущую дату с датой начала и текущее время со временем начала. Если текущая дата больше даты начала, я устанавливаю для переменной $Go значение $True, в противном случае ей присваивается значение false.

Затем я начал бы серию сравнений. Однако в примере кода у меня настроено только одно сравнение. В этом примере я проверяю, не наступило ли оно раньше назначенного времени начала. Если да, то я устанавливаю для $Go значение $False. Важно отметить, что это и любые последующие сравнения должны проверять только наличие условия, которое оправдывает остановку операции обслуживания (путем присвоения значения $False). В противном случае, если одно из проверяемых условий должно было присвоить значение $True, то оно может переопределить более раннее сравнение, которому было присвоено значение $False. Помните, что в реальном сценарии будет множество сравнений (дата начала, время начала, дата окончания, время окончания, день недели и т. д.). Если какое-либо из этих сравнений дало значение $False, задачу обслуживания запускать нельзя.
Изображение 14304

Стандартные блоки PowerShell для окон обслуживания VMM

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

Если вы решите создать такой сценарий, я бы посоветовал включить код, который я вам дал (плюс любые дополнительные сравнения, которые вы можете добавить) в функцию PowerShell. Если переменная $Go функции в конечном итоге возвращает значение $True, то вы можете вызвать дополнительную функцию, чтобы начать любую задачу обслуживания, которую вы хотите выполнить. Однако, если функция возвращает значение $Go равное $False, вы можете либо прервать сценарий, либо заставить сценарий ждать некоторое время, а затем выполнить новое сравнение, чтобы увидеть, можно ли теперь выполнять обслуживание на хозяин.