Moduly Bicep

Bicep umožňuje uspořádat nasazení do modulů. Modul je soubor Bicep (nebo šablona JSON ARM), který je nasazený z jiného souboru Bicep. Díky modulům zlepšíte čitelnost souborů Bicep zapouzdřením složitých podrobností o nasazení. Moduly můžete také snadno opakovaně používat pro různá nasazení.

Pokud chcete sdílet moduly s dalšími lidmi ve vaší organizaci, vytvořte specifikaci šablony, veřejný registr nebo privátní registr. Specifikace šablon a moduly v registru jsou k dispozici pouze uživatelům se správnými oprávněními.

Tip

Volba mezi registrem modulů a specifikacemi šablon je většinou otázkou preference. Při výběru mezi těmito dvěma možnostmi je potřeba vzít v úvahu několik věcí:

  • Registr modulů podporuje pouze Bicep. Pokud ještě nepoužíváte Bicep, použijte specifikace šablon.
  • Obsah v registru modulu Bicep lze nasadit pouze z jiného souboru Bicep. Specifikace šablon je možné nasadit přímo z rozhraní API, Azure PowerShellu, Azure CLI a webu Azure Portal. Můžete dokonce použít UiFormDefinition k přizpůsobení prostředí nasazení portálu.
  • Bicep má několik omezených možností pro vkládání jiných artefaktů projektu (včetně souborů mimo Bicep a souborů bez šablony ARM). Například skripty PowerShellu, skripty rozhraní příkazového řádku a další binární soubory) pomocí funkcí loadTextContent a loadFileAsBase64 funkcí. Specifikace šablon nemohou tyto artefakty zabalit.

Moduly Bicep se převedou na jednu šablonu Azure Resource Manageru s vnořenými šablonami. Další informace o tom, jak Bicep řeší konfigurační soubory a jak Bicep slučuje uživatelsky definovaný konfigurační soubor s výchozím konfiguračním souborem, naleznete v tématu Proces překladu konfiguračních souborů a proces sloučení konfiguračních souborů.

Školicí materiály

Pokud byste se raději seznámili s moduly podrobnými pokyny, přečtěte si téma Vytváření kompozovatelných souborů Bicep pomocí modulů.

Syntaxe definice

Základní syntaxe pro definování modulu je:

module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

Příklad jednoduchého reálného světa by tedy vypadal takto:

module stgModule '../storageAccount.bicep' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Šablonu JSON ARM můžete použít také jako modul:

module stgModule '../storageAccount.json' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

K odkazování na modul v jiné části souboru Bicep použijte symbolický název. K získání výstupu z modulu můžete například použít symbolický název. Symbolický název může obsahovat a-z, A-Z, 0-9 a podtržítko (_). Název nemůže začínat číslem. Modul nemůže mít stejný název jako parametr, proměnná nebo prostředek.

Cesta může být buď místní soubor, nebo soubor v registru. Místní soubor může být buď soubor Bicep, nebo šablona JSON ARM. Další informace najdete v tématu Cesta k modulu.

Vlastnost name je povinná. Ve vygenerované šabloně se z něj stane název vnořeného prostředku nasazení.

Pokud se modul se statickým názvem nasadí souběžně do stejného oboru, existuje potenciál pro jedno nasazení, aby ovlivnilo výstup z druhého nasazení. Pokud například dva soubory Bicep používají stejný modul se stejným statickým názvem (examplemodule) a cílí na stejnou skupinu prostředků, jedno nasazení může zobrazit nesprávný výstup. Pokud máte obavy o souběžná nasazení do stejného oboru, zadejte jedinečný název modulu.

Následující příklad zřetězí název nasazení s názvem modulu. Pokud zadáte jedinečný název nasazení, název modulu je také jedinečný.

module stgModule 'storageAccount.bicep' = {
  name: '${deployment().name}-storageDeploy'
  scope: resourceGroup('demoRG')
}

Pokud potřebujete zadat obor , který se liší od oboru hlavního souboru, přidejte vlastnost oboru. Další informace najdete v tématu Nastavení oboru modulu.

// deploy to different scope
module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  scope: <scope-object>
  params: {
    <parameter-names-and-values>
  }
}

Pokud chcete podmíněně nasadit modul, přidejte if výraz. Použití se podobá podmíněnému nasazení prostředku.

