Porównywanie danych 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 (szablony 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 usługi ARM, skorzystaj z poniższych przykładów, aby poznać równoważną składnię Bicep.

Porównywanie kompletnych plików

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

Na przykład można wyświetlić plik w celu wdrożenia serwera SQL i bazy danych. Bicep ma około połowę rozmiaru szablonu usługi 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@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

Aby warunkowo wdrożyć zasób:

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

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

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

Aby uzyskać identyfikator zasobu 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 takie 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@2022-11-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2022-11-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@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]"

W aplikacji Bicep użyj zagnieżdżonego metody dostępu (::), aby uzyskać właściwość dla zasobu zagnieżdżonego 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]

Dane wyjściowe

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 Bicep ternary jest odpowiednikiem funkcji if w formacie JSON szablonu usługi ARM, a nie właściwości warunku. Składnia surowa musi obliczyć jedną wartość lub drugą. 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 oddzielić rozwiązanie do wielu plików:

Następne kroki