Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается использование Bicep и скрипта развертывания для приостановки развертывания, пока свойство ресурса не возвращает определенное значение. Этот метод можно использовать, чтобы обеспечить успешное развертывание, даже если развернутый ресурс сообщает Azure Resource Manager о своей готовности, а базовые ресурсы еще не готовы. В этом случае развернутый ресурс еще не готов взаимодействовать с остальной частью развертывания, что означает, что требуется пауза.
В этой статье используется сценарий Виртуальная глобальная сеть Azure для демонстрации метода. Следующие файлы содержат реализацию механизма проверки ресурсов и паузы в работе.
Вы можете адаптировать файлы для развертывания. Чтобы помочь вам, параметризован модуль azResourceStateCheck.bicep. Свойство dependsOn используется в orchestration.bicep, чтобы убедиться, что развертывание модуля vwanvhcs.bicep зависит от развертывания модуля azResourceStateCheck.bicep.
Architecture
Скачайте файл Visio для этой архитектуры.
Просмотрите и скачайте примеры кода в GitHub для этой архитектуры.
Отправьте файл orchestration.bicep для развертывания в диспетчере ресурсов на уровне подписки.
Note
Этот файл Bicep и другие файлы, используемые для этого примера, можно получить из каталога infra/samples/deployment-scripts-property-check. Частичная организация файлов в репозитории отображается в правой части схемы архитектуры.
Файл orchestration.bicep создает группу ресурсов в рамках подписки.
Файл orchestration.bicep развертывает Виртуальная глобальная сеть и периферийные виртуальные сети.
Orchestration.bicep развертывает модуль vwan.bicep, который развертывает Виртуальная глобальная сеть в области группы ресурсов.
Orchestration.bicep развертывает модуль vnet.bicep, который размещает виртуальные сети на уровне группы ресурсов.
Виртуальные сети Виртуальная глобальная сеть и спицевые виртуальные сети развертываются параллельно, так как Bicep считает их независимыми друг от друга. Зависимости определяют порядок развертывания в Bicep. Ресурс развертывается перед любым ресурсом, который зависит от него. Дополнительные сведения о зависимостях ресурсов в Bicep, включая явные и неявные зависимости, см. в разделе "Зависимости ресурсов" в Bicep.
Файл orchestration.bicep развертывает модуль vwanhub.bicep, который развертывает узел (хаб) виртуальной WAN в области группы ресурсов. Концентратор неявно зависит от Виртуальная глобальная сеть, что означает, что развертывание концентратора происходит только после завершения развертывания Виртуальная глобальная сеть.
Файл orchestration.bicep развертывает модуль azResourceStateCheck.bicep, который создает управляемое пользователем удостоверение и назначает группе ресурсов роль Читатель в системе управления доступом на основе ролей (RBAC) Azure.
Модуль azResourceStateCheck.bicep развертывает ресурс скрипта развертывания.
Ресурс скрипта развертывания использует управляемое удостоверение, назначаемое пользователем, для проверки подлинности Resource Manager. Затем ресурс запускает скрипт развертывания PowerShell, Invoke-AzResourceStateCheck.ps1. Дополнительные сведения о сценариях развертывания см. в разделе "Использование сценариев развертывания" в Bicep.
Скрипт опрашивает свойство узла Виртуальная глобальная сеть
routingState, чтобы определить, является ли значениеProvisioned:Если значение свойства не равно
Provisioned, скрипт приостанавливается на длительность, указанную параметром в файле orchestration.bicep и передаётся модулю azResourceStateCheck.bicep. Затем скрипт снова проверяетroutingStateзначение свойства.Скрипт повторяет цикл приостановки и проверки. Параметр в файле orchestration.bicep определяет максимальное количество итераций. Если значение свойства не
Provisionedпосле максимального числа итераций, скрипт вызывает исключение и завершает работу, что приводит к остановке выполнения и сбою остальной части развертывания Bicep.Если значение свойства равно
Provisioned, скрипт развертывания завершает работу с кодом(0)успешного выполнения.
Если скрипт развертывания выполнен успешно, файл orchestration.bicep развертывает модуль vwanvhcs.bicep, который создает подключения между периферийными виртуальными сетями и центром Виртуальная глобальная сеть.
Определение модуля vwanvhcs.bicep, который находится в orchestration.bicep, имеет
dependsOnпредложение, которое вызывает явную зависимость модуля vwanvhcs.bicep от успешного завершения модуля azResourceStateCheck.bicep. Подключения создаются только тогда, когда свойствоroutingStateравноProvisioned.Модуль vwanvhcs.bicep развертывает подключения концентратора Виртуальная глобальная сеть последовательно, а не параллельно, так как параллельное развертывание не поддерживается для одного Виртуальная глобальная сеть концентратора. Чтобы задать размер пакета
1, модуль использует декоратор BicepbatchSize@batchSize(1). Этот декоратор гарантирует, что подключения развертываются поочередно.
Подробности сценария
Ключевыми компонентами этой архитектуры являются модуль azResourceStateCheck.bicep, который развертывает ресурс скрипта развертывания и связанный скрипт развертывания Invoke-AzResourceStateCheck.ps1, который является файлом PowerShell. Модуль использует скрипт развертывания для проверки значения свойства ресурса. В этом примере ресурс является концентратором виртуальной глобальной сети.
Вы можете использовать dependsOn для явной зависимости одного модуля от другого, так как эта среда развертывается из одного файла, использующего модули Bicep. В этом примере dependsOn модуль vwanvhcs.bicep зависит от модуля azResourceStateCheck.bicep.
Следующий фрагмент из orchestration.bicep показывает использование dependsOn.
@description('The API version of the Azure Resource you need to use to check the state of a property.')
param parAzResourceApiVersion string = '2022-01-01'
@description('The property of the resource that you need to check. This is a property inside the `properties` bag of the resource that's captured from a GET call to the Resource ID.')
param parAzResourcePropertyToCheck string = 'routingState'
@description('The value of the property of the resource that you need to check.')
param parAzResourceDesiredState string = 'Provisioned'
@description('The duration that the deployment script waits between check or polling requests to check the property and its state, if it is not in its desired state. The duration defaults to `30` seconds.')
param parWaitInSecondsBetweenIterations int = 30
module modVWANHub 'modules/vwanHub.bicep' = {
scope: rsg
name: 'deployVWANHub'
params: {
region: region
regionNamePrefix: regionNamePrefix
defaultTags: defaultTags
vwanHubCIDR: vwanHubCIDR
vwanName: modVWAN.outputs.vwanName
}
}
module modVWANHubRouterCheckerDeploymentScript 'modules/azResourceStateCheck.bicep' = {
scope: rsg
name: 'deployVWANHubRouterChecker'
params: {
parLocation: region
parAzResourceId: modVWANHub.outputs.outVwanVHubId
parAzResourceApiVersion: parAzResourceApiVersion
parAzResourcePropertyToCheck: parAzResourcePropertyToCheck
parAzResourceDesiredState: parAzResourceDesiredState
parMaxIterations: parMaxIterations
parWaitInSecondsBetweenIterations: parWaitInSecondsBetweenIterations
}
}
module modVWanVhubVnetConnections 'modules/vwanVhcs.bicep' = {
dependsOn: [
modVWANHubRouterCheckerDeploymentScript
]
scope: rsg
name: 'deployConnectVnetsToVWANVHub'
params: {
vnets: vnets
regionNamePrefix: regionNamePrefix
}
}
Проверка ресурсов требуется, так как развернутые центры Виртуальная глобальная сеть не готовы к использованию, пока свойство routingState имеет значение Provisioned. Концентраторы Виртуальная глобальная сеть сообщают об успешном развертывании в Resource Manager, чтобы модуль развертывания мог продолжить развертывание. Новый центр Виртуальная глобальная сеть становится операционным после развертывания маршрутизатора Виртуальная глобальная сеть в созданном концентраторе. Этот процесс занимает около 15 минут. Это поведение можно увидеть на следующем снимке экрана нового центра Виртуальная глобальная сеть. На снимке экрана показано состояние концентратора Succeeded, однако состояние маршрутизации Provisioning.
Если вы попытаетесь развернуть модуль vwanvhcs.bicep до того, как значение routingState станет Provisioned, создание подключения завершится ошибкой, и общее развертывание также завершится сбоем. Пока маршрутизатор не будет настроен, попытки повторного развертывания также заканчиваются неудачей.
На следующем снимке экрана показан пример журнала выполнения скрипта развертывания во время routingState проверок концентратора Виртуальная глобальная сеть. В журнале показаны повторяющиеся проверки свойства, возвращающего значение, отличное от Provisioned.
Снимок экрана, показывающий скрипт развертывания, опрашивающий свойство состояния маршрутизации концентратора виртуальной сети WAN.
На следующем снимке экрана показано, что значение изменяется на Provisioned.
Если значение не изменится на Provisioned после максимального количества итерации, скрипт создает исключение, которое сигнализирует о сбое ресурса скрипта Resource Manager. Подсистема развертывания Resource Manager завершается сбоем и останавливает развертывание, так как исключение предполагает, что возникла проблема с ресурсом Azure, требующим устранения неполадок. Дополнительные сведения см. в следующем скрипте Invoke-AzResourceStateCheck.ps1.
[CmdletBinding()]
param (
[string]
$azResourceResourceId,
[string]
$apiVersion = "2022-05-01",
[string]
$azResourcePropertyToCheck = "provisioningState",
[string]
$azResourceDesiredState = "Provisioned",
[int]
$waitInSecondsBetweenIterations = 30,
[int]
$maxIterations = 30
)
$totalTimeoutCalculation = $waitInSecondsBetweenIterations * $maxIterations
$azResourcePropertyExistenceCheck = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"
if ($azResourcePropertyExistenceCheck.StatusCode -ne "200") {
$DeploymentScriptOutputs["azResourcePropertyState"] = "Not Found"
throw "Unable to get Azure Resource - $($azResourceResourceId). Likely it doesn't exist. Status code: $($azResourcePropertyExistenceCheck.StatusCode) Error: $($azResourcePropertyExistenceCheck.Content)"
}
$azResourcePropertyStateResult = "Unknown"
$iterationCount = 0
do {
$azResourcePropertyStateGet = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"
$azResourcePropertyStateJsonConverted = $azResourcePropertyStateGet.Content | ConvertFrom-Json -Depth 10
$azResourcePropertyStateResult = $azResourcePropertyStateJsonConverted.properties.$($azResourcePropertyToCheck)
if ($azResourcePropertyStateResult -ne $azResourceDesiredState) {
Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is not in $($azResourceDesiredState) state. Waiting $($waitInSecondsBetweenIterations) seconds before checking again. Iteration count: $($iterationCount)"
Start-Sleep -Seconds $waitInSecondsBetweenIterations
$iterationCount++
}
} while (
$azResourcePropertyStateResult -ne $azResourceDesiredState -and $iterationCount -ne $maxIterations
)
if ($azResourcePropertyStateResult -eq $azResourceDesiredState) {
Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is now in $($azResourceDesiredState) state."
$DeploymentScriptOutputs["azResourcePropertyState"] = "$($azResourceDesiredState)"
}
if ($iterationCount -eq $maxIterations -and $azResourcePropertyStateResult -ne $azResourceDesiredState) {
$DeploymentScriptOutputs["azResourcePropertyState"] = "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in desired state of $($azResourceDesiredState). Timeout reached of $($totalTimeoutCalculation) seconds."
throw "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in $($azResourceDesiredState) state after $($totalTimeoutCalculation) seconds."
}
Соавторы
Microsoft поддерживает эту статью. Следующие авторы написали эту статью.
Основной автор:
- Джек Tracey | Старший архитектор облачных решений
Другой участник:
- Гэри МакМахон | Старший архитектор облачных решений
Чтобы увидеть непубличные профили в LinkedIn, войдите в LinkedIn.
Дальнейшие действия
- Файлы для примера в репозитории Azure илиCAE-Bits
- Использование скриптов развертывания в Bicep
- Модуль Learn: расширение шаблонов Bicep и ARM с помощью сценариев развертывания
- Все, что вы хотели знать об исключениях
- Перейти на Виртуальная глобальная сеть
- Зависимости ресурсов в Bicep
- Документация по Bicep