Udostępnij przez


Porównywanie plików JSON i Bicep dla szablonów

W tym artykule porównaliśmy składnię Bicep ze składnią JSON dla szablonów usługi Azure Resource Manager (szablonów usługi ARM). W większości przypadków Bicep udostępnia składnię, która jest mniej szczegółowa niż odpowiednik w formacie JSON.

Jeśli znasz język JSON do opracowywania szablonów ARM, skorzystaj z poniższych przykładów, aby poznać równoważną składnię dla Bicep.

Porównywanie pełnych plików

Bicep Playground umożliwia wyświetlanie kodu Bicep i równoważnego kodu JSON obok siebie. Można porównać implementacje tej samej infrastruktury.

Możesz na przykład wyświetlić plik w celu wdrożenia serwera SQL i bazy danych. Bicep ma około połowę rozmiaru szablonu ARM.

Zrzut ekranu przedstawiający szablony obok siebie

Wyrażenia

Aby utworzyć wyrażenie:

func()
"[func()]"

Parametry

Aby zadeklarować parametr z wartością domyślną:

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

Aby uzyskać wartość parametru, użyj zdefiniowanej nazwy:

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

Zmienne

Aby zadeklarować zmienną:

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

Aby uzyskać wartość zmiennej, użyj zdefiniowanej nazwy:

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

Ciągi

Aby połączyć ciągi:

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

Operatory logiczne

Aby zwrócić wartość logiczną AND:

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

Aby warunkowo ustawić wartość:

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

Zakres wdrożenia

Aby ustawić zakres docelowy wdrożenia:

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

Zasoby

Aby zadeklarować zasób:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2025-04-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2024-03-01",
    ...
  }
]

Aby warunkowo wdrożyć zasób:

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

Aby ustawić właściwość zasobu:

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

Aby uzyskać identyfikator zasobu w szablonie:

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

Pętle

Aby iterować elementy w tablicy lub liczbie:

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

Zależności zasobów

W przypadku Bicep można ustawić jawną zależność, ale to podejście nie jest zalecane. Zamiast tego polegaj na niejawnych zależnościach. Zależność niejawna jest tworzona, gdy jedna deklaracja zasobu odwołuje się do identyfikatora innego zasobu.

Poniżej przedstawiono interfejs sieciowy z niejawną zależnością od sieciowej grupy zabezpieczeń. Odwołuje się do sieciowej grupy zabezpieczeń za pomocą polecenia netSecurityGroup.id.

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

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

Jeśli musisz ustawić jawną zależność, użyj:

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

Zasoby referencyjne

Aby uzyskać właściwość z zasobu w szablonie:

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

Aby pobrać właściwość z istniejącego zasobu, który nie został wdrożony w szablonie:

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-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]"

W aplikacji Bicep użyj zagnieżdżonego dostępu (::), aby uzyskać właściwość w zasobie zagnieżdżonym w ramach zasobu nadrzędnego.

VNet1::Subnet1.properties.addressPrefix

W przypadku formatu JSON użyj funkcji referencyjnej:

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

Wyniki

Aby wyświetlić właściwość z zasobu w szablonie:

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

Aby warunkowo wygenerować wartość:

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

Operator ternary Bicep jest odpowiednikiem funkcji if w JSON szablonu ARM, a nie właściwości warunku. Składnia ternary musi zwracać jedną z dwóch wartości. Jeśli warunek jest fałszywy w poprzednich przykładach, Bicep zwraca nazwę hosta z pustym ciągiem, ale dane wyjściowe JSON nie zawierają żadnych wartości.

Ponowne użycie kodu

Aby podzielić rozwiązanie na wiele plików:

Dalsze kroki