Condividi tramite


Riconoscere la struttura e la sintassi dei file Bicep

Questo articolo descrive la struttura e la sintassi di un file Bicep. Presenta le diverse sezioni del file e le proprietà disponibili in tali sezioni.

Per un'esercitazione dettagliata che illustra il processo di creazione di un file Bicep, vedere Avvio rapido: Creare file Bicep con Visual Studio Code.

Formato Bicep

Bicep è un linguaggio dichiarativo, il che significa che gli elementi possono essere visualizzati in qualsiasi ordine. A differenza dei linguaggi imperativi, l'ordine degli elementi non influisce sul modo in cui viene elaborata la distribuzione.

Un file Bicep include gli elementi seguenti.

@<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>

Nell'esempio seguente viene visualizzata un'implementazione di questi elementi.

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
  }
}

Metadati UFX

I metadati in Bicep sono un valore non tipizzato che può essere incluso nei file Bicep. Consente di fornire informazioni supplementari sui file Bicep, inclusi dettagli come il nome, la descrizione, l'autore, la data di creazione e altro ancora.

Ambito target

Per impostazione predefinita, l'ambito di destinazione è impostato su resourceGroup. Se si esegue la distribuzione a livello di gruppo di risorse, non è necessario impostare l'ambito di destinazione nel file Bicep.

I valori consentiti sono:

In un modulo è possibile specificare un ambito diverso dall'ambito per il resto del file Bicep. Per altre informazioni, vedere Configurare l'ambito del modulo

Elementi Decorator

È possibile aggiungere uno o più elementi Decorator per ognuno degli oggetti seguenti:

Gli elementi Decorator includono:

Decorator Applicare all'elemento Applicare al tipo di dati Argomento Descrizione
consentito param tutto array Usare questo elemento decorator per assicurarsi che l'utente fornisca valori corretti. L’espressione Decorator è consentita solo per le istruzioni param. Per dichiarare che una proprietà deve essere uno dei set di valori predefiniti in un'istruzione type o output, usare la sintassi dei tipi di unione. La sintassi dei tipi di unione può essere usata anche nelle istruzioni param.
batchSize module, resource N/D integer Consente di configurare le istanze da distribuire in sequenza.
description func, param, module, output, resource, type, var tutto string Consente di fornire descrizioni per gli elementi. Per il testo della descrizione, è possibile usare testo con formato Markdown.
discriminator param, type, output oggetto string Usare questo elemento Decorator per assicurarsi che venga identificata e gestita la sottoclasse corretta. Per altre informazioni, vedere Tipo di dati unione con tag personalizzati.
esportare func, type, var tutto Nessuno Indica che l'elemento può essere importato da un altro file Bicep.
maxLength param, output, type array, stringa int Lunghezza massima per gli elementi string e array. Il valore è inclusivo.
maxValue param, output, type int int Valore massimo per gli elementi integer. Questo valore è inclusivo.
metadata func, output, param, type tutto oggetto Proprietà personalizzate da applicare agli elementi. Può includere una proprietà description equivalente all'elemento decorator della descrizione.
minLength param, output, type array, stringa int Lunghezza minima per gli elementi string e array. Il valore è inclusivo.
minValue param, output, type int int Valore minimo per gli elementi integer. Questo valore è inclusivo.
sealed param, type, output oggetto Nessuno Consente di elevare BCP089 da avviso a errore quando è probabile che un nome di proprietà di un tipo di dati definito dall'utente contenga un errore di digitazione. Per altre informazioni, vedere Elevare il livello di errore.
secure param, type stringa, oggetto Nessuno Contrassegna il parametro come sicuro. Il valore di un parametro sicuro non viene salvato nella cronologia di distribuzione e non viene registrato. Per altre informazioni, vedere Proteggere stringhe e oggetti.

Parametri

Usare i parametri per i valori che devono variare per distribuzioni diverse. È possibile definire un valore predefinito per il parametro usato se non viene specificato alcun valore durante la distribuzione.

