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.
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@2024-03-01' = {
...
}
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
Podmíněné nasazení prostředku:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-01' = if(deployVM) {
...
}
"resources": [
{
"condition": "[parameters('deployVM')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-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@2023-11-01' = {
...
}
resource nic1 'Microsoft.Network/networkInterfaces@2023-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@2023-04-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ů:
- Pro Bicep použijte moduly.
- Pro šablony ARM použijte propojené šablony.
Další kroky
- Informace o nástroji Bicep najdete v rychlém startu pro Bicep.
- Další informace o převodu šablon mezi jazyky najdete v tématu Převod šablon ARM mezi JSON a Bicep.