Использование скриптов развертывания для проверки свойств ресурсов

В этой статье описывается использование Bicep и скрипта развертывания для приостановки развертывания, пока свойство ресурса не возвращает определенное значение. Этот метод можно использовать, чтобы обеспечить успешное развертывание, даже если развернутый ресурс сообщает Azure Resource Manager о своей готовности, а базовые ресурсы еще не готовы. В этом случае развернутый ресурс еще не готов взаимодействовать с остальной частью развертывания, что означает, что требуется пауза.

В этой статье используется сценарий Виртуальная глобальная сеть Azure для демонстрации метода. Следующие файлы содержат реализацию механизма проверки ресурсов и паузы в работе.

Вы можете адаптировать файлы для развертывания. Чтобы помочь вам, параметризован модуль azResourceStateCheck.bicep. Свойство dependsOn используется в orchestration.bicep, чтобы убедиться, что развертывание модуля vwanvhcs.bicep зависит от развертывания модуля azResourceStateCheck.bicep.

Architecture

Диаграмма, показывающая архитектуру Bicep и сценарий развертывания.

Схема, на которую показана архитектура развертывания, разделенная на две основные области. В левой части отображаются ресурсы Azure, созданные в пределах границы данной подписки. Граница включает группу ресурсов, содержащую Виртуальная глобальная сеть Azure. Виртуальная глобальная сеть содержит виртуальный концентратор, три виртуальные сети с подсетями, подключения виртуального концентратора и управляемое удостоверение, назначаемое пользователем, с назначенной ролью Читателя в Azure с управлением доступом на основе ролей (Azure RBAC). Ресурс скрипта развертывания имеет двустороннее подключение к управляемому удостоверению, назначаемого пользователем, и к трем подключениям виртуального концентратора, и выводится в виртуальный концентратор. В правой части показана структура файла модуля Bicep, которая включает orchestration.bicep с подключениями к папке модулей и к папке скриптов. Папка модулей содержит vnet.bicep, vwan.bicep, vwanhub.bicep, vwanvhcs.bicep и azResourceStateCheck.bicep. Папка скриптов содержит Invoke-AzResourceStateCheck.ps1.

Скачайте файл Visio для этой архитектуры.

Просмотрите и скачайте примеры кода в GitHub для этой архитектуры.

  1. Отправьте файл orchestration.bicep для развертывания в диспетчере ресурсов на уровне подписки.

    Note

    Этот файл Bicep и другие файлы, используемые для этого примера, можно получить из каталога infra/samples/deployment-scripts-property-check. Частичная организация файлов в репозитории отображается в правой части схемы архитектуры.

  2. Файл orchestration.bicep создает группу ресурсов в рамках подписки.

  3. Файл orchestration.bicep развертывает Виртуальная глобальная сеть и периферийные виртуальные сети.

    • Orchestration.bicep развертывает модуль vwan.bicep, который развертывает Виртуальная глобальная сеть в области группы ресурсов.

    • Orchestration.bicep развертывает модуль vnet.bicep, который размещает виртуальные сети на уровне группы ресурсов.

    Виртуальные сети Виртуальная глобальная сеть и спицевые виртуальные сети развертываются параллельно, так как Bicep считает их независимыми друг от друга. Зависимости определяют порядок развертывания в Bicep. Ресурс развертывается перед любым ресурсом, который зависит от него. Дополнительные сведения о зависимостях ресурсов в Bicep, включая явные и неявные зависимости, см. в разделе "Зависимости ресурсов" в Bicep.

  4. Файл orchestration.bicep развертывает модуль vwanhub.bicep, который развертывает узел (хаб) виртуальной WAN в области группы ресурсов. Концентратор неявно зависит от Виртуальная глобальная сеть, что означает, что развертывание концентратора происходит только после завершения развертывания Виртуальная глобальная сеть.

  5. Файл orchestration.bicep развертывает модуль azResourceStateCheck.bicep, который создает управляемое пользователем удостоверение и назначает группе ресурсов роль Читатель в системе управления доступом на основе ролей (RBAC) Azure.

  6. Модуль azResourceStateCheck.bicep развертывает ресурс скрипта развертывания.

  7. Ресурс скрипта развертывания использует управляемое удостоверение, назначаемое пользователем, для проверки подлинности Resource Manager. Затем ресурс запускает скрипт развертывания PowerShell, Invoke-AzResourceStateCheck.ps1. Дополнительные сведения о сценариях развертывания см. в разделе "Использование сценариев развертывания" в Bicep.

    Скрипт опрашивает свойство узла Виртуальная глобальная сеть routingState, чтобы определить, является ли значение Provisioned:

    1. Если значение свойства не равно Provisioned, скрипт приостанавливается на длительность, указанную параметром в файле orchestration.bicep и передаётся модулю azResourceStateCheck.bicep. Затем скрипт снова проверяет routingState значение свойства.

      Скрипт повторяет цикл приостановки и проверки. Параметр в файле orchestration.bicep определяет максимальное количество итераций. Если значение свойства не Provisioned после максимального числа итераций, скрипт вызывает исключение и завершает работу, что приводит к остановке выполнения и сбою остальной части развертывания Bicep.

    2. Если значение свойства равно Provisioned, скрипт развертывания завершает работу с кодом (0)успешного выполнения.

  8. Если скрипт развертывания выполнен успешно, файл orchestration.bicep развертывает модуль vwanvhcs.bicep, который создает подключения между периферийными виртуальными сетями и центром Виртуальная глобальная сеть.

    Определение модуля vwanvhcs.bicep, который находится в orchestration.bicep, имеет dependsOn предложение, которое вызывает явную зависимость модуля vwanvhcs.bicep от успешного завершения модуля azResourceStateCheck.bicep. Подключения создаются только тогда, когда свойство routingState равно Provisioned.

    Модуль vwanvhcs.bicep развертывает подключения концентратора Виртуальная глобальная сеть последовательно, а не параллельно, так как параллельное развертывание не поддерживается для одного Виртуальная глобальная сеть концентратора. Чтобы задать размер пакета 1, модуль использует декоратор Bicep batchSize@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.

Снимок экрана только что развернутого концентратора Виртуальная глобальная сеть. Состояние концентратора — успешно, а состояние маршрутизации — Provisioning.

Если вы попытаетесь развернуть модуль vwanvhcs.bicep до того, как значение routingState станет Provisioned, создание подключения завершится ошибкой, и общее развертывание также завершится сбоем. Пока маршрутизатор не будет настроен, попытки повторного развертывания также заканчиваются неудачей.

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

Снимок экрана, показывающий скрипт развертывания, опрашивающий свойство состояния маршрутизации концентратора виртуальной сети WAN.

На следующем снимке экрана показано, что значение изменяется на Provisioned.

Screenshot, показывающий завершение скрипта развертывания при изменении свойства маршрутизации концентратора Виртуальная глобальная сеть на 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.

Дальнейшие действия