Ad esempio, è possibile aggiungere un parametro SKU per specificare dimensioni diverse per una risorsa. È possibile passare valori diversi a seconda che si stia distribuendo in fase di test o produzione.

param storageSKU string = 'Standard_LRS'

Il parametro è disponibile per l'uso nel file Bicep.

sku: {
  name: storageSKU
}

È possibile aggiungere uno o più elementi Decorator per ogni parametro. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Parametri in Bicep.

Variabili

È possibile rendere il file Bicep più leggibile incapsulando espressioni complesse in una variabile. Ad esempio, è possibile aggiungere una variabile per un nome di risorsa costruito concatenando diversi valori insieme.

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

Applicare questa variabile ovunque sia necessaria l'espressione complessa.

resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: uniqueStorageName

È possibile aggiungere uno o più elementi Decorator per ogni variabile. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Variabili in Bicep.

Tipi

È possibile usare l'istruzione type per definire i tipi di dati definiti dall'utente.

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'
}

È possibile aggiungere uno o più elementi Decorator per ogni tipo di dati definito dall'utente. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Tipi di dati definiti dall'utente.

Funzioni

Nel file Bicep è possibile creare funzioni personalizzate oltre a usare le funzioni Bicep standard disponibili automaticamente nei file Bicep. Creare funzioni personalizzate quando sono presenti espressioni complesse che vengono usate ripetutamente nei file 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')

Per altre informazioni, vedere Eseguire funzioni definite dall'utente.

Risorse

Usare la parola chiave resource per definire una risorsa da distribuire. La dichiarazione di risorsa include un nome simbolico per la risorsa. Questo nome simbolico viene usato in altre parti del file Bicep per ottenere un valore dalla risorsa.

La dichiarazione di risorsa include il tipo di risorsa e la versione dell'API. All'interno del corpo della dichiarazione di risorsa includere proprietà specifiche del tipo di risorsa.

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

È possibile aggiungere uno o più elementi Decorator per ogni risorsa. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Dichiarazione di risorse in Bicep.

Alcune risorse hanno una relazione padre/figlio. È possibile definire una risorsa figlio all'interno della risorsa padre o all'esterno di essa.

Nell'esempio seguente viene illustrato come definire una risorsa figlio all'interno di una risorsa padre. Contiene un account di archiviazione con una risorsa figlio (servizio file) definita all'interno dell'account di archiviazione. Il servizio file include anche una risorsa figlio (condivisione) definita al suo interno.

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'
    }
  }
}

Nell'esempio seguente viene illustrato come definire una risorsa figlio all'esterno della risorsa padre. Utilizzare la proprietà padre per identificare una relazione padre/figlio. Vengono definite le stesse tre risorse.

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
}

Per altre informazioni, vedere Impostare il nome e il tipo per le risorse figlio nel file Bicep.

Moduli

I moduli consentono di riutilizzare il codice da un file Bicep in altri file Bicep. Nella dichiarazione del modulo si collega al file da riutilizzare. Quando si distribuisce il file Bicep, vengono distribuite anche le risorse nel modulo.

module webModule './webApp.bicep' = {
  name: 'webDeploy'
  params: {
    skuName: 'S1'
    location: location
  }
}

Il nome simbolico consente di fare riferimento al modulo da un'altra posizione nel file. Ad esempio, è possibile ottenere un valore di output da un modulo usando il nome simbolico e il nome del valore di output.

È possibile aggiungere uno o più elementi Decorator per ogni modulo. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Usare i moduli Bicep.

Output

Usare gli output per restituire valori dalla distribuzione. In genere, si restituisce un valore da una risorsa distribuita quando è necessario riutilizzare tale valore per un'altra operazione.

output storageEndpoint object = stg.properties.primaryEndpoints

È possibile aggiungere uno o più elementi Decorator per ogni output. Per altre informazioni, vedere Usare elementi Decorator.

Per altre informazioni, vedere Output in Bicep.

Cicli

È possibile aggiungere cicli iterativi al file Bicep per definire più copie di un oggetto :

  • resource
  • modulo
  • Variabile
  • proprietà
  • output

