Omówienie struktury i składni plików Bicep
W tym artykule opisano strukturę i składnię pliku Bicep. Przedstawia on różne sekcje pliku i właściwości, które są dostępne w tych sekcjach.
Aby zapoznać się z samouczkiem krok po kroku, który przeprowadzi Cię przez proces tworzenia pliku Bicep, zobacz Szybki start: tworzenie plików Bicep za pomocą programu Visual Studio Code.
Format Bicep
Bicep to język deklaratywny, co oznacza, że elementy mogą pojawiać się w dowolnej kolejności. W przeciwieństwie do języków imperatywnych kolejność elementów nie ma wpływu na sposób przetwarzania wdrożenia.
Plik Bicep zawiera następujące elementy.
@<decorator>(<argument>)
metadata <metadata-name> = ANY
targetScope = '<scope>'
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>
@<decorator>(<argument>)
param <parameter-name> <parameter-data-type> = <default-value>
@<decorator>(<argument>)
var <variable-name> = <variable-value>
@<decorator>(<argument>)
resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
<resource-properties>
}
@<decorator>(<argument>)
module <module-symbolic-name> '<path-to-file>' = {
name: '<linked-deployment-name>'
params: {
<parameter-names-and-values>
}
}
@<decorator>(<argument>)
output <output-name> <output-data-type> = <output-value>
Poniższy przykład przedstawia implementację tych elementów.
metadata description = 'Creates a storage account and a web app'
@description('The prefix to use for the storage account name.')
@minLength(3)
@maxLength(11)
param storagePrefix string
param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
Metadane
Metadane w Bicep to nietypowa wartość, którą można uwzględnić w plikach Bicep. Umożliwia ona podanie dodatkowych informacji na temat plików Bicep, w tym szczegółów, takich jak jego nazwa, opis, autor, data utworzenia i nie tylko.
Zakres docelowy
Domyślnie zakres docelowy jest ustawiony na resourceGroup
wartość . Jeśli wdrażasz na poziomie grupy zasobów, nie musisz ustawiać zakresu docelowego w pliku Bicep.
Dozwolone wartości to:
- resourceGroup — wartość domyślna używana dla wdrożeń grup zasobów.
- subskrypcja — używana do wdrożeń subskrypcji.
- managementGroup — służy do wdrożeń grup zarządzania.
- dzierżawa — używana na potrzeby wdrożeń dzierżawy.
W module można określić zakres inny niż zakres pozostałej części pliku Bicep. Aby uzyskać więcej informacji, zobacz Konfigurowanie zakresu modułu
Dekoratory
Dla każdego z następujących elementów można dodać co najmniej jeden dekorator:
Dekoratory obejmują:
Dekorator | Zastosuj do elementu | Zastosuj do typu danych | Argument | opis |
---|---|---|---|---|
Dozwolone | Param | wszystkie | tablica | Użyj tego dekoratora, aby upewnić się, że użytkownik udostępnia poprawne wartości. Ten dekorator jest dozwolony tylko w param instrukcjach. Aby zadeklarować, że właściwość musi być jednym z zestawu wstępnie zdefiniowanych wartości w type instrukcji lub output , użyj składni typu unii. Składnia typu unii może być również używana w param instrukcjach. |
batchSize | moduł, zasób | Nie dotyczy | integer | Konfigurowanie wystąpień w celu sekwencyjnego wdrażania. |
opis | func, param, module, output, resource, type, var | wszystkie | string | Podaj opisy elementów. Tekst w formacie markdown może służyć do tekstu opisu. |
Rozróżniacza | param, typ, dane wyjściowe | obiekt | string | Użyj tego dekoratora, aby upewnić się, że prawidłowa podklasa jest identyfikowana i zarządzana. Aby uzyskać więcej informacji, zobacz Custom-tagged union data type (Typ danych unii z tagiem niestandardowym). |
eksportowanie | func, type, var | wszystkie | Brak | Wskazuje, że element może zostać zaimportowany przez inny plik Bicep. |
maxLength | param, output, type | tablica, ciąg | int | Maksymalna długość ciągu i elementów tablicy. Wartość jest inkluzywna. |
maxValue | param, output, type | int | int | Maksymalna wartość dla elementów całkowitych. Ta wartość jest inkluzywna. |
metadane | func, output, param, type | wszystkie | obiekt | Właściwości niestandardowe, które mają być stosowane do elementów. Może zawierać właściwość opisu, która jest równoważna dekoratorowi opisu. |
minLength | param, output, type | tablica, ciąg | int | Minimalna długość elementów ciągu i tablicy. Wartość jest inkluzywna. |
minValue | param, output, type | int | int | Minimalna wartość dla elementów całkowitych. Ta wartość jest inkluzywna. |
sealed | param, typ, dane wyjściowe | obiekt | Brak | Podnieś poziom BCP089 z ostrzeżenia do błędu, gdy nazwa właściwości typu danych use-define jest prawdopodobnie literówką. Aby uzyskać więcej informacji, zobacz Podnoszenie poziomu błędu. |
bezpieczeństwo | param, typ | ciąg, obiekt | Brak | Oznacza parametr jako bezpieczny. Wartość bezpiecznego parametru nie jest zapisywana w historii wdrażania i nie jest rejestrowana. Aby uzyskać więcej informacji, zobacz Zabezpieczanie ciągów i obiektów. |
Parametry
Użyj parametrów dla wartości, które muszą się różnić w przypadku różnych wdrożeń. Można zdefiniować wartość domyślną parametru, który jest używany, jeśli podczas wdrażania nie podano żadnej wartości.
Możesz na przykład dodać parametr jednostki SKU, aby określić różne rozmiary zasobu. Możesz przekazać różne wartości w zależności od tego, czy wdrażasz w środowisku testowym, czy produkcyjnym.
param storageSKU string = 'Standard_LRS'
Parametr jest dostępny do użycia w pliku Bicep.
sku: {
name: storageSKU
}
Dla każdego parametru można dodać co najmniej jeden dekorator. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Parametry w Bicep.
Zmienne
Plik Bicep może być bardziej czytelny, hermetyzując złożone wyrażenia w zmiennej. Możesz na przykład dodać zmienną dla nazwy zasobu, która jest tworzona przez połączenie kilku wartości.
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
Zastosuj tę zmienną wszędzie tam, gdzie potrzebne jest wyrażenie złożone.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
Dla każdej zmiennej można dodać co najmniej jeden dekorator. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Zmienne w Bicep.
Typy
Instrukcję type
można użyć do zdefiniowania typów danych zdefiniowanych przez użytkownika.
param location string = resourceGroup().location
type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'
type storageAccountConfigType = {
name: string
sku: storageAccountSkuType
}
param storageAccountConfig storageAccountConfigType = {
name: 'storage${uniqueString(resourceGroup().id)}'
sku: 'Standard_LRS'
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
Można dodać co najmniej jeden dekorator dla każdego typu danych zdefiniowanego przez użytkownika. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Typy danych zdefiniowanych przez użytkownika.
Funkcje
W pliku Bicep możesz utworzyć własne funkcje oprócz używania standardowych funkcji Bicep, które są automatycznie dostępne w plikach Bicep. Utwórz własne funkcje, gdy masz skomplikowane wyrażenia, które są używane wielokrotnie w plikach Bicep.
func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'
output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
Aby uzyskać więcej informacji, zobacz Funkcje zdefiniowane przez użytkownika.
Zasoby
Użyj słowa kluczowego resource
, aby zdefiniować zasób do wdrożenia. Deklaracja zasobu zawiera symboliczną nazwę zasobu. Ta nazwa symboliczna jest używana w innych częściach pliku Bicep, aby uzyskać wartość z zasobu.
Deklaracja zasobu zawiera typ zasobu i wersję interfejsu API. W treści deklaracji zasobu dołącz właściwości specyficzne dla typu zasobu.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
Dla każdego zasobu można dodać co najmniej jeden dekorator. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Deklarację zasobu w Bicep.
Niektóre zasoby mają relację nadrzędny/podrzędny. Zasób podrzędny można zdefiniować wewnątrz zasobu nadrzędnego lub poza nim.
W poniższym przykładzie pokazano, jak zdefiniować zasób podrzędny w ramach zasobu nadrzędnego. Zawiera konto magazynu z podrzędnym zasobem (usługą plików) zdefiniowanym na koncie magazynu. Usługa plików ma również zasób podrzędny (udział), który jest w nim zdefiniowany.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
resource service 'fileServices' = {
name: 'default'
resource share 'shares' = {
name: 'exampleshare'
}
}
}
W następnym przykładzie pokazano, jak zdefiniować zasób podrzędny poza zasobem nadrzędnym. Właściwość nadrzędna służy do identyfikowania relacji nadrzędny/podrzędny. Zdefiniowano te same trzy zasoby.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2023-04-01' = {
name: 'default'
parent: storage
}
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
name: 'exampleshare'
parent: service
}
Aby uzyskać więcej informacji, zobacz Ustawianie nazwy i typu dla zasobów podrzędnych w Bicep.
Moduły
Moduły umożliwiają ponowne użycie kodu z pliku Bicep w innych plikach Bicep. W deklaracji modułu połączysz się z plikiem w celu ponownego użycia. Podczas wdrażania pliku Bicep zasoby w module są również wdrażane.
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
Nazwa symboliczna umożliwia odwołanie się do modułu z innego miejsca w pliku. Na przykład możesz uzyskać wartość wyjściową z modułu przy użyciu nazwy symbolicznej i nazwy wartości wyjściowej.
Dla każdego modułu można dodać co najmniej jeden dekorator. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Use Bicep modules (Używanie modułów Bicep).
Dane wyjściowe
Użyj danych wyjściowych, aby zwrócić wartości z wdrożenia. Zazwyczaj zwracana jest wartość z wdrożonego zasobu, gdy trzeba ponownie użyć tej wartości dla innej operacji.
output storageEndpoint object = stg.properties.primaryEndpoints
Dla każdego wyjścia można dodać co najmniej jeden dekorator. Aby uzyskać więcej informacji, zobacz Use decorators (Używanie dekoratorów).
Aby uzyskać więcej informacji, zobacz Dane wyjściowe w Bicep.
Pętle
Możesz dodać pętle iteracyjne do pliku Bicep, aby zdefiniować wiele kopii elementu:
- zasób
- moduł
- zmienna
- właściwość
- output
Użyj wyrażenia, for
aby zdefiniować pętlę.
param moduleCount int = 2
module stgModule './example.bicep' = [for i in range(0, moduleCount): {
name: '${i}deployModule'
params: {
}
}]
Można iterować na tablicy, obiektu lub indeksu całkowitego.
Aby uzyskać więcej informacji, zobacz Iteracyjne pętle w Bicep.
Wdrożenie warunkowe
Możesz dodać zasób lub moduł do pliku Bicep, który jest wdrażany warunkowo. Podczas wdrażania warunek jest oceniany, a wynik określa, czy zasób lub moduł został wdrożony. Użyj wyrażenia , if
aby zdefiniować wdrożenie warunkowe.
param deployZone bool
resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
name: 'myZone'
location: 'global'
}
Aby uzyskać więcej informacji, zobacz Wdrażanie warunkowe w aplikacji Bicep.
Whitespace
Spacje i karty są ignorowane podczas tworzenia plików Bicep.
Bicep jest wrażliwy na nową linię. Na przykład:
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
...
}
Nie można napisać jako:
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' =
if (newOrExisting == 'new') {
...
}
Zdefiniuj obiekty i tablice w wielu wierszach.
Komentarze
Służy //
do komentarzy jednowierszowych lub /* ... */
komentarzy wielowierszowych
W poniższym przykładzie przedstawiono komentarz jednowierszowy.
// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
...
}
W poniższym przykładzie przedstawiono komentarz wielowierszowy.
/*
This Bicep file assumes the key vault already exists and
is in same subscription and resource group as the deployment.
*/
param existingKeyVaultName string
Ciągi wielowierszowe
Ciąg można podzielić na wiele wierszy. Użyj trzech znaków '''
pojedynczego cudzysłowu, aby rozpocząć i zakończyć ciąg wielowierszowy.
Znaki w ciągu wielowierszowym są obsługiwane tak, jak to jest. Znaki ucieczki są niepotrzebne. Nie można uwzględnić '''
w ciągu wielowierszowym. Interpolacja ciągów nie jest obecnie obsługiwana.
Możesz uruchomić ciąg bezpośrednio po otwarciu '''
lub dołączyć nowy wiersz. W obu przypadkach wynikowy ciąg nie zawiera nowego wiersza. W zależności od zakończenia wiersza w pliku Bicep nowe wiersze są interpretowane jako \r\n
lub \n
.
W poniższym przykładzie przedstawiono ciąg wielowierszowy.
var stringVar = '''
this is multi-line
string with formatting
preserved.
'''
Powyższy przykład jest odpowiednikiem następującego kodu JSON.
"variables": {
"stringVar": "this is multi-line\r\n string with formatting\r\n preserved.\r\n"
}
Deklaracje wielowierszowe
Teraz można używać wielu wierszy w deklaracjach funkcji, tablicy i obiektów. Ta funkcja wymaga interfejsu wiersza polecenia Bicep w wersji 0.7.X lub nowszej.
W poniższym przykładzie definicja jest podzielona resourceGroup()
na wiele wierszy.
var foo = resourceGroup(
mySubscription,
myRgName)
Zobacz Tablice i obiekty, aby zapoznać się z przykładami deklaracji wielowierszowych.
Znane ograniczenia
- Brak obsługi koncepcji apiProfile, która służy do mapowania pojedynczego elementu apiProfile na zestaw apiVersion dla każdego typu zasobu.
- Funkcje zdefiniowane przez użytkownika nie są obecnie obsługiwane. Jednak funkcja eksperymentalna jest obecnie dostępna. Aby uzyskać więcej informacji, zobacz Funkcje zdefiniowane przez użytkownika w Bicep.
- Niektóre funkcje Bicep wymagają odpowiedniej zmiany języka pośredniego (szablony JSON usługi Azure Resource Manager). Ogłaszamy te funkcje jako dostępne, gdy wszystkie wymagane aktualizacje zostały wdrożone na globalnej platformie Azure. Jeśli używasz innego środowiska, takiego jak usługa Azure Stack, może wystąpić opóźnienie w dostępności funkcji. Funkcja Bicep jest dostępna tylko wtedy, gdy język pośredni został również zaktualizowany w tym środowisku.
Następne kroki
Aby zapoznać się z wprowadzeniem do Bicep, zobacz Co to jest Bicep?. Aby uzyskać informacje o typach danych Bicep, zobacz Typy danych.