Управление сценариями предварительного и последующего выполнения
Внимание
Управление обновлениями службы автоматизации прекращено 31 августа 2024 г. и рекомендуется использовать Диспетчер обновлений Azure. Следуйте рекомендациям по миграции из службы "Управление обновлениями службы автоматизации" в Диспетчер обновлений Azure.
Сценарии предварительного и последующего выполнения представляют собой модули runbook, которые выполняются в учетной записи службы автоматизации до и после задач развертывания обновлений. Сценарии предварительного и последующего выполнения выполняются в контексте Azure, а не в локальной среде. Сценарии предварительного выполнения запускаются в начале развертывания обновлений. В Windows скрипты последующего выполнения запускаются в конце развертывания и после каждой настроенной перезагрузки. В Linux скрипты последующего выполнения запускаются после развертывания, а не после перезагрузки компьютера.
Требования к сценариям предварительного и последующего выполнения
Чтобы модуль runbook можно было использовать в качестве сценария предварительного или последующего выполнения, его необходимо импортировать в учетную запись службы автоматизации и опубликовать как runbook.
В настоящее время поддерживаются только модули Runbook PowerShell 5.1 и Python 2. Другие типы модулей runbook, такие как Python 3, графический рабочий процесс, рабочий процесс PowerShell и графический рабочий процесс PowerShell, в настоящее время не поддерживаются в качестве сценариев предварительного и последующего выполнения.
Параметры сценариев предварительного и последующего выполнения
Настроив сценарии предварительного и последующего выполнения, вы сможете передавать в них параметры, как при создании расписания для модуля runbook. Параметры определяются при создании развертывания обновлений. Сценарии предварительного и последующего выполнения поддерживают следующие типы:
- [char]
- [byte]
- [int]
- [long]
- [decimal]
- [single]
- [double]
- [DateTime]
- [string]
В параметрах runbook для сценариев предварительного и последующего выполнения не поддерживаются логические значения, объекты и массивы. Наличие таких значений приводит к сбою выполнения модуля runbook.
Если вам нужен другой тип объекта, вы можете привести его к другому типу с помощью собственной логики runbook.
Помимо стандартных параметров модулей runbook, поддерживается дополнительный параметр SoftwareUpdateConfigurationRunContext
(с типом строки JSON). Если этот параметр определен для сценария предварительного или последующего выполнения, в него автоматически передается значение при развертывании обновлений. Этот параметр содержит сведения о развертывании обновлений, то есть подмножество информации, возвращаемой из API SoftwareUpdateconfigurations. В следующих разделах описываются соответствующие свойства.
Свойства SoftwareUpdateConfigurationRunContext
Свойство | Type | Описание |
---|---|---|
SoftwareUpdateConfigurationName | Строка | Имя конфигурации обновления программного обеспечения. |
SoftwareUpdateConfigurationRunId | GUID | Уникальный идентификатор для запуска. |
SoftwareUpdateConfigurationSettings | Коллекция свойств, связанных с конфигурацией обновления программного обеспечения. | |
SoftwareUpdateConfigurationSettings.OperatingSystem | Int | Операционные системы, на которых будут развертываться обновления. 1 = Windows и 2 = Linux |
SoftwareUpdateConfigurationSettings.Duration | TimeSpan (ЧЧ:ММ:СС) | Максимальная продолжительность развертывания обновлений (период обслуживания) в формате PT[n]H[n]M[n]S по стандарту ISO8601.Например: 02:00:00. |
SoftwareUpdateConfigurationSettings.WindowsConfiguration | Коллекция свойств, связанных с компьютерами Windows. | |
SoftwareUpdateConfigurationSettings.WindowsConfiguration.excludedKbNumbers | Строка | Список номеров обновлений с разделением пробелами, которые не включаются в развертывание. |
SoftwareUpdateConfigurationSettings.WindowsConfiguration.includedKbNumbers | Строка | Список номеров обновлений с разделением пробелами, которые включаются в развертывание обновления. |
SoftwareUpdateConfigurationSettings.WindowsConfiguration.UpdateCategories | Целое | 1 = "Critical"; 2 = "Security" 4 = "UpdateRollUp" 8 = "FeaturePack" 16 = "ServicePack" 32 = "Definition" 64 = "Tools" 128 = "Updates" |
SoftwareUpdateConfigurationSettings.WindowsConfiguration.rebootSetting | Строка | Параметры перезагрузки для развертывания обновлений. Поддерживаются значения IfRequired , Never , Always |
SoftwareUpdateConfigurationSettings.LinuxConfiguration | Коллекция свойств, связанных с компьютерами Linux. | |
SoftwareUpdateConfigurationSettings.LinuxConfiguration.IncludedPackageClassifications | Целое | 0 = "Unclassified" 1 = "Critical" 2 = "Security" 4 = "Other" |
SoftwareUpdateConfigurationSettings.LinuxConfiguration.IncludedPackageNameMasks | Строка | Список имен пакетов с разделением пробелами, которые включаются в развертывание обновления. |
SoftwareUpdateConfigurationSettings.LinuxConfiguration.ExcludedPackageNameMasks | Строка | Список имен пакетов с разделением пробелами, которые не включаются в развертывание обновления. |
SoftwareUpdateConfigurationSettings.LinuxConfiguration.RebootSetting | Строка | Параметры перезагрузки для развертывания обновлений. Поддерживаются значения IfRequired , Never , Always |
SoftwareUpdateConfiguationSettings.AzureVirtualMachines | Массив строк | Список идентификаторов ресурсов для виртуальных машин Azure, включенных в развертывание обновлений. |
SoftwareUpdateConfigurationSettings.NonAzureComputerNames | Массив строк | Список полных доменных имен компьютеров, не связанных с Azure, включенных в развертывание обновлений. |
В следующем примере приведена строка JSON, передаваемая в свойство SoftwareUpdateConfigurationSettings для компьютера Linux.
"SoftwareUpdateConfigurationSettings": {
"OperatingSystem": 2,
"WindowsConfiguration": null,
"LinuxConfiguration": {
"IncludedPackageClassifications": 7,
"ExcludedPackageNameMasks": "fgh xyz",
"IncludedPackageNameMasks": "abc bin*",
"RebootSetting": "IfRequired"
},
"Targets": {
"azureQueries": null,
"nonAzureQueries": ""
},
"NonAzureComputerNames": [
"box1.contoso.com",
"box2.contoso.com"
],
"AzureVirtualMachines": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/resourceGroupName/providers/Microsoft.Compute/virtualMachines/vm-01"
],
"Duration": "02:00:00",
"PSComputerName": "localhost",
"PSShowComputerName": true,
"PSSourceJobInstanceId": "2477a37b-5262-4f4f-b636-3a70152901e9"
}
В следующем примере приведена строка JSON, передаваемая в свойство SoftwareUpdateConfigurationSettings для компьютера Windows.
"SoftwareUpdateConfigurationRunContext": {
"SoftwareUpdateConfigurationName": "sampleConfiguration",
"SoftwareUpdateConfigurationRunId": "00000000-0000-0000-0000-000000000000",
"SoftwareUpdateConfigurationSettings": {
"operatingSystem": "Windows",
"duration": "02:00:00",
"windows": {
"excludedKbNumbers": [
"168934",
"168973"
],
"includedUpdateClassifications": "Critical",
"rebootSetting": "IfRequired"
},
"azureVirtualMachines": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-01",
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-02",
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-03"
],
"nonAzureComputerNames": [
"box1.contoso.com",
"box2.contoso.com"
]
}
}
Полный пример со всеми свойствами можно найти по имени: получение конфигурации обновления программного обеспечения.
Примечание.
Объект SoftwareUpdateConfigurationRunContext
может содержать повторяющиеся записи для компьютеров. В этом случае сценарии предварительного и последующего выполнения будут выполнены на одном компьютере несколько раз. Если такое поведение нежелательно, используйте Sort-Object -Unique
для выбора только уникальных имен виртуальных машин.
Использование сценариев предварительного и последующего выполнения в развертывании
Чтобы применить сценарий предварительного или последующего выполнения при развертывании обновлений, прежде всего создайте развертывание обновлений. Выберите Сценарии предварительного и последующего выполнения. Откроется страница Выбор сценариев предварительного и последующего выполнения.
Выберите сценарий, который вы хотите использовать. В нашем примере используется модуль runbook с именем UpdateManagement-TurnOnVms. При выборе модуля runbook открывается страница Настройка сценария. Выберите Сценарий предварительного выполнения и щелкните ОК.
Повторите эту процедуру для сценария UpdateManagement-TurnOffVms. Но для параметра Тип сценария выберите Сценарий последующего выполнения.
Теперь раздел Выбранные элементы отображает оба выбранных сценария. Один из них — сценарий предварительного выполнения, а второй — сценарий последующего выполнения.
Завершите настройку развертывания обновлений.
Когда развертывание обновлений будет готово, откройте страницу Развертывания обновлений и проверьте результаты. Здесь, среди прочего, предоставляется состояние для обоих сценариев.
Выбрав запуск развертывания обновлений, вы увидите дополнительные сведения о сценариях предварительного и последующего выполнения. В открывшемся окне будет ссылка на код сценария, который выполнялся.
Остановка развертывания
Если вам придется прерывать развертывание по результатам работы сценария предварительного выполнения, он должен создавать исключение. Без этого развертывание продолжится и сценарий последующего выполнения также будет выполнен. В приведенном ниже фрагменте кода показано, как создать исключение с помощью PowerShell.
#In this case, we want to terminate the patch job if any run fails.
#This logic might not hold for all cases - you might want to allow success as long as at least 1 run succeeds
foreach($summary in $finalStatus)
{
if ($summary.Type -eq "Error")
{
#We must throw in order to fail the patch deployment.
throw $summary.Summary
}
}
В Python 2 управление обработкой исключений осуществляется в блоке try.
Взаимодействие с компьютерами
Сценарии предварительного и последующего выполнения работают как обычные модули runbook в учетной записи службы автоматизации, а не на реально развернутых компьютерах. Задачи предварительного и последующего выполнения также работают в контексте Azure и не имеют доступа к компьютерам в других средах. В следующих разделах показано, как организовать взаимодействие с компьютерами напрямую, будь то виртуальные машины Azure или компьютеры, не связанные с Azure.
Взаимодействие с компьютерами Azure
Задачи предварительного и последующего выполнения работают как модули runbook, а не в среде ОС виртуальных машин Azure в развертывании. Чтобы взаимодействовать с виртуальными машинами Azure, вам потребуется следующее:
- Управляемое удостоверение или учетная запись запуска от имени
- модуль runbook, который вам нужно выполнить.
Для взаимодействия с виртуальными машинами Azure следует применять командлет Invoke-AzVMRunCommand. Такое взаимодействие описано в примере модуля runbook в статье Управление обновлениями — запуск сценария командой Run.
Взаимодействие с компьютерами, не связанными с Azure
Задачи предварительного и последующего выполнения работают в контексте Azure и не имеют доступ к компьютерам в других средах. Чтобы взаимодействовать с компьютерами, не связанными с Azure, вам потребуется следующее:
- Управляемое удостоверение или учетная запись запуска от имени
- установленная на компьютере гибридная рабочая роль Runbook;
- модуль Runbook, который будет запускаться локально;
- родительский модуль runbook.
Для взаимодействия с компьютерами, не связанными с Azure, в контексте Azure выполняется родительский модуль runbook. Он вызывает дочерний модуль runbook с помощью командлета Start-AzAutomationRunbook. Ему нужно передать параметр RunOn
и имя гибридной рабочей роли Runbook, которая будет выполнять сценарий. Пример такого модуля runbook см. в статье Управление обновлениями — локальный запуск сценария.
Отмена развертывания обновлений
Если сценарий предварительного выполнения возвращает ошибку, иногда нужно прервать развертывание. Для этого нужно создавать исключения в сценарии по любому поводу, который для вашего развертывания считается сбоем.
if (<My custom error logic>)
{
#Throw an error to fail the patch deployment.
throw "There was an error, abort deployment"
}
Чтобы выдавать ошибку при возникновении определенного условия, в Python 2 используется оператор raise.
If (<My custom error logic>)
raise Exception('Something happened.')
Примеры
Примеры сценариев предварительного и последующего выполнения можно найти в разделе Организация GitHub для службы автоматизации Azure и в коллекции PowerShell, либо их можно импортировать через портал Azure. Для этого в учетной записи службы автоматизации выберите в разделе Автоматизация процессов элемент Коллекция модулей runbook. В качестве фильтра укажите Управление обновлениями.
Также вы можете искать сценарии по именам, которые указаны в списке ниже.
- Update Management - Turn On VMs (Управление обновлениями — включить виртуальные машины).
- Update Management - Turn Off VMs (Управление обновлениями — выключить виртуальные машины).
- Update Management - Run Script Locally (Управление обновлениями — локальный запуск сценария).
- Update Management - Template for Pre/Post Scripts (Управление обновлениями — шаблон для скриптов предварительного и последующего выполнения).
- Update Management - Run Script with Run Command (Управление обновлениями — запуск сценария командой Run).
Внимание
Чтобы воспользоваться импортированным модулем runbook, его нужно опубликовать. Для этого найдите нужный модуль runbook в учетной записи службы автоматизации, а затем щелкните Изменить и Опубликовать.
Все примеры основаны на базовом шаблоне, который представлен в примере ниже. Этот шаблон можно использовать для создания собственных модулей runbook, которые можно применять в сценариях предварительного и последующего выполнения. В шаблон уже включена вся необходимая логика для проверки подлинности в Azure и обработки параметра SoftwareUpdateConfigurationRunContext
.
<#
.SYNOPSIS
Barebones script for Update Management Pre/Post
.DESCRIPTION
This script is intended to be run as a part of Update Management pre/post-scripts.
It requires the Automation account's system-assigned managed identity.
.PARAMETER SoftwareUpdateConfigurationRunContext
This is a system variable which is automatically passed in by Update Management during a deployment.
#>
param(
[string]$SoftwareUpdateConfigurationRunContext
)
#region BoilerplateAuthentication
# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process
# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context
# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
#endregion BoilerplateAuthentication
#If you wish to use the run context, it must be converted from JSON
$context = ConvertFrom-Json $SoftwareUpdateConfigurationRunContext
#Access the properties of the SoftwareUpdateConfigurationRunContext
$vmIds = $context.SoftwareUpdateConfigurationSettings.AzureVirtualMachines | Sort-Object -Unique
$runId = $context.SoftwareUpdateConfigurationRunId
Write-Output $context
#Example: How to create and write to a variable using the pre-script:
<#
#Create variable named after this run so it can be retrieved
New-AzAutomationVariable -ResourceGroupName $ResourceGroup -AutomationAccountName $AutomationAccount -Name $runId -Value "" -Encrypted $false
#Set value of variable
Set-AutomationVariable -Name $runId -Value $vmIds
#>
#Example: How to retrieve information from a variable set during the pre-script
<#
$variable = Get-AutomationVariable -Name $runId
#>
Если вы хотите, чтобы модуль runbook выполнялся с управляемым удостоверением, назначаемым системой, оставьте код как есть. Если вы предпочитаете использовать управляемое удостоверение, назначаемое пользователем, сделайте следующее:
- Из строки 22 удалите ,
$AzureContext = (Connect-AzAccount -Identity).context
- Замените его
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
. - Введите идентификатор клиента.
Примечание.
Для неграфических модулей runbook PowerShell Add-AzAccount
и Add-AzureRMAccount
являются псевдонимами для Connect-AzAccount. Вы можете использовать эти командлеты или обновить модули в учетной записи службы автоматизации до последних версий. Обновление модулей может потребоваться, даже если учетная запись службы автоматизации только что создана.
Следующие шаги
Подробнее об управлении обновлениями см. в статье Управление обновлениями и исправлениями для виртуальных машин.