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.
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@2024-03-01' = {
...
}
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
Aby warunkowo wdrożyć zasób:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-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 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@2023-11-01' = {
...
}
resource nic1 'Microsoft.Network/networkInterfaces@2023-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@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]"
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:
- W przypadku Bicep użyj modułów.
- W przypadku szablonów usługi ARM użyj połączonych szablonów.
Następne kroki
- Aby uzyskać informacje na temat aplikacji Bicep, zobacz Bicep quickstart (Szybki start w aplikacji Bicep).
- Aby dowiedzieć się więcej na temat konwertowania szablonów między językami, zobacz Konwertowanie szablonów usługi ARM między formatami JSON i Bicep.