Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto článku se dozvíte, jak pomocí for syntaxe iterovat položky v kolekci. Tato funkce se podporuje od verze 0.3.1 dále. Pomocí smyček můžete definovat více kopií prostředku, modulu, proměnné, vlastnosti nebo výstupu. Pomocí smyček se vyhnete opakování syntaxe v souboru Bicep a dynamicky nastavíte počet kopií, které se mají během nasazení vytvořit. Viz Rychlý start: Vytvoření více instancí prostředků v Bicep pro rychlý přehled, jak používat různé for syntaxe k vytvoření více instancí prostředků v Bicep.
Pokud chcete použít smyčky k vytvoření více prostředků nebo modulů, musí mít každá instance jedinečnou hodnotu vlastnosti name . Názvy můžete vytvořit pomocí hodnoty indexu nebo jedinečných hodnot v polích nebo kolekcích.
Syntaxe smyčky
Smyčky lze deklarovat pomocí:
Použití celočíselného indexu Tato možnost funguje, pokud je váš scénář: "Chci vytvořit tento počet instancí". Funkce rozsahu vytvoří pole celých čísel, které začínají na počátečním indexu a obsahují počet zadaných prvků. Ve smyčce můžete k úpravě hodnot použít celočíselné indexy. Další informace naleznete v tématu Integer index.
[for <index> in range(<startIndex>, <numberOfElements>): { ... }]Použití položek v poli: Tato možnost funguje, když je ve vašem scénáři "Chci vytvořit instanci pro každý prvek v poli". Ve smyčce můžete k úpravě hodnot použít hodnotu aktuálního prvku pole. Další informace viz Prvky pole.
[for <item> in <collection>: { ... }]Použití položek ve slovníkovém objektu: Tato možnost funguje, když je ve vašem scénáři "Chci vytvořit instanci pro každou položku v objektu". Funkce items převede objekt na pole. Ve smyčce můžete k vytvoření hodnot použít vlastnosti z objektu. Další informace naleznete v části Objekt Dictionary.
[for <item> in items(<object>): { ... }]Použití celočíselného indexu a položek v poli: Tato možnost funguje, když je ve vašem scénáři "Chci vytvořit instanci pro každý prvek v poli, ale k vytvoření další hodnoty potřebuji aktuální index.". Další informace naleznete v tématu Smyčka pole a index.
[for (<item>, <index>) in <collection>: { ... }]Přidání podmíněného nasazení: Tato možnost funguje, když je ve vašem scénáři "Chci vytvořit více instancí, ale chci nasadit každou instanci jenom v případě, že je podmínka pravdivá.". Další informace naleznete v tématu Smyčka s podmínkou.
[for <item> in <collection>: if(<condition>) { ... }]
Omezení smyčky
Používání smyček v Bicep má tato omezení:
- Smyčky Bicep pracují pouze s hodnotami, které lze určit na začátku nasazení.
- Iterace smyčky nesmí být záporné číslo nebo nesmí překročit 800 iterací.
- Vzhledem k tomu, že prostředek nemůže mít smyčku s vnořenými podřízenými prostředky, změňte podřízené prostředky na prostředky nejvyšší úrovně. Další informace najdete v části Iterace pro podřízený prostředek.
- Pokud chcete opakovat více úrovní vlastností, použijte funkci lambda
map.
Celý číselný index
Jako jednoduchý příklad použití indexu vytvořte proměnnou, která obsahuje pole řetězců:
param itemCount int = 5
var stringArray = [for i in range(0, itemCount): 'item${(i + 1)}']
output arrayResult array = stringArray
Výstup vrátí matici s následujícími hodnotami:
[
"item1",
"item2",
"item3",
"item4",
"item5"
]
Další příklad vytvoří počet účtů úložiště zadaných v parametru storageCount . Vrátí tři vlastnosti pro každý účet úložiště:
param location string = resourceGroup().location
param storageCount int = 2
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
output storageInfo array = [for i in range(0, storageCount): {
id: storageAcct[i].id
blobEndpoint: storageAcct[i].properties.primaryEndpoints.blob
status: storageAcct[i].properties.statusOfPrimary
}]
Všimněte si, že index i se používá při vytváření názvu zdroje účtu úložiště.
Další příklad několikrát nasadí modul:
param location string = resourceGroup().location
param storageCount int = 2
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): {
name: '${i}deploy${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
output storageAccountEndpoints array = [for i in range(0, storageCount): {
endpoint: stgModule[i].outputs.storageEndpoint
}]
Prvky pole
Následující příklad vytvoří jeden účet úložiště pro každý název zadaný v parametru storageNames . Všimněte si, že vlastnost název pro každou instanci prostředku musí být jedinečná.
param location string = resourceGroup().location
param storageNames array = [
'contoso'
'fabrikam'
'coho'
]
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for name in storageNames: {
name: '${name}${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
Další příklad iteruje přes pole k definování vlastnosti. Vytvoří dvě podsítě ve virtuální síti. Všimněte si, že názvy podsítí musí být jedinečné:
param rgLocation string = resourceGroup().location
var subnets = [
{
name: 'api'
subnetPrefix: '10.144.0.0/24'
}
{
name: 'worker'
subnetPrefix: '10.144.1.0/24'
}
]
resource vnet 'Microsoft.Network/virtualNetworks@2025-01-01' = {
name: 'vnet'
location: rgLocation
properties: {
addressSpace: {
addressPrefixes: [
'10.144.0.0/20'
]
}
subnets: [for subnet in subnets: {
name: subnet.name
properties: {
addressPrefix: subnet.subnetPrefix
}
}]
}
}
Pole a index
V následujícím příkladu se při definování účtu úložiště používá element pole i hodnota indexu:
param storageAccountNamePrefix string
var storageConfigurations = [
{
suffix: 'local'
sku: 'Standard_LRS'
}
{
suffix: 'geo'
sku: 'Standard_GRS'
}
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2025-06-01' = [for (config, i) in storageConfigurations: {
name: '${storageAccountNamePrefix}${config.suffix}${i}'
location: resourceGroup().location
sku: {
name: config.sku
}
kind: 'StorageV2'
}]
V dalším příkladu se k výstupu informací o nových prostředcích používají prvky pole i index:
param location string = resourceGroup().location
param orgNames array = [
'Contoso'
'Fabrikam'
'Coho'
]
resource nsg 'Microsoft.Network/networkSecurityGroups@2025-01-01' = [for name in orgNames: {
name: 'nsg-${name}'
location: location
}]
output deployedNSGs array = [for (name, i) in orgNames: {
orgName: name
nsgName: nsg[i].name
resourceId: nsg[i].id
}]
Objekt slovníku
K iteraci prvků v objektu slovníku items použijte funkci, která převede objekt na pole.
value Vlastnost slouží k získání vlastností objektů. Všimněte si, že názvy prostředků NSG musí být jedinečné.
param nsgValues object = {
nsg1: {
name: 'nsg-westus1'
location: 'westus'
}
nsg2: {
name: 'nsg-east1'
location: 'eastus'
}
}
resource nsg 'Microsoft.Network/networkSecurityGroups@2025-01-01' = [for nsg in items(nsgValues): {
name: nsg.value.name
location: nsg.value.location
}]
Smyčka s podmínkou
Pro prostředky a moduly můžete přidat if výraz se syntaxí smyčky pro podmíněné nasazení kolekce.
Následující příklad ukazuje smyčku v kombinaci s podmínkovým příkazem. V tomto příkladu se pro všechny instance modulu použije jedna podmínka:
param location string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true
var baseName = 'store${uniqueString(resourceGroup().id)}'
module stgModule './storageAccount.bicep' = [for i in range(0, storageCount): if(createNewStorage) {
name: '${i}deploy${baseName}'
params: {
storageName: '${i}${baseName}'
location: location
}
}]
Další příklad ukazuje, jak použít podmínku specifickou pro aktuální prvek v poli:
resource parentResources 'Microsoft.Example/examples@2024-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
}]
}
}]
Nasazovat v dávkách
Prostředky Azure se ve výchozím nastavení nasazují paralelně. Když k vytvoření více instancí typu prostředku použijete smyčku, všechny tyto instance se nasadí současně. Pořadí, ve kterém jsou vytvořené, není zaručeno. Neomezený počet prostředků lze nasadit paralelně, s výjimkou celkového omezení na 800 prostředků v souboru Bicep.
Možná nebudete chtít aktualizovat všechny instance typu prostředku najednou. Například při aktualizaci produkčního prostředí můžete chtít aktualizace postupně rozložit tak, aby se najednou aktualizoval pouze určitý počet. Můžete zadat podmnožinu instancí, které mají být dávkovány společně a nasazeny současně. Ostatní instance čekají na dokončení této dávky.
Chcete-li serialně nasadit instance prostředku, přidejte batchSize dekorátor. Nastavte jeho hodnotu na počet instancí, které se mají nasadit souběžně. Vzniká závislost během dřívějších instancí ve smyčce, a proto se nespustí jedna dávka, dokud se předchozí dávka nedokončí.
param location string = resourceGroup().location
@batchSize(2)
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, 4): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
Pro sekvenční nasazení nastavte velikost dávky na 1.
Dekorátor batchSize je v jmenném prostoru sys. Pokud potřebujete odlišit tento dekorátor od jiné položky se stejným názvem, připojte dekorátor s sys: @sys.batchSize(2)
Iterace pro dětský prostředek
Pokud chcete vytvořit více než jednu instanci podřízeného prostředku, tuto úlohu podporují oba následující soubory Bicep:
Vnořené dílčí zdroje
param location string = resourceGroup().location
resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: 'examplestorage'
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
resource service 'fileServices' = {
name: 'default'
resource share 'shares' = [for i in range(0, 3): {
name: 'exampleshare${i}'
}]
}
}
Podřízené prostředky nejvyšší úrovně
resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2025-06-01' = {
name: 'default'
parent: stg
}
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2025-06-01' = [for i in range(0, 3): {
name: 'exampleshare${i}'
parent: service
}]
Kolekce referenčních zdrojů/modulů
Funkce šablony Azure Resource Manageru (šablona ARM) references vrátí pole objektů, které představují stavy běhového prostředí kolekce prostředků. Vzhledem k tomu, že v Bicep není explicitní references funkce a použití symbolických kolekcí se používá přímo, Bicep ji přeloží na šablonu ARM, která při generování kódu využívá funkci šablony references ARM. Funkce překladu, která používá references k transformaci symbolických kolekcí na šablony ARM, vyžaduje Rozhraní příkazového řádku Bicep verze 0.20.X nebo vyšší. Kromě toho v souborubicepconfig.json by mělo být nastavení symbolicNameCodegen prezentováno a nastaveno na true.
Výstupy dvou ukázek v celočíselném indexu lze zapsat takto:
param location string = resourceGroup().location
param storageCount int = 2
resource storageAcct 'Microsoft.Storage/storageAccounts@2025-06-01' = [for i in range(0, storageCount): {
name: '${i}storage${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
}]
output storageInfo array = map(storageAcct, store => {
blobEndpoint: store.properties.primaryEndpoints
status: store.properties.statusOfPrimary
})
output storageAccountEndpoints array = map(storageAcct, store => store.properties.primaryEndpoints)
Tento soubor Bicep se transpiluje do následující šablony JSON ARM, která používá funkci references.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"languageVersion": "1.10-experimental",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"storageCount": {
"type": "int",
"defaultValue": 2
}
},
"resources": {
"storageAcct": {
"copy": {
"name": "storageAcct",
"count": "[length(range(0, parameters('storageCount')))]"
},
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[format('{0}storage{1}', range(0, parameters('storageCount'))[copyIndex()], uniqueString(resourceGroup().id))]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage"
}
},
"outputs": {
"storageInfo": {
"type": "array",
"value": "[map(references('storageAcct', 'full'), lambda('store', createObject('blobEndpoint', lambdaVariables('store').properties.primaryEndpoints, 'status', lambdaVariables('store').properties.statusOfPrimary)))]"
},
"storageAccountEndpoints": {
"type": "array",
"value": "[map(references('storageAcct', 'full'), lambda('store', lambdaVariables('store').properties.primaryEndpoints))]"
}
}
}
Všimněte si, že v předchozí šabloně ARM JSON musí být languageVersion nastavena na 1.10-experimental hodnotu a prvek prostředku je objekt místo pole.
Další kroky
Informace o vytváření souborů Bicep najdete v tématu Struktura a syntaxe souborů Bicep.