// conditional deployment
module <symbolic-name> '<path-to-file>' = if (<condition-to-deploy>) {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

Pokud chcete nasadit více než jednu instanci modulu, přidejte for výraz. Dekorátor můžete použít batchSize k určení, zda jsou instance nasazeny sériově nebo paralelně. Další informace naleznete v tématu Iterativní smyčky v Bicep.

// iterative deployment
@batchSize(int) // optional decorator for serial deployment
module <symbolic-name> '<path-to-file>' = [for <item> in <collection>: {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}]

Podobně jako prostředky se moduly nasazují paralelně, pokud nezávisí na jiných modulech nebo prostředcích. Obvykle nemusíte nastavovat závislosti podle jejich implicitního určení. Pokud potřebujete nastavit explicitní závislost, můžete ji přidat dependsOn do definice modulu. Další informace o závislostech najdete v tématu Závislosti prostředků.

module <symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
  dependsOn: [
    <symbolic-names-to-deploy-before-this-item>
  ]
}

Cesta k modulu

Soubor modulu může být buď místní soubor, nebo externí soubor. Externí soubor může být ve specifikaci šablony nebo v registru modulu Bicep. Všechny tyto možnosti jsou uvedené níže.

Místní soubor

Pokud je modul místním souborem, zadejte relativní cestu k housku. Všechny cesty v Bicep musí být zadány pomocí oddělovače adresářů lomítko (/), aby se zajistila konzistentní kompilace napříč platformami. Zpětné lomítko systému Windows (\) není podporováno. Cesty můžou obsahovat mezery.

Pokud chcete například nasadit soubor o jednu úroveň v adresáři z hlavního souboru, použijte:

module stgModule '../storageAccount.bicep' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Soubor v registru

Veřejný registr modulů

Registr veřejného modulu je hostovaný v registru kontejneru Microsoftu (MCR). Zdrojový kód a moduly jsou uložené na GitHubu. Informace o dostupných modulech a jejich verzích najdete v indexu modulů registru Bicep.

The screenshot of public module registry.

Výběrem verzí zobrazíte dostupné verze. Můžete také vybrat Zdrojový kód, abyste viděli zdrojový kód modulu a otevřeli soubory Readme.

V současné době existuje jen několik publikovaných modulů. Připravujeme další moduly. Pokud chcete přispívat do registru, přečtěte si průvodce příspěvkem.

Pokud chcete vytvořit odkaz na modul veřejného registru, zadejte cestu k modulu s následující syntaxí:

module <symbolic-name> 'br/public:<file-path>:<tag>' = {}
  • br/public je alias veřejného registru modulu. Tento alias je předdefinovaný v konfiguraci.
  • Cesta k souboru může obsahovat segmenty, které mohou být odděleny znakem / .
  • značka se používá k zadání verze modulu.

Příklad:

module hw 'br/public:samples/hello-world:1.0.2' = {
  name: 'helloWorld'
  params: {
    name: 'John Dole'
  }
}

Poznámka:

br/public je alias veřejného registru. Lze ho také napsat jako

module <symbolic-name> 'br:mcr.microsoft.com/bicep/<file-path>:<tag>' = {}

Registr privátních modulů

Pokud jste publikovali modul do registru, můžete ho propojit. Zadejte název registru kontejneru Azure a cestu k modulu. Zadejte cestu k modulu s následující syntaxí:

