Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, bir kaynak özelliği belirli bir değer döndürene kadar dağıtımı duraklatmak için Bicep ve dağıtım betiğinin nasıl kullanılacağı açıklanmaktadır. Dağıtılan kaynak hazır olduğunu ancak temel alınan kaynakların hazır olmadığını Azure Resource Manager bildirirse dağıtımın başarılı olmasını sağlamak için bu tekniği kullanabilirsiniz. Bu durumda, dağıtılan kaynak henüz dağıtımın geri kalanıyla etkileşime geçmek için hazır değildir ve bu da duraklatma gerektiği anlamına gelir.
Bu makalede, tekniği göstermek için bir Azure Sanal WAN senaryosu kullanılır. Aşağıdaki dosyalar kaynak denetimi ve duraklatma uygulamasını içerir:
Dosyaları dağıtımınız için uyarlayabilirsiniz. Size yardımcı olmak için azResourceStateCheck.bicep modülü parametrelendirilir.
dependsOn özelliği orchestration.bicep içinde vwanvhcs.bicep modülü dağıtımının azResourceStateCheck.bicep modül dağıtımına bağlı olduğundan emin olmak için kullanılır.
Architecture
Bu mimariye ait bir Visio dosyasını indirin.
Bu mimari için GitHub'daki kod örneklerini gözden geçirin ve indirin.
Dağıtım için orchestration.bicep dosyasını abonelik kapsamına Resource Manager'a gönder.
Note
Bu Bicep dosyasını ve bu örnek için kullanılan diğer dosyaları infra/samples/deployment-scripts-property-check dizininden alabilirsiniz. Mimari diyagramının sağ tarafında depodaki dosyaların kısmi bir kuruluşu görüntülenir.
orchestration.bicep dosyası abonelik kapsamında bir kaynak grubu oluşturur.
orchestration.bicep dosyası, Sanal WAN ve uydu sanal ağlarını dağıtır.
orchestration.bicep, kaynak grubu kapsamında Sanal WAN dağıtan vwan.bicep modülünü dağıtır.
orchestration.bicep, sanal ağları kaynak grubu kapsamında dağıtan vnet.bicep modülünü dağıtır.
Bicep, Sanal WAN ve bağlantı noktası sanal ağlarını birbirlerinden bağımsız olarak gördüğü için, bu ağlar paralel olarak dağıtılır. Bağımlılıklar, Bicep'teki dağıtım sırasını belirler. Bir kaynak, ona bağımlı olan herhangi bir kaynak öncesinde dağıtılır. Açık ve örtük bağımlılıklar dahil olmak üzere Bicep'teki kaynak bağımlılıkları hakkında daha fazla bilgi için bkz. Bicep'te kaynak bağımlılıkları.
orchestration.bicep dosyası, kaynak grubu kapsamında Sanal WAN hub'ını dağıtan vwanhub.bicep modülünü dağıtır. Hub örtük olarak Sanal WAN bağlıdır; bu da hub dağıtımının yalnızca Sanal WAN dağıtımı tamamlandıktan sonra gerçekleştiği anlamına gelir.
orchestration.bicep dosyası, kullanıcı tarafından atanan bir yönetilen kimlik oluşturan ve Azure rol tabanlı erişim denetimi (RBAC) Okuyucusu rolünü kaynak grubuna atayan azResourceStateCheck.bicep modülünü dağıtır.
azResourceStateCheck.bicep modülü dağıtım betiği kaynağını dağıtır.
Dağıtım betiği kaynağı, kullanıcı tarafından atanan yönetilen kimliği, Resource Manager kimlik doğrulaması için kullanır. Kaynak daha sonra Invoke-AzResourceStateCheck.ps1PowerShell dağıtım betiğini çalıştırır. Dağıtım betikleri hakkında daha fazla bilgi için bkz. Bicep'te dağıtım betiklerini kullanma.
Betik, Sanal WAN hub
routingStateözelliğini yoklayarak değerinProvisionedolup olmadığını belirler.Özellik değeri
Provisioneddeğilse, betik orchestration.bicep dosyasında ayarlanan bir parametre tarafından belirtilen süre boyunca duraklatılır ve bu süre azResourceStateCheck.bicep modülüne aktarılır. Betik daha sonraroutingStateözelliğinin değerini yeniden denetler.Betik, duraklatma ve kontrol döngüsünü tekrarlar. Orchestration.bicep dosyasındaki bir parametre, en fazla yineleme sayısını belirler. Özellik değeri, en fazla yineleme sayısından sonra
Provisioneddeğilse, script bir özel durum oluşturur ve bu, Bicep dağıtımının geri kalanının durup başarısız olmasına neden olur.Özellik değeri
Provisionedise, dağıtım betiği(0)ile başarı kodu döndürür.
Dağıtım betiği başarılı olursa orchestration.bicep dosyası, Sanal WAN hub ile uç sanal ağlar arasındaki bağlantıları oluşturan vwanvhcs.bicep modülünü dağıtır.
orchestration.bicep içindeki vwanvhcs.bicep modülünün tanımı, vwanvhcs.bicep öğesinin açıkça azResourceStateCheck.bicep modülünün başarıyla tamamlanmasına bağlı olmasına neden olan bir
dependsOnyan tümcesine sahiptir. Bu nedenle,routingStateözelliğiProvisionedolduğunda bağlantılar yalnızca oluşturulur.vwanvhcs.bicep modülü, paralel dağıtım tek bir Sanal WAN hub için desteklenmediğinden Sanal WAN hub bağlantılarını paralel olarak değil sıralı olarak dağıtır. Toplu iş boyutunu
1olarak ayarlamak için modülde BicepbatchSizedekoratörü@batchSize(1)kullanılır. Bu dekoratör, bağlantıların birer birer dağıtılmasını sağlar.
Senaryo ayrıntıları
Bu mimarinin temel bölümleri, dağıtım betiği kaynağını dağıtan azResourceStateCheck.bicep modülü ve bir PowerShell dosyası olan Invoke-AzResourceStateCheck.ps1 dosyası ile ilişkili dağıtım betiğidir. Modül, bir kaynak özelliğinin değerini denetlemek için dağıtım betiğini kullanır. Bu örnekte, kaynak bir Sanal WAN hub'dır.
Bu ortam Bicep modülleri kullanan tek bir dosyadan dağıtıldığından, bir modülün açıkça başka bir modüle bağımlı olmasını sağlamak için dependsOn kullanabilirsiniz. Bu örnekte vwanvhcs.bicep dependsOn modülünün azResourceStateCheck.bicep modülüne bağımlı olmasını sağlar.
Orchestration.bicep dosyasından aşağıdaki alıntıda dependsOn 'nin kullanımı gösterilmektedir:
@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
}
}
Dağıtılan Sanal WAN hub'ları routingState özelliği Provisioned değerine sahip olana kadar kullanıma hazır olmadığından kaynak denetimi gereklidir. Sanal WAN merkezleri, dağıtım motorunun dağıtıma devam edebilmesi için başarılı dağıtımı Kaynak Yöneticisi'ne bildirir. Oluşturulan hub'a Sanal WAN hub yönlendiricisi sağlandıktan sonra yeni bir Sanal WAN hub'ı çalışır duruma gelir. Bu işlem yaklaşık 15 dakika sürer. Bu davranış, yeni bir Sanal WAN hub'ının aşağıdaki ekran görüntüsünde görülebilir. Ekran görüntüsü, hub durumunu Succeeded, ancak yönlendirme durumunu Provisioning olarak gösteriyor.
vwanvhcs.bicep modülünü routingState değeri Provisioned olmadan dağıtmaya çalışırsanız, bağlantı oluşturma başarısız olur ve genel dağıtım başarısız olur. Yönlendirici sağlanana kadar yeniden dağıtma girişimleri de başarısız olur.
Aşağıdaki ekran görüntüsünde, Sanal WAN hub'ının routingState denetimleri sırasında dağıtım betiği günlüğünün bir örneği gösterilmektedir. Günlük, özelliğin c0 değerinden farklı bir değer döndüren yinelenen denetimlerin olduğunu gösterir.
Aşağıdaki ekran görüntüsünde değerin olarak Provisioneddeğiştiği gösterilmektedir.
Azami yineleme sayısına ulaştığında değer Provisioned olarak değişmezse, betik bir istisna oluşturur ve bu, betik kaynağının Resource Manager'de başarısız olduğunu belirtir. özel durum sorun giderme gerektiren Azure kaynağında sorun olduğunu önerdiğinden Resource Manager dağıtım altyapısı başarısız olur ve dağıtımı durdurur. Daha fazla bilgi için aşağıdaki Invoke-AzResourceStateCheck.ps1 betiğine bakın.
[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 bu makaleyi korur. Bu makaleyi aşağıdaki katkıda bulunanlar yazdı.
Asıl yazar:
- Jack Tracey | Kıdemli Bulut Çözümleri Mimarı
Diğer katkıda bulunan:
- Gary McMahon | Kıdemli Bulut Çözümleri Mimarı
Herkese açık olmayan LinkedIn profillerini görmek için LinkedIn'e oturum açın.
Sonraki Adımlar
- Azure/CAE-Bits deposundaki örneğin dosyaları
- Bicep'te dağıtım betiklerini kullanma
- Learn modülü: Dağıtım betiklerini kullanarak Bicep ve ARM şablonlarını genişletme
- Özel durumlar hakkında bilmek istediğiniz her şey
- Sanal WAN'a Geçiş Yap
- Bicep'teki kaynak bağımlılıkları
- Bicep dokümantasyonu