Použijte skripty nasazení ke kontrole vlastností prostředků

Tento článek popisuje, jak pomocí Bicep a skriptu nasazení pozastavit nasazení, dokud vlastnost prostředku nevrátí určitou hodnotu. Pomocí této techniky můžete zajistit úspěch nasazení, pokud nasazený prostředek Azure Resource Manageru hlásí, že je připraven, ale podkladové prostředky připravené nejsou. V takovém případě nasazený prostředek ještě není připravený k interakci se zbytkem nasazení, což znamená, že se vyžaduje pozastavení.

Tento článek používá Azure Virtual WAN scénář k předvedení techniky. Mezi následující soubory patří kontrola prostředků a pozastavení implementace:

Soubory můžete přizpůsobit pro vaše nasazení. Modul azResourceStateCheck.bicep je parametrizován, aby vám pomohl. Vlastnost dependsOn se používá v orchestration.bicep k zajištění, že nasazení modulu vwanvhcs.bicep závisí na nasazení modulu azResourceStateCheck.bicep.

Architecture

Diagram znázorňující architekturu Bicep a nasazovacích skriptů.

Stáhněte si soubor aplikace Visio s touto architekturou.

Projděte si a stáhněte ukázky kódu v GitHubu pro tuto architekturu.

  1. Odešlete soubor orchestration.bicep pro nasazení do Správce prostředků v rámci předplatného.

    Note

    Tento soubor Bicep a další soubory, které se v tomto příkladu používají, získáte z adresáře infra/samples/deployment-scripts-property-check. Na pravé straně diagramu architektury se zobrazí částečná organizace souborů v úložišti.

  2. Soubor orchestration.bicep vytvoří skupinu prostředků v oboru předplatného.

  3. Soubor orchestration.bicep nasadí Virtual WAN a paprskové virtuální sítě.

    • orchestration.bicep nasadí modul vwan.bicep, který nasadí Virtual WAN v rámci skupiny prostředků.

    • orchestration.bicep nasadí modul vnet.bicep, který nasadí virtuální sítě v oboru skupiny prostředků.

    Virtual WAN a paprskové virtuální sítě se nasazují paralelně, protože Bicep je považuje za nezávislé. Závislosti určují pořadí nasazení v Bicep. Prostředek se nasadí před libovolným prostředkem, který na něm závisí. Další informace o závislostech prostředků v Bicep, včetně explicitních a implicitních závislostí, najdete v Závislosti prostředků v Bicep.

  4. Soubor orchestration.bicep nasadí modul vwanhub.bicep, který vytvoří centrum Virtual WAN na úrovni skupiny prostředků. Centrum závisí implicitně na Virtual WAN, což znamená, že nasazení centra proběhne až po dokončení nasazení Virtual WAN.

  5. Soubor orchestration.bicep nasadí modul azResourceStateCheck.bicep, který vytvoří spravovanou identitu přiřazenou uživatelem a přiřadí roli čtenáře přístupu na základě role (RBAC) Azure ke skupině prostředků.

  6. Modul azResourceStateCheck.bicep nasadí prostředek skriptu nasazení.

  7. Prostředek skriptu nasazení používá uživatelsky přiřazenou spravovanou identitu k ověření Resource Managerem. Prostředek pak spustí skript nasazení PowerShellu Invoke-AzResourceStateCheck.ps1. Další informace o skriptech pro nasazení naleznete v Používání nasazovacích skriptů v Bicep.

    Skript se dotazuje na vlastnost routingState centra Virtual WAN a určí, jestli je hodnota Provisioned:

    1. Pokud hodnota vlastnosti není Provisioned, skript se pozastaví po dobu trvání určenou parametrem nastaveným v souboru orchestration.bicep a předá se modulu azResourceStateCheck.bicep. Skript pak znovu zkontroluje routingState hodnotu vlastnosti.

      Skript zopakuje cyklus pozastavení a kontroly. Parametr v souboru orchestration.bicep určuje maximální počet iterací. Pokud hodnota vlastnosti není Provisioned po maximálním počtu iterací, skript vygeneruje výjimku a ukončí, což způsobí zastavení a selhání zbývající části nasazení Bicep.

    2. Pokud je hodnota vlastnosti Provisioned, nasazovací skript se ukončí s kódem úspěchu (0).

  8. Pokud skript nasazení proběhne úspěšně, soubor orchestration.bicep nasadí modul vwanvhcs.bicep, který vytvoří připojení mezi paprskovými virtuálními sítěmi a centrem Virtual WAN.

    Definice modulu vwanvhcs.bicep, který je v orchestration.bicep, má dependsOn klauzuli, která způsobí, že vwanvhcs.bicep explicitně závisí na úspěšném dokončení modulu azResourceStateCheck.bicep. Proto jsou připojení vytvořena pouze v případě, že vlastnost routingState je Provisioned.

    Modul vwanvhcs.bicep nasadí připojení centra Virtual WAN postupně místo paralelně, protože pro jedno centrum Virtual WAN se nepodporuje paralelní nasazení. Pro nastavení velikosti dávky na 1 používá modul dekorátor Bicep batchSize@batchSize(1). Tento dekorátor zajistí, že připojení budou nasazena jedno po druhém.

Podrobnosti scénáře

Klíčové části této architektury jsou modul azResourceStateCheck.bicep, který nasazuje prostředek skriptu pro nasazení a přidružený skript nasazení Invoke-AzResourceStateCheck.ps1, což je soubor ve formátu PowerShell. Modul pomocí skriptu nasazení zkontroluje hodnotu vlastnosti prostředku. V tomto příkladu je prostředkem Virtual WAN hub.

Pomocí dependsOn můžete vytvořit, aby jeden modul byl explicitně závislý na jiném, protože toto prostředí je nasazené z jednoho souboru, který používá moduly Bicep. V tomto příkladu dependsOn je modul vwanvhcs.bicep závislý na modulu azResourceStateCheck.bicep.

Následující výňatek z orchestration.bicep ukazuje použití 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
  }
}

Kontrola prostředků se vyžaduje, protože nasazená centra Virtual WAN nejsou připravená k použití, dokud vlastnost routingState nemá hodnotu Provisioned. Virtual WAN centra hlásí úspěšné nasazení do Resource Manager, aby nasazovací modul mohl pokračovat v nasazování. Nový Virtual WAN hub se stane funkčním po zřízení směrovače do vytvořeného hubu. Tento proces trvá přibližně 15 minut. Toto chování můžete vidět na následujícím snímku obrazovky nového centra Virtual WAN. Snímek obrazovky zobrazuje stav centra Succeeded, ale stav směrování Provisioning.

Screenshot nově nasazeného centra Virtual WAN. Stav centra je úspěšný a stav směrování je Provisioning.

Pokud se pokusíte nasadit modul vwanvhcs.bicep před routingState hodnotou Provisioned, vytvoření připojení selže a celkové nasazení selže. Dokud se směrovač nezprovozní, selžou také pokusy o opětovné nasazení.

Následující snímek obrazovky ukazuje příklad protokolu skriptu nasazení během kontroly routingState centra Virtual WAN. Protokol zobrazuje opakované kontroly vlastnosti, které vrací jinou hodnotu než Provisioned.

Screenshot zobrazující skript nasazení dotazující se na vlastnost Virtual WAN hub routingState.

Následující snímek obrazovky ukazuje, že hodnota se změní na Provisioned.

Screenshot, která zobrazuje dokončení skriptu nasazení, když se vlastnost routingState centra Virtual WAN změní na

Pokud se hodnota nezmění na Provisioned po maximálním počtu iterací, skript vygeneruje výjimku, která signalizuje selhání prostředku skriptu Resource Manager. Modul nasazení Resource Manager selže a zastaví nasazení, protože výjimka naznačuje, že došlo k problému s prostředkem Azure, který vyžaduje řešení potíží. Další informace najdete v následujícím Invoke-AzResourceStateCheck.ps1 skriptu.

[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."
}

Přispěvatelé

Microsoft udržuje tento článek. Tento článek napsali následující přispěvatelé.

Hlavní autor:

  • Jack Tracey | Vedoucí architekt cloudových řešení

Další přispěvatel:

Pokud chcete zobrazit nepublikované profily LinkedIn, přihlaste se k LinkedIn.

Další kroky