Usare l'espressione for per definire un ciclo.

param moduleCount int = 2

module stgModule './example.bicep' = [for i in range(0, moduleCount): {
  name: '${i}deployModule'
  params: {
  }
}]

È possibile eseguire l'iterazione su una matrice, un oggetto o un indice intero.

Per altre informazioni, vedere Cicli iterativi in Bicep.

Distribuzione condizionale

È possibile aggiungere una risorsa o un modulo al file Bicep distribuito in modo condizionale. Durante la distribuzione, la condizione viene valutata e il risultato determina se la risorsa o il modulo viene distribuito. Usare l'espressione if per definire una distribuzione condizionale.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

Per altre informazioni, vedere Distribuzione condizionale in Bicep.

Spazio vuoto

Gli spazi e le schede vengono ignorati durante la creazione di file Bicep.

Bicep è sensibile alla nuova riga. Ad esempio:

resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
  ...
}

Non è possibile scrivere come segue:

resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' =
    if (newOrExisting == 'new') {
      ...
    }

Definire oggetti e matrici in più righe.

Commenti

Usare // per i commenti a riga singola o /* ... */ per i commenti su più righe

Nell'esempio seguente viene illustrato un commento a riga singola.

// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
  ...
}

Nell'esempio seguente viene illustrato un commento su più righe.

/*
  This Bicep file assumes the key vault already exists and
  is in same subscription and resource group as the deployment.
*/
param existingKeyVaultName string

Stringhe multilinea

È possibile suddividere una stringa in più righe. Usare tre caratteri virgolette singole ''' per iniziare e terminare la stringa multilinea.

I caratteri all'interno della stringa a più righe vengono gestiti così come sono. I caratteri di escape non sono necessari. Non è possibile includere ''' nella stringa multilinea. L'interpolazione di stringhe non è attualmente supportata.

È possibile avviare la stringa subito dopo ''' di apertura o includere una nuova riga. In entrambi i casi, la stringa risultante non include una nuova riga. A seconda delle terminazioni di riga nel file Bicep, le nuove righe vengono interpretate come \r\n o \n.

Nell'esempio seguente viene illustrata una stringa multilinea.

var stringVar = '''
this is multi-line
  string with formatting
  preserved.
'''

L'esempio precedente è equivalente al codice JSON seguente.

"variables": {
  "stringVar": "this is multi-line\r\n  string with formatting\r\n  preserved.\r\n"
}

Dichiarazioni multilinea

È ora possibile usare più righe nelle dichiarazioni di funzione, matrice e oggetto. Questa funzione richiede l'interfaccia della riga di comando di Bicep versione 0.7.X o successiva.

Nell'esempio seguente la definizione resourceGroup() viene suddivisa in più righe.

var foo = resourceGroup(
  mySubscription,
  myRgName)

Vedere Matrici e oggetti per esempi di dichiarazione multilinea.

Limitazioni note

  • Nessun supporto per il concetto di apiProfile, usato per eseguire il mapping di un singolo apiProfile a un set apiVersion per ogni tipo di risorsa.
  • Le funzioni definite dall'utente non sono attualmente supportate. Tuttavia, una funzionalità sperimentale è attualmente accessibile. Per altre informazioni, vedere Funzioni definite dall'utente in Bicep.
  • Alcune funzionalità di Bicep richiedono una modifica corrispondente al linguaggio intermedio (modelli JSON di Azure Resource Manager). Queste funzionalità vengono annunciate come disponibili quando tutti gli aggiornamenti necessari sono stati distribuiti in Azure globale. Se si usa un ambiente diverso, ad esempio Azure Stack, potrebbe verificarsi un ritardo nella disponibilità della funzionalità. La funzionalità Bicep è disponibile solo quando il linguaggio intermedio è stato aggiornato anche in tale ambiente.

Passaggi successivi

Per un'introduzione a Bicep, vedere Che cos'è Bicep?. Per i tipi di dati Bicep, vedere Tipi di dati.