module <symbolic-name> 'br:<registry-name>.azurecr.io/<file-path>:<tag>' = {
  • br je název schématu pro registr Bicep.
  • Cesta k souboru se volá repository ve službě Azure Container Registry. Cesta k souboru může obsahovat segmenty oddělené znakem / .
  • značka se používá k zadání verze modulu.

Příklad:

module stgModule 'br:exampleregistry.azurecr.io/bicep/modules/storage:v1' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Když odkazujete na modul v registru, rozšíření Bicep v editoru Visual Studio Code automaticky volá obnovení bicep ke zkopírování externího modulu do místní mezipaměti. Obnovení externího modulu chvíli trvá. Pokud intellisense pro modul nefunguje okamžitě, počkejte na dokončení obnovení.

Úplná cesta modulu v registru může být dlouhá. Místo zadání úplné cesty pokaždé, když chcete modul použít, můžete v souboru bicepconfig.json nakonfigurovat aliasy. Aliasy usnadňují odkazování na modul. Například pomocí aliasu můžete zkrátit cestu k:

module stgModule 'br/ContosoModules:storage:v1' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Předdefinoval se alias veřejného registru modulu:

module hw 'br/public:samples/hello-world:1.0.2' = {
  name: 'helloWorld'
  params: {
    name: 'John Dole'
  }
}

Veřejný alias v souboru bicepconfig.json můžete přepsat.

Soubor ve specifikaci šablony

Po vytvoření specifikace šablony můžete odkazovat na tuto specifikaci šablony v modulu. Zadejte specifikaci šablony v následujícím formátu:

module <symbolic-name> 'ts:<sub-id>/<rg-name>/<template-spec-name>:<version>' = {

Soubor Bicep ale můžete zjednodušit vytvořením aliasu pro skupinu prostředků, která obsahuje specifikace šablony. Když použijete alias, syntaxe se stane:

module <symbolic-name> 'ts/<alias>:<template-spec-name>:<version>' = {

Následující modul nasadí specifikaci šablony pro vytvoření účtu úložiště. Předplatné a skupina prostředků pro specifikaci šablony jsou definovány v aliasu ContosoSpecs.

module stgModule 'ts/ContosoSpecs:storageSpec:2.0' = {
  name: 'storageDeploy'
  params: {
    storagePrefix: 'examplestg1'
  }
}

Parametry

Parametry, které zadáte v definici modulu, odpovídají parametrům v souboru Bicep.

Následující příklad Bicep má tři parametry – storagePrefix, storageSKU a umístění. Parametr storageSKU má výchozí hodnotu, takže během nasazování nemusíte zadávat hodnotu tohoto parametru.

@minLength(3)
@maxLength(11)
param storagePrefix string

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_RAGRS'
  'Standard_ZRS'
  'Premium_LRS'
  'Premium_ZRS'
  'Standard_GZRS'
  'Standard_RAGZRS'
])
param storageSKU string = 'Standard_LRS'

param location string

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

output storageEndpoint object = stg.properties.primaryEndpoints

Pokud chcete jako modul použít předchozí příklad, zadejte hodnoty pro tyto parametry.

targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

resource demoRG 'Microsoft.Resources/resourceGroups@2021-04-01' existing = {
  name: 'demogroup1'
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: demoRG
  params: {
    storagePrefix: namePrefix
    location: demoRG.location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

Nastavení rozsahu modulu

Při deklarování modulu můžete nastavit obor modulu, který se liší od rozsahu souboru obsahujícího Bicep. scope Pomocí vlastnosti nastavte obor modulu. Pokud není zadána vlastnost oboru, modul se nasadí v cílovém oboru nadřazeného objektu.

Následující soubor Bicep vytvoří skupinu prostředků a účet úložiště v této skupině prostředků. Soubor se nasadí do předplatného, ale modul je vymezený na novou skupinu prostředků.

// set the target scope for this file
targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

param location string = deployment().location

var resourceGroupName = '${namePrefix}rg'

resource newRG 'Microsoft.Resources/resourceGroups@2021-04-01' = {
  name: resourceGroupName
  location: location
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: newRG
  params: {
    storagePrefix: namePrefix
    location: location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

Další příklad nasadí účty úložiště do dvou různých skupin prostředků. Obě tyto skupiny prostředků už musí existovat.

targetScope = 'subscription'

resource firstRG 'Microsoft.Resources/resourceGroups@2021-04-01' existing = {
  name: 'demogroup1'
}

resource secondRG 'Microsoft.Resources/resourceGroups@2021-04-01' existing = {
  name: 'demogroup2'
}

module storage1 '../create-storage-account/main.bicep' = {
  name: 'westusdeploy'
  scope: firstRG
  params: {
    storagePrefix: 'stg1'
    location: 'westus'
  }
}

module storage2 '../create-storage-account/main.bicep' = {
  name: 'eastusdeploy'
  scope: secondRG
  params: {
    storagePrefix: 'stg2'
    location: 'eastus'
  }
}

Nastavte vlastnost oboru na platný objekt oboru. Pokud soubor Bicep nasadí skupinu prostředků, předplatné nebo skupinu pro správu, můžete nastavit obor modulu na symbolický název daného prostředku. Nebo můžete použít funkce oboru k získání platného oboru.

Tyto funkce jsou:

Následující příklad používá managementGroup funkci k nastavení oboru.

param managementGroupName string

module mgDeploy 'main.bicep' = {
  name: 'deployToMG'
  scope: managementGroup(managementGroupName)
}

Výstup

Hodnoty můžete získat z modulu a použít je v hlavním souboru Bicep. Pokud chcete získat výstupní hodnotu z modulu, použijte outputs vlastnost objektu modulu.

První příklad vytvoří účet úložiště a vrátí primární koncové body.

@minLength(3)
@maxLength(11)
param storagePrefix string

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_RAGRS'
  'Standard_ZRS'
  'Premium_LRS'
  'Premium_ZRS'
  'Standard_GZRS'
  'Standard_RAGZRS'
])
param storageSKU string = 'Standard_LRS'

param location string

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

output storageEndpoint object = stg.properties.primaryEndpoints

Pokud se používá jako modul, můžete tuto výstupní hodnotu získat.

targetScope = 'subscription'

@minLength(3)
@maxLength(11)
param namePrefix string

resource demoRG 'Microsoft.Resources/resourceGroups@2021-04-01' existing = {
  name: 'demogroup1'
}

module stgModule '../create-storage-account/main.bicep' = {
  name: 'storageDeploy'
  scope: demoRG
  params: {
    storagePrefix: namePrefix
    location: demoRG.location
  }
}

output storageEndpoint object = stgModule.outputs.storageEndpoint

Další kroky