Porovnání JSON a Bicep pro šablony

Tento článek porovnává syntaxi Bicep se syntaxí JSON pro šablony Azure Resource Manager (šablony ARM). Ve většině případů bicep poskytuje syntaxi, která je méně podrobná než ekvivalent ve formátu JSON.

Pokud umíte používat JSON k vývoji šablon ARM, v následujících příkladech se seznámíte s ekvivalentní syntaxí pro Bicep.

Porovnání úplných souborů

Bicep Playground umožňuje zobrazit Bicep a ekvivalentní JSON vedle sebe. Můžete porovnat implementace stejné infrastruktury.

Můžete například zobrazit soubor pro nasazení sql serveru a databáze. Bicep má přibližně polovinu velikosti šablony ARM.

Snímek obrazovky se šablonami vedle sebe

Výrazy

Vytvoření výrazu:

func()
"[func()]"

Parametry

Deklarace parametru s výchozí hodnotou:

param orgName string = 'Contoso'
"parameters": {
  "orgName": {
    "type": "string",
    "defaultValue": "Contoso"
  }
}

Pokud chcete získat hodnotu parametru, použijte název, který jste definovali:

name: orgName
"name": "[parameters('orgName'))]"

Proměnné

Deklarace proměnné:

var description = 'example value'
"variables": {
  "description": "example value"
},

Pokud chcete získat hodnotu proměnné, použijte název, který jste definovali:

workloadSetting: description
"workloadSetting": "[variables('description'))]"

Řetězce

Zřetězení řetězců:

name: '${namePrefix}-vm'
"name": "[concat(parameters('namePrefix'), '-vm')]"

Logické operátory

Vrácení logického operátoru AND:

isMonday && isNovember
[and(parameter('isMonday'), parameter('isNovember'))]

Podmíněné nastavení hodnoty:

isMonday ? 'valueIfTrue' : 'valueIfFalse'
[if(parameters('isMonday'), 'valueIfTrue', 'valueIfFalse')]

Obor nasazení

Nastavení cílového rozsahu nasazení:

targetScope = 'subscription'
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#"

Zdroje informací

Deklarace prostředku:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

Podmíněné nasazení prostředku:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2023-03-01",
    ...
  }
]

Nastavení vlastnosti prostředku:

sku: '2016-Datacenter'
"sku": "2016-Datacenter",

Získání ID prostředku v šabloně:

nic1.id
[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]

Smyčky

Iterace položek v poli nebo počtu:

[for storageName in storageAccountNames: {
  ...
}]
"copy": {
  "name": "storagecopy",
  "count": "[length(parameters('storageAccountNames'))]"
},
...

Závislosti prostředků

Pro Bicep můžete nastavit explicitní závislost, ale tento přístup se nedoporučuje. Místo toho se spolehněte na implicitní závislosti. Implicitní závislost se vytvoří, když jedna deklarace prostředku odkazuje na identifikátor jiného prostředku.

Následující příklad ukazuje síťové rozhraní s implicitní závislostí na skupině zabezpečení sítě. Odkazuje na skupinu zabezpečení sítě pomocí netSecurityGroup.id.

resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2022-11-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2022-11-01' = {
  name: nic1Name
  location: location
  properties: {
    ...
    networkSecurityGroup: {
      id: netSecurityGroup.id
    }
  }
}

Pokud musíte nastavit explicitní závislost, použijte:

dependsOn: [ storageAccount ]
"dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', 'parameters('storageAccountName'))]"]

Referenční zdroje

Získání vlastnosti z prostředku v šabloně:

storageAccount.properties.primaryEndpoints.blob
[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]

Získání vlastnosti z existujícího prostředku, který není nasazený v šabloně:

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
  name: storageAccountName
}

// use later in template as often as needed
storageAccount.properties.primaryEndpoints.blob
// required every time the property is needed
"[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"

V Nástroji Bicep použijte vnořený přístup (::) k získání vlastnosti prostředku vnořeného v rámci nadřazeného prostředku:

VNet1::Subnet1.properties.addressPrefix

Pro JSON použijte referenční funkci:

[reference(resourceId('Microsoft.Network/virtualNetworks/subnets', variables('subnetName'))).properties.addressPrefix]

Výstupy

Výstup vlastnosti z prostředku v šabloně:

output hostname string = publicIP.properties.dnsSettings.fqdn
"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

Podmíněný výstup hodnoty:

output hostname string = condition ? publicIP.properties.dnsSettings.fqdn : ''
"outputs": {
  "hostname": {
    "condition": "[variables('condition')]",
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  }
}

Ternární operátor Bicep je ekvivalentem funkce if v souboru JSON šablony ARM, nikoli vlastnosti condition. Ternární syntaxe se musí vyhodnotit na jednu nebo druhou hodnotu. Pokud je podmínka v předchozích ukázkách nepravdivá, bicep vypíše název hostitele s prázdným řetězcem, ale JSON nevypíše žádné hodnoty.

Opakované použití kódu

Rozdělení řešení do více souborů:

Další kroky