Resource-iteratie in Bicep

In dit artikel wordt beschreven hoe u meer dan één exemplaar van een resource maakt in uw Bicep-bestand. U kunt een lus toevoegen aan een resource declaratie en dynamisch instellen hoeveel resources u wilt implementeren. U vermijdt het herhalen van de syntaxis in uw Bicep-bestand.

U kunt ook een lus gebruiken met modules, eigenschappen, variabelenen uitvoer.

Zie voorwaardeelement als u wilt opgeven of een resource al dan niet is geïmplementeerd.

Microsoft Learn

Zie Flexibele Bicep-sjablonen bouwen met voorwaarden en lussen op Microsoft Learn voor meer informatie over lussen en voor praktijkadviezen.

Syntax

Lussen kunnen worden gebruikt om meerdere resources te declaren door:

  • Een lusindex gebruiken.

    resource <resource-symbolic-name> '<resource-type>@<api-version>' = [for <index> in range(<start>, <stop>): {
      <resource-properties>
    }]
    

    Zie Lusindex voor meer informatie.

  • Itereren over een matrix.

    resource <resource-symbolic-name> '<resource-type>@<api-version>' = [for <item> in <collection>: {
      <resource-properties>
    }]
    

    Zie Loop array (Lus matrix) voor meer informatie.

  • Itereren over een matrix en index.

    resource <resource-symbolic-name> '<resource-type>@<api-version>' = [for (<item>, <index>) in <collection>: {
      <resource-properties>
    }]
    

    Zie Loop array and index (Lus matrix en index) voor meer informatie.

Luslimieten

Bicep-lus heeft de volgende beperkingen:

  • Kan een resource niet herhalen met geneste onderliggende resources. U moet de onderliggende resources wijzigen in resources op het hoogste niveau. Zie Iteratie voor een onderliggende resource.
  • Kan niet herhalen op meerdere niveaus van eigenschappen. Zie Eigenschaps iteratie in Bicep.
  • Herhalende iteraties mogen geen negatief getal zijn of 800 iteraties overschrijden.

Lusindex

In het volgende voorbeeld wordt het aantal opslagaccounts gemaakt dat is opgegeven in de storageCount parameter .

param rgLocation string = resourceGroup().location
param storageCount int = 2

resource storageAcct 'Microsoft.Storage/storageAccounts@2021-02-01' = [for i in range(0, storageCount): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
}]

U ziet dat de index i wordt gebruikt bij het maken van de resourcenaam van het opslagaccount.

Lus matrix

In het volgende voorbeeld wordt één opslagaccount gemaakt voor elke naam die is opgegeven in de storageNames parameter .

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
  'coho'
]

resource storageAcct 'Microsoft.Storage/storageAccounts@2021-02-01' = [for name in storageNames: {
  name: '${name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
}]

Als u waarden van de geïmplementeerde resources wilt retourneren, kunt u een lus gebruiken in de uitvoersectie.

Lus matrix en index

In het volgende voorbeeld worden zowel het matrixelement als de indexwaarde gebruikt bij het definiëren van het opslagaccount.

param storageAccountNamePrefix string

var storageConfigurations = [
  {
    suffix: 'local'
    sku: 'Standard_LRS'
  }
  {
    suffix: 'geo'
    sku: 'Standard_GRS'
  }
]

resource storageAccountResources 'Microsoft.Storage/storageAccounts@2021-02-01' = [for (config, i) in storageConfigurations: {
  name: '${storageAccountNamePrefix}${config.suffix}${i}'
  location: resourceGroup().location
  properties: {
    supportsHttpsTrafficOnly: true
    accessTier: 'Hot'
    encryption: {
      keySource: 'Microsoft.Storage'
      services: {
        blob: {
          enabled: true
        }
        file: {
          enabled: true
        }
      }
    }
  }
  kind: 'StorageV2'
  sku: {
    name: config.sku
  }
}]

Resource-iteratie met voorwaarde

In het volgende voorbeeld ziet u een geneste lus in combinatie met een gefilterde resourcelus. Filters moeten expressies zijn die worden geëvalueerd als een Booleaanse waarde.

resource parentResources 'Microsoft.Example/examples@2020-06-06' = [for parent in parents: if(parent.enabled) {
  name: parent.name
  properties: {
    children: [for child in parent.children: {
      name: child.name
      setting: child.settingValue
    }]
  }
}]

Filters worden ook ondersteund met modulelussen.

Implementeren in batches

Standaard worden Resource Manager resources parallel gemaakt. Wanneer u een lus gebruikt om meerdere exemplaren van een resourcetype te maken, worden deze exemplaren allemaal op hetzelfde moment geïmplementeerd. De volgorde waarin ze worden gemaakt, wordt niet gegarandeerd. Er is geen limiet voor het aantal resources dat parallel is geïmplementeerd, anders dan de totale limiet van 800 resources in het Bicep-bestand.

Mogelijk wilt u niet alle exemplaren van een resourcetype op hetzelfde moment bijwerken. Wanneer u bijvoorbeeld een productieomgeving bij werkt, wilt u de updates mogelijk spreiden, zodat slechts een bepaald aantal tegelijk wordt bijgewerkt. U kunt opgeven dat een subset van de exemplaren tegelijk wordt gebatcheerd en geïmplementeerd. De andere exemplaren wachten tot die batch is voltooid.

Als u exemplaren van een resource serieel wilt implementeren, voegt u de batchSize-architect toe. Stel de waarde ervan in op het aantal exemplaren dat gelijktijdig moet worden geïmplementeerd. Er wordt een afhankelijkheid gemaakt op eerdere exemplaren in de lus, zodat er pas één batch wordt begonnen als de vorige batch is voltooid.

param rgLocation string = resourceGroup().location

@batchSize(2)
resource storageAcct 'Microsoft.Storage/storageAccounts@2021-02-01' = [for i in range(0, 4): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
}]

Voor uitsluitend sequentiële implementatie stelt u de batchgrootte in op 1.

Iteratie voor een onderliggende resource

U kunt geen lus gebruiken voor een geneste onderliggende resource. Als u meer dan één exemplaar van een onderliggende resource wilt maken, wijzigt u de onderliggende resource in een resource op het hoogste niveau.

Stel bijvoorbeeld dat u een bestandsservice en bestands share doorgaans definieert als geneste resources voor een opslagaccount.

resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
  resource service 'fileServices' = {
    name: 'default'
    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

Als u meer dan één bestands share wilt maken, verplaatst u deze buiten het opslagaccount. U definieert de relatie met de bovenliggende resource via de parent eigenschap .

In het volgende voorbeeld ziet u hoe u een opslagaccount, een bestandsservice en meer dan één bestands share maakt:

resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2021-02-01' = {
  name: 'default'
  parent: stg
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2021-02-01' = [for i in range(0, 3): {
  name: 'exampleshare${i}'
  parent: service
}]

Volgende stappen