Eksekusi perulangan kontrol dan perulangan sarang
Dengan menggunakan fitur perulangan salinan yang canggih, Anda dapat membuat templat yang dinamis dan fleksibel. Penting untuk memahami cara mengontrol cara perulangan dijalankan saat mereka membuat sumber daya dan cara menggunakan perulangan untuk mengatur properti sumber daya dan perulangan sarang.
Dalam unit ini, Anda akan mempelajari cara mengontrol eksekusi perulangan salinan dan cara menggunakan perulangan properti sumber daya dan perulangan berlapis 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:
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:
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:
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 mainan 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 |