Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
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.
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.
Soubor orchestration.bicep vytvoří skupinu prostředků v oboru předplatného.
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.
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.
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ů.
Modul azResourceStateCheck.bicep nasadí prostředek skriptu nasazení.
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
routingStatecentra Virtual WAN a určí, jestli je hodnotaProvisioned: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 zkontrolujeroutingStatehodnotu vlastnosti.Skript zopakuje cyklus pozastavení a kontroly. Parametr v souboru orchestration.bicep určuje maximální počet iterací. Pokud hodnota vlastnosti není
Provisionedpo 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.Pokud je hodnota vlastnosti
Provisioned, nasazovací skript se ukončí s kódem úspěchu(0).
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á
dependsOnklauzuli, 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 vlastnostroutingStatejeProvisioned.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
1používá modul dekorátor BicepbatchSize@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.
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.
Následující snímek obrazovky ukazuje, že hodnota se změní na Provisioned.
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:
- Gary McMahon | Vedoucí architekt cloudových řešení
Pokud chcete zobrazit nepublikované profily LinkedIn, přihlaste se k LinkedIn.
Další kroky
- Soubory pro příklad v úložišti Azure/CAE-Bits
- Používejte skripty nasazení v Bicep
- Modul Learn: Rozšíření šablon Bicep a ARM pomocí skriptů nasazení
- Všechno, co jste chtěli vědět o výjimkách
- Migrovat na virtuální WAN
- Závislosti prostředků v Bicep
- Dokumentace pro Bicep