Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie Bicep und ein Bereitstellungsskript verwenden, um eine Bereitstellung anzuhalten, bis eine Ressourceneigenschaft einen bestimmten Wert zurückgibt. Sie können diese Technik verwenden, um sicherzustellen, dass eine Bereitstellung erfolgreich ist, wenn die bereitgestellte Ressource Azure Resource Manager meldet, dass sie bereit ist, aber die zugrunde liegenden Ressourcen es nicht sind. In diesem Fall ist die bereitgestellte Ressource noch nicht bereit, mit dem Rest der Bereitstellung zu interagieren, was bedeutet, dass eine Pause erforderlich ist.
In diesem Artikel wird ein Azure Virtual WAN Szenario verwendet, um die Technik zu veranschaulichen. Zu den folgenden Dateien gehören eine Ressourcenüberprüfung und eine Pausenimplementierung:
Sie können die Dateien für Ihre Bereitstellung anpassen. Um Ihnen zu helfen, wird das AzResourceStateCheck.bicep-Modul parametrisiert. Die dependsOn Eigenschaft wird in orchestration.bicep verwendet, um sicherzustellen, dass die vwanvhcs.bicep-Modulbereitstellung von der AzResourceStateCheck.bicep-Modulbereitstellung abhängt.
Architektur
Laden Sie eine Visio-Datei dieser Architektur herunter.
Überprüfen und herunterladen Sie die Codebeispiele in GitHub für diese Architektur.
Reichen Sie die Datei "orchestration.bicep" zur Bereitstellung bei Resource Manager auf der Abonnementebene ein.
Hinweis
Sie können diese Bicep Datei und die anderen Dateien abrufen, die für dieses Beispiel verwendet werden, aus dem Verzeichnis infra/samples/deployment-scripts-property-check directory. Auf der rechten Seite des Architekturdiagramms wird eine partielle Organisation der Dateien im Repository angezeigt.
Die Datei "orchestration.bicep" erstellt eine Ressourcengruppe auf Abonnementebene.
Die Datei "orchestration.bicep" stellt das Virtual WAN und die Spokenetzwerke bereit.
orchestration.bicep stellt das Modul vwan.bicep bereit, das die Virtual WAN im Ressourcengruppenbereich bereitstellt.
orchestration.bicep stellt das Modul vnet.bicep bereit, das die virtuellen Netzwerke im Ressourcengruppenbereich bereitstellt.
Die virtuelle WAN- und gespeichte virtuellen Netzwerke werden parallel bereitgestellt, da Bicep sie als unabhängig voneinander betrachtet. Abhängigkeiten bestimmen die Bereitstellungsreihenfolge in Bicep. Eine Ressource wird vor jeder Ressource bereitgestellt, die davon abhängt. Weitere Informationen zu Ressourcenabhängigkeiten in Bicep, einschließlich expliziter und impliziter Abhängigkeiten, finden Sie unter Ressourcenabhängigkeiten in Bicep.
Die Datei "orchestration.bicep" stellt das Modul vwanhub.bicep bereit, das den Virtual WAN Hub im Ressourcengruppenbereich bereitstellt. Der Hub hängt implizit vom Virtual WAN ab, was bedeutet, dass die Hubbereitstellung erst nach Abschluss der Virtual WAN Bereitstellung erfolgt.
Die Datei "orchestration.bicep" stellt das Modul "azResourceStateCheck.bicep" bereit, das eine benutzerdefinierte verwaltete Identität erstellt und der Ressourcengruppe die Azure-Rollenbasierte Zugriffssteuerung (RBAC) Leserrolle zuweist.
Das AzResourceStateCheck.bicep-Modul stellt die Bereitstellungsskriptressource bereit.
Die Bereitstellungsskriptressource verwendet die vom Benutzer zugewiesene verwaltete Identität für Resource Manager Authentifizierung. Die Ressource führt dann das PowerShell-Bereitstellungsskript Invoke-AzResourceStateCheck.ps1aus. Weitere Informationen zu Bereitstellungsskripts finden Sie unter Verwenden von Bereitstellungsskripts in Bicep.
Das Skript fragt die eigenschaft Virtual WAN hub
routingStateab, um zu bestimmen, ob der WertProvisionedist:Wenn der Eigenschaftswert nicht
Provisionedist, wird das Skript für eine Dauer angehalten, die durch einen Parameter in der Datei "orchestration.bicep" festgelegt ist und an das AzResourceStateCheck.bicep-Modul übergeben wird. Das Skript überprüft dann denroutingStateEigenschaftswert erneut.Das Skript wiederholt den Pausen- und Überprüfungszyklus. Ein Parameter in der Datei "orchestration.bicep" bestimmt die maximale Anzahl von Iterationen. Wenn der Eigenschaftswert nach der maximalen Anzahl von Iterationen nicht
Provisionedist, generiert das Skript eine Ausnahme und beendet, wodurch der Rest der Bicep Bereitstellung beendet und fehlschlägt.Wenn der Eigenschaftswert lautet
Provisioned, wird das Bereitstellungsskript mit einem Erfolgscode(0)beendet.
Wenn das Bereitstellungsskript erfolgreich ist, stellt die Datei "orchestration.bicep" das Modul vwanvhcs.bicep bereit, das die Verbindungen zwischen den virtuellen Speichennetzwerken und dem Virtual WAN Hub erstellt.
Die Definition des vwanvhcs.bicep-Moduls, das sich in orchestration.bicep befindet, hat eine
dependsOnKlausel, die bewirkt, dass vwanvhcs.bicep explizit vom erfolgreichen Abschluss des azResourceStateCheck.bicep-Moduls abhängt. Daher werden die Verbindungen nur erstellt, wenn dieroutingStateEigenschaft lautetProvisioned.Das Modul vwanvhcs.bicep stellt die Virtual WAN Hubverbindungen sequenziell und nicht parallel bereit, da die parallele Bereitstellung für einen einzelnen Virtual WAN Hub nicht unterstützt wird. Um die Batchgröße auf
1festzulegen, verwendet das Modul den BicepbatchSize-Dekorateur@batchSize(1). Dieser Dekorator stellt sicher, dass die Verbindungen nacheinander implementiert werden.
Details zum Szenario
Die wichtigsten Teile dieser Architektur sind das AzResourceStateCheck.bicep-Modul, das die Bereitstellungsskriptressource bereitstellt, und das zugeordnete Bereitstellungsskript Invoke-AzResourceStateCheck.ps1, bei dem es sich um eine PowerShell-Datei handelt. Das Modul verwendet das Bereitstellungsskript, um den Wert einer Ressourceneigenschaft zu überprüfen. In diesem Beispiel ist die Ressource ein virtueller WAN-Hub.
Sie können dependsOn verwenden, um ein Modul explizit von einem anderen abhängig zu machen, da diese Umgebung aus einer einzelnen Datei bereitgestellt wird, die Bicep Module verwendet. In diesem Beispiel dependsOn hängt das Modul vwanvhcs.bicep vom azResourceStateCheck.bicep-Modul ab.
Der folgende Auszug aus orchestration.bicep zeigt dependsOn in Verwendung:
@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
}
}
Die Ressourcenüberprüfung ist erforderlich, da bereitgestellte Virtual WAN Hubs erst verwendet werden können, wenn die eigenschaft routingState den Wert Provisioned hat. Virtual WAN Hubs melden eine erfolgreiche Bereitstellung an Resource Manager, damit das Bereitstellungsmodul die Bereitstellung fortsetzt. Ein neuer Virtual WAN Hub wird betriebsbereit, nachdem der Virtual WAN Hubrouter im erstellten Hub bereitgestellt wurde. Dieser Vorgang dauert etwa 15 Minuten. Dieses Verhalten kann im folgenden Screenshot eines neuen Virtual WAN Hubs angezeigt werden. Der Screenshot zeigt einen Hubstatus von Succeeded, aber einen Routingstatus von Provisioning.
Wenn Sie versuchen, das Modul vwanvhcs.bicep bereitzustellen, bevor der Wert routingStateProvisioned ist, schlägt die Verbindungserstellung fehl, und die gesamte Bereitstellung schlägt fehl. Bis der Router bereitgestellt wird, schlägt die erneute Bereitstellung ebenfalls fehl.
Der folgende Screenshot zeigt ein Beispiel für das Bereitstellungsskriptprotokoll während der routingState Überprüfungen des Virtual WAN Hub. Das Protokoll zeigt wiederholte Überprüfungen der Eigenschaft, die einen anderen Wert als Provisioned.
Der folgende Screenshot zeigt, dass sich der Wert auf Provisioned ändert.
&l t;c2><c1><c0><sb0>Screenshot, der den Abschluss des Bereitstellungsskripts anzeigt, wenn sich die Eigenschaft "routingState" des Virtual WAN-Hubs in "Provisioned" geändert hat.</sb0></c0></c1></c2>
Wenn sich der Wert nach der maximalen Anzahl von Iterationen nicht in Provisioned ändert, generiert das Skript eine Ausnahme, die signalisiert, dass die Skriptressource beim Resource Manager einen Fehler meldet. Das Resource Manager Bereitstellungsmodul schlägt fehl und beendet die Bereitstellung, da die Ausnahme darauf hinweist, dass ein Problem mit der Azure Ressource vorliegt, die Eine Problembehandlung erfordert. Weitere Informationen finden Sie im folgenden Invoke-AzResourceStateCheck.ps1 Skript.
[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 verwaltet diesen Artikel. Die folgenden Mitwirkenden haben diesen Artikel geschrieben.
Hauptautor:
- Jack Tracey | Leitender Architekt für Cloud-Lösungen
Andere Mitwirkende:
- Gary McMahon | Leitender Architekt für Cloud-Lösungen
Um nicht öffentliche LinkedIn-Profile zu sehen, melden Sie sich bei LinkedIn an.
Nächste Schritte
- Dateien für das Beispiel im Azure/CAE-Bits-Repository
- Bereitstellungsskripts in Bicep verwenden
- Lernmodul: Erweitern von Bicep- und ARM-Vorlagen mithilfe von Bereitstellungsskripts
- Alles, was Sie über Ausnahmen wissen wollten
- Migrieren zu Virtual WAN
- Ressourcenabhängigkeiten in Bicep
- Bicep-Dokumentation