Denetim döngüsü yürütme ve iç içe döngüler

Tamamlandı

Güçlü kopyalama döngüleri özelliğini kullanarak dinamik ve esnek şablonlar oluşturabilirsiniz. Kaynak oluştururken döngülerin nasıl yürütüldüğünü ve kaynak özelliklerini ve iç içe döngüleri ayarlamak için döngülerin nasıl kullanılacağını anlamak önemlidir.

Bu ünitede, kopyalama döngülerinin yürütülmesini denetlemeyi ve Bicep'te kaynak özelliği döngülerini ve iç içe döngüleri kullanmayı öğreneceksiniz.

Dekont

Bu ünitedeki komutlar kavramları göstermek için gösterilir. Komutları henüz çalıştırmayın. Burada öğrendiklerini yakında öğreneceksin.

Denetim döngüsü yürütme

Varsayılan olarak, Azure Resource Manager döngülerden kaynakları paralel ve belirleyici olmayan bir sırada oluşturur. Önceki alıştırmalarda döngü oluşturduğunuzda, her iki Azure SQL mantıksal sunucusu da aynı anda oluşturulmuştur. Döngüdeki tüm kaynaklar aynı anda dağıtıldığından bu, genel dağıtım süresini azaltmaya yardımcı olur.

Ancak bazı durumlarda kaynakları paralel yerine sırayla döngüler halinde dağıtmanız veya küçük değişiklik toplu işlemlerini paralel olarak dağıtmanız gerekebilir. Örneğin, üretim ortamınızda çok sayıda Azure Uygulaması Hizmeti uygulamanız varsa, güncelleştirmelerin tümünü aynı anda yeniden başlatmasını önlemek için değişiklikleri aynı anda yalnızca küçük bir sayıya dağıtmak isteyebilirsiniz.

Dekoratör kullanarak Bicep'te @batchSize kopyalama döngülerinizin nasıl çalıştığını denetleyebilirsiniz. Dekoratörünü anahtar sözcüğüyle kaynak veya modül bildirimine for yerleştirin.

Şimdi dekoratör olmadan bir dizi App Service uygulaması için örnek bicep tanımına @batchSize göz atalım:

resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Bu döngüdeki tüm kaynaklar paralel olarak aynı anda dağıtılır:

Diagram showing time on the horizontal axis, with app1, app2, and app3 stacked vertically to be deployed at the same time.

Şimdi dekoratörün @batchSize değerini 2uygulayalım:

@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Şablonu dağıttığınızda Bicep iki toplu dağıtım yapacaktır:

Diagram showing time on the horizontal axis, with app1 and app2 stacked to run as one batch, and app3 to run as a second batch.

Dekont

Bicep, sonrakine geçmeden önce tüm toplu işlemlerin tamamlanmasını bekler. Yukarıdaki örnekte, app2 dağıtımı app1'in öncesinde tamamlarsa, Bicep uygulama3'i dağıtmaya başlamadan önce uygulama1'in bitmesini bekler.

Ayrıca Bicep'e öğesini olarak ayarlayarak döngünün sırayla çalıştırılmasını @batchSize1da söyleyebilirsiniz:

@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

Şablonu dağıttığınızda Bicep, sonrakini başlatmadan önce her kaynak dağıtımının tamamlanmasını bekler:

Diagram showing time on the horizontal axis, with app1, app2, and app3 being deployed sequentially.

Kaynak özellikleriyle döngüleri kullanma

Kaynak özelliklerini ayarlamaya yardımcı olması için döngüleri kullanabilirsiniz. Örneğin, bir sanal ağı dağıtırken alt ağlarını belirtmeniz gerekir. Alt ağın iki önemli bilgiye sahip olması gerekir: ad ve adres ön eki. Her ortam için farklı alt ağlar belirtebilmeniz için bir nesne dizisiyle parametre kullanabilirsiniz:

param subnetNames array = [
  'api'
  'worker'
]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [for (subnetName, i) in subnetNames: {
      name: subnetName
      properties: {
        addressPrefix: '10.0.${i}.0/24'
      }
    }]
  }
}

Bu örnekte, döngünün for kaynak tanımında, özellik değerinin çevresinde göründüğüne subnets dikkat edin.

İç içe döngüler

Bazı senaryolarda başka bir döngü içinde döngü veya iç içe döngü kullanmanız gerekir. Bicep kullanarak iç içe döngüler oluşturabilirsiniz.

Oyuncak ayı oyuncak şirketiniz için, oyuncağın başlatılacağı her ülkede/bölgede sanal ağlar dağıtmanız gerekir. Her sanal ağın farklı bir adres alanına ve iki alt ağa ihtiyacı vardır. Sanal ağları bir döngüde dağıtarak başlayalım:

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

var subnetCount = 2

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
  }
}]

Bu döngü her konum için sanal ağları dağıtır ve her sanal ağın farklı bir adres ön eki aldığından emin olmak için döngü dizinini kullanarak sanal ağ için öğesini ayarlar addressPrefix .

Alt ağları her sanal ağ içinde dağıtmak için iç içe döngü kullanabilirsiniz:

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for (location, i) in locations : {
  name: 'vnet-${location}'
  location: location
  properties: {
    addressSpace:{
      addressPrefixes:[
        '10.${i}.0.0/16'
      ]
    }
    subnets: [for j in range(1, subnetCount): {
      name: 'subnet-${j}'
      properties: {
        addressPrefix: '10.${i}.${j}.0/24'
      }
    }]
  }
}]

İç içe döngü iki alt ağ oluşturmak için işlevini kullanır range() .

Şablonu dağıtırken aşağıdaki sanal ağları ve alt ağları alırsınız:

Sanal ağın adı Konum Adres ön eki Alt ağlar
vnet-westeurope westeurope 10.0.0.0/16 10.0.1.0/24, 10.0.2.0/24
vnet-eastus2 eastus2 10.1.0.0/16 10.1.1.0/24, 10.1.2.0/24
vnet-eastasia eastasia 10.2.0.0/16 10.2.1.0/24, 10.2.2.0/24