Eksekusi perulangan kontrol dan perulangan sarang

Selesai

Dengan menggunakan fitur perulangan salinan yang canggih, Anda dapat membuat templat yang dinamis dan fleksibel. Penting untuk memahami cara mengontrol cara perulangan dijalankan ketika perulangan membuat sumber daya, dan cara menggunakan perulangan untuk mengatur properti sumber daya dan perulangan sarang.

Di unit ini, Anda mempelajari cara mengontrol eksekusi perulangan salinan, dan cara menggunakan perulangan properti sumber daya dan perulangan bersarang di Bicep.

Catatan

Perintah dalam unit ini ditampilkan untuk mengilustrasikan konsep. Jangan jalankan perintah terlebih dahulu. Anda akan segera mempraktikkan apa yang Anda pelajari di sini.

Eksekusi perulangan kontrol

Secara default, Azure Resource Manager membuat sumber daya dari perulangan secara paralel dan dalam urutan non-deterministik. Saat Anda membuat perulangan di latihan sebelumnya, kedua server Azure SQL dibuat secara bersamaan. Hal ini membantu mengurangi waktu penyebaran secara keseluruhan, karena semua sumber daya dalam perulangan disebarkan sekaligus.

Namun, dalam beberapa kasus, Anda mungkin perlu menggunakan sumber daya dalam perulangan secara berurutan alih secara paralel, atau menerapkan batch kecil perubahan bersama-sama secara paralel. Misalnya, jika Anda memiliki banyak aplikasi Azure App Service di lingkungan produksi, Anda mungkin ingin menerapkan perubahan hanya ke angka kecil sekaligus untuk mencegah pembaruan memulai ulang semuanya secara bersamaan.

Anda dapat mengontrol cara perulangan salinan berjalan di Bicep dengan menggunakan dekorator @batchSize. Tambahkan dekorator pada deklarasi sumber daya atau modul dengan kata kunci for.

Mari kita lihat contoh definisi Bicep untuk set aplikasi App Service tanpa dekorator @batchSize:

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

Semua sumber daya dalam perulangan ini akan disebarkan pada saat yang sama, secara paralel:

Diagram yang memperlihatkan waktu pada sumbu horizontal, dengan app1, app2, dan app3 ditumpuk secara vertikal untuk disebarkan secara bersamaan.

Sekarang mari kita terapkan dekorator @batchSize dengan nilai 2:

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

Ketika Anda menyebarkan templat, Bicep akan menyebarkan dalam dua batch:

Diagram memperlihatkan waktu pada sumbu horizontal, dengan app1 dan app2 ditumpuk untuk berjalan sebagai satu batch, dan app3 untuk dijalankan sebagai batch kedua.

Catatan

Bicep menunggu setiap batch lengkap selesai sebelum melanjutkan ke batch berikutnya. Pada contoh sebelumnya, jika app2 menyelesaikan penyebarannya sebelum app1, Bicep akan menunggu hingga app1 selesai sebelum mulai menyebarkan app3.

Anda juga dapat memberi tahu Bicep untuk menjalankan perulangan secara berurutan dengan mengatur @batchSize ke 1:

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

Saat Anda menyebarkan templat, Bicep menunggu setiap penyebaran sumber daya selesai sebelum memulai yang berikutnya:

Diagram yang memperlihatkan waktu pada sumbu horizontal, dengan app1, app2, dan app3 disebarkan secara berurutan.

Menggunakan perulangan dengan properti sumber daya

Anda dapat menggunakan perulangan untuk membantu mengatur properti sumber daya. Misalnya, saat Anda menyebarkan jaringan virtual, Anda perlu menentukan subnet-nya. Subnet harus memiliki dua informasi penting: nama dan awalan alamat. Anda dapat menggunakan parameter dengan array objek sehingga Anda dapat menentukan subnet yang berbeda untuk setiap lingkungan:

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'
      }
    }]
  }
}

Dalam contoh ini, perhatikan bahwa perulangan for muncul dalam definisi sumber daya, di sekitar nilai properti subnets.

Perulangan bersarang

Beberapa skenario mengharuskan Anda untuk menggunakan perulangan di dalam perulangan lain, atau perulangan bersarang. Anda dapat membuat perulangan bersarang dengan menggunakan Bicep.

Untuk perusahaan boneka beruang teddy Anda, Anda perlu menyebarkan jaringan virtual di setiap negara/wilayah tempat mainan akan diluncurkan. Setiap jaringan virtual membutuhkan ruang alamat yang berbeda dan dua subnet. Mari kita mulai dengan menyebarkan jaringan virtual dalam perulangan:

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'
      ]
    }
  }
}]

Perulangan ini menyebarkan jaringan virtual untuk setiap lokasi, dan mengatur addressPrefix untuk jaringan virtual dengan menggunakan indeks perulangan untuk memastikan setiap jaringan virtual mendapatkan awalan alamat yang berbeda.

Anda dapat menggunakan perulangan bersarang untuk menyebarkan subnet di setiap jaringan virtual:

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'
      }
    }]
  }
}]

Perulangan bersarang menggunakan fungsi range() untuk membuat dua subnet.

Saat Anda menyebarkan templat, Anda mendapatkan jaringan virtual dan subnet berikut ini:

Nama jaringan virtual Lokasi Awalan alamat Subnet
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