Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
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:
- W przypadku aplikacji Bicep użyj modułów.
- W przypadku szablonów ARM użyj połączonych szablonów.
Dalsze kroki
- Aby uzyskać informacje na temat Bicep, zobacz przewodnik Szybki start dotyczący aplikacji Bicep.
- Aby dowiedzieć się więcej o konwertowaniu szablonów ARM między językami JSON i Bicep, zobacz Konwertowanie szablonów ARM między JSON i Bicep.