Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u Bicep en een implementatiescript gebruikt om een implementatie te onderbreken totdat een resource-eigenschap een specifieke waarde retourneert. U kunt deze techniek gebruiken om ervoor te zorgen dat een implementatie slaagt als de geïmplementeerde resource rapporteert aan Azure Resource Manager dat deze gereed is, maar dat de onderliggende resources niet zijn. In dit geval is de geïmplementeerde resource nog niet gereed om te communiceren met de rest van de implementatie, wat betekent dat er een pauze is vereist.
In dit artikel wordt een Azure Virtual WAN scenario gebruikt om de techniek te demonstreren. De volgende bestanden bevatten een resourcecontrole en pauzering implementatie:
U kunt de bestanden voor uw implementatie aanpassen. Om u te helpen, wordt de module azResourceStateCheck.bicep geparameteriseerd. De dependsOn eigenschap wordt gebruikt in orchestration.bicep om ervoor te zorgen dat de implementatie van de vwanvhcs.bicep-module afhankelijk is van de implementatie van de azResourceStateCheck.bicep-module.
Architecture
Een Visio-bestand van deze architectuur downloaden.
Bekijk en download de codevoorbeelden in GitHub voor deze architectuur.
Verzend het orchestration.bicep-bestand voor implementatie naar Resource Manager op het abonnementsbereik.
Note
U kunt dit Bicep bestand en de andere bestanden ophalen die voor dit voorbeeld worden gebruikt in de map infra/samples/deployment-scripts-property-check directory. Aan de rechterkant van het architectuurdiagram wordt een gedeeltelijke organisatie van de bestanden in de opslagplaats weergegeven.
Het orchestration.bicep-bestand maakt een resourcegroep binnen het abonnementsbereik.
Het orchestration.bicep-bestand implementeert de Virtual WAN en de virtuele spoke-netwerken.
orchestration.bicep implementeert de module vwan.bicep, waarmee de Virtual WAN binnen het bereik van de resourcegroep wordt geïmplementeerd.
orchestration.bicep implementeert de module vnet.bicep, waarmee de virtuele netwerken binnen het bereik van de resourcegroep worden geïmplementeerd.
De virtuele Virtual WAN- en spoke-netwerken worden parallel geïmplementeerd omdat Bicep deze als onafhankelijk van elkaar beschouwt. Afhankelijkheden bepalen de volgorde van de implementatie in Bicep. Een resource wordt geïmplementeerd voordat een resource ervan afhankelijk is. Zie Resourceafhankelijkheden in Bicep voor meer informatie over resourceafhankelijkheden, waaronder expliciete en impliciete afhankelijkheden.
Het orchestration.bicep-bestand implementeert de module vwanhub.bicep, waarmee de Virtual WAN hub binnen het bereik van de resourcegroep wordt geïmplementeerd. De hub is impliciet afhankelijk van de Virtual WAN, wat betekent dat de hub-implementatie pas plaatsvindt nadat de Virtual WAN-implementatie is voltooid.
Het bestand orchestration.bicep implementeert de azResourceStateCheck.bicep-module, dat een gebruikerstoegedichte beheerde identiteit maakt en de Reader-rol voor Azure rolgebaseerde toegangscontrole (RBAC) toewijst aan de resourcegroep.
De module azResourceStateCheck.bicep implementeert de implementatiescriptresource.
De implementatiescriptresource maakt gebruik van de door de gebruiker toegewezen beheerde identiteit voor Resource Manager verificatie. De resource voert vervolgens het PowerShell-implementatiescript uit, Invoke-AzResourceStateCheck.ps1. Zie Implementatiescripts gebruiken in Bicep voor meer informatie over implementatiescripts.
Het script peilt de eigenschap Virtual WAN hub
routingStateom te bepalen of de waardeProvisionedis:Als de eigenschapswaarde niet
Provisionedis, wordt het script onderbroken voor een duur die is opgegeven door een parameter die is ingesteld in het bestand orchestration.bicep en wordt doorgegeven aan de module azResourceStateCheck.bicep. Het script controleert vervolgens deroutingStateeigenschapswaarde opnieuw.Het script herhaalt de onderbrekings- en controlecyclus. Een parameter in het orchestration.bicep-bestand bepaalt het maximum aantal iteraties. Als de eigenschapswaarde na het maximum aantal iteraties niet
Provisionedis, genereert het script een uitzondering, en wordt het afgesloten, waardoor de resterende Bicep-implementatie stopt en mislukt.Als de waarde van de eigenschap is
Provisioned, wordt het implementatiescript afgesloten met een succescode(0).
Als het implementatiescript slaagt, implementeert het bestand orchestration.bicep de vwanvhcs.bicep-module, waarmee de verbindingen tussen de virtuele spoke-netwerken en de Virtual WAN hub worden gemaakt.
De definitie van de vwanvhcs.bicep-module die zich in orchestration.bicep bevindt, heeft een
dependsOncomponent die ervoor zorgt dat vwanvhcs.bicep expliciet afhankelijk is van de succesvolle voltooiing van de module azResourceStateCheck.bicep. Daarom worden de verbindingen alleen gemaakt als deroutingStateeigenschap isProvisioned.De vwanvhcs.bicep-module implementeert de Virtual WAN hubverbindingen opeenvolgend in plaats van parallel, omdat parallelle implementatie niet wordt ondersteund voor één Virtual WAN hub. Als u de batchgrootte wilt instellen op
1, gebruikt de module de BicepbatchSizedecorator,@batchSize(1). Deze decorator zorgt ervoor dat de verbindingen één voor één worden geïmplementeerd.
Details van het scenario
De belangrijkste onderdelen van deze architectuur zijn de azResourceStateCheck.bicep-module, die de implementatiescriptresource implementeert en het bijbehorende implementatiescript Invoke-AzResourceStateCheck.ps1, een PowerShell-bestand. De module gebruikt het implementatiescript om de waarde van een resource-eigenschap te controleren. In dit voorbeeld is de resource een Virtual WAN-hub.
U kunt dependsOn gebruiken om één module expliciet afhankelijk te maken van een andere, omdat deze omgeving wordt geïmplementeerd vanuit één bestand dat gebruikmaakt van Bicep modules. In dit voorbeeld dependsOn is de module vwanvhcs.bicep afhankelijk van de module azResourceStateCheck.bicep.
Het volgende fragment uit orchestration.bicep laat het gebruik van dependsOn zien:
@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
}
}
De resourcecontrole is vereist omdat geïmplementeerde Virtual WAN hubs pas gereed zijn voor gebruik als de eigenschap routingState de waarde van Provisioned heeft. Virtual WAN hubs rapporteren dat de implementatie is geslaagd voor Resource Manager, zodat de implementatie-engine doorgaat met de implementatie. Er wordt een nieuwe Virtual WAN hub operationeel nadat de Virtual WAN hub-router is ingericht in de aangemaakte hub. Dit proces duurt ongeveer 15 minuten. Dit gedrag kan worden weergegeven in de volgende schermopname van een nieuwe Virtual WAN hub. De schermopname toont een hubstatus van Succeeded maar een routeringsstatus van Provisioning.
Als u probeert de vwanvhcs.bicep-module te implementeren voordat de waarde routingState is, dan mislukt het maken van de Provisioned-verbinding en mislukt de algehele implementatie. Totdat de router is geconfigureerd, zullen pogingen tot opnieuw implementeren ook mislukken.
In de volgende schermopname ziet u een voorbeeld van het implementatiescriptlogboek tijdens routingState controles van de Virtual WAN hub. In het logboek worden herhaalde controles van de eigenschap weergegeven die een andere waarde retourneren dan Provisioned.
In de volgende schermopname ziet u dat de waarde verandert in Provisioned.
Als de waarde na het maximum aantal iteraties niet verandert in Provisioned, genereert het script een uitzondering, die aangeeft dat de scriptresource faalt in het communiceren met de Resource Manager. De Resource Manager implementatie-engine mislukt en stopt de implementatie omdat de uitzondering suggereert dat er een probleem is met de Azure resource waarvoor probleemoplossing is vereist. Zie het volgende Invoke-AzResourceStateCheck.ps1 script voor meer informatie.
[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."
}
Contributors
Microsoft onderhoudt dit artikel. De volgende inzenders hebben dit artikel geschreven.
Hoofdauteur:
- Jack Tracey | Senior Cloudoplossingen Architect
Andere bijdrager:
- Gary McMahon | Senior Cloudoplossingenarchitect
Als u niet-openbare LinkedIn-profielen wilt zien, meldt u zich aan bij LinkedIn.
Volgende stappen
- Bestanden voor het voorbeeld in de Azure/CAE-Bits-opslagplaats
- Implementatiescripts gebruiken in Bicep
- Learn-module: Bicep- en ARM-sjablonen uitbreiden met behulp van implementatiescripts
- Alles wat u wilde weten over uitzonderingen
- Migrate to Virtual WAN
- Resourceafhankelijkheden in Bicep
- Bicep-documentatie