Kaynak özelliklerini denetlemek için dağıtım betiklerini kullanma

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

Bicep ve dağıtım betiği mimarisini gösteren şema.

Bu mimariye ait bir Visio dosyasını indirin.

Bu mimari için GitHub'daki kod örneklerini gözden geçirin ve indirin.

  1. 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.

  2. orchestration.bicep dosyası abonelik kapsamında bir kaynak grubu oluşturur.

  3. 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ı.

  4. 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.

  5. 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.

  6. azResourceStateCheck.bicep modülü dağıtım betiği kaynağını dağıtır.

  7. 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ğerin Provisioned olup olmadığını belirler.

    1. Özellik değeri Provisioned değ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 sonra routingState ö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 Provisioned değ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.

    2. Özellik değeri Provisioned ise, dağıtım betiği (0) ile başarı kodu döndürür.

  8. 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 dependsOn yan tümcesine sahiptir. Bu nedenle, routingState özelliği Provisioned olduğ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 1 olarak ayarlamak için modülde Bicep batchSize dekoratö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.

Yeni dağıtılan Sanal WAN hub'ının ekran görüntüsü. Hub durumu Başarılı, yönlendirme durumu ise Provisioning.

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.

 Sanal WAN hub routingState özelliğini yoklayan dağıtım betiğini gösteren ekran görüntüsü.

Aşağıdaki ekran görüntüsünde değerin olarak Provisioneddeğiştiği gösterilmektedir.

Sanal WAN hub routingState özelliği Provisioned olarak değiştiğinde dağıtım betiğinin tamamlandığını gösteren ekran görüntüsü.

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:

Diğer katkıda bulunan:

Herkese açık olmayan LinkedIn profillerini görmek için LinkedIn'e oturum açın.

Sonraki Adımlar