A JSON és a Bicep összehasonlítása sablonokhoz

Ez a cikk összehasonlítja a Bicep-szintaxist az Azure Resource Manager-sablonok (ARM-sablonok) JSON-szintaxisával. A Bicep a legtöbb esetben olyan szintaxist biztosít, amely kevésbé részletes, mint a JSON megfelelője.

Ha ismeri az ARM-sablonok JSON-alapú használatát, az alábbi példákkal megismerheti a Bicep megfelelő szintaxisát.

Teljes fájlok összehasonlítása

A Bicep Playground segítségével egymás mellett tekintheti meg a Bicepet és az azzal egyenértékű JSON-t. Összehasonlíthatja ugyanannak az infrastruktúrának az implementációit.

Megtekintheti például a fájlt egy SQL Server és egy adatbázis üzembe helyezéséhez. A Bicep körülbelül fele az ARM-sablon méretének.

Képernyőkép egymás melletti sablonokról

Kifejezések

Kifejezés létrehozása:

func()
"[func()]"

Paraméterek

Alapértelmezett értékkel rendelkező paraméter deklarálása:

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

Paraméterérték lekéréséhez használja a megadott nevet:

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

Változók

Változó deklarálása:

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

Változó értékének lekéréséhez használja a megadott nevet:

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

Sztringek

Sztringek összefűzéséhez:

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

Logikai operátorok

A logikai ÉS visszaadása:

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

Érték feltételes beállítása:

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

Üzembehelyezési hatókör

Az üzembe helyezés célhatókörének beállítása:

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

Források

Erőforrás deklarálása:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

Erőforrás feltételes üzembe helyezése:

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

Erőforrástulajdonság beállítása:

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

Egy erőforrás erőforrás-azonosítójának lekérése a sablonban:

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

Hurkok

Tömb elemeinek vagy darabszámának iterálása:

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

Erőforrás-függőségek

A Bicep esetében beállíthat explicit függőséget, de ez a megközelítés nem ajánlott. Ehelyett implicit függőségekre támaszkodhat. Implicit függőség akkor jön létre, ha egy erőforrás-deklaráció egy másik erőforrás azonosítójára hivatkozik.

Az alábbiakban egy hálózati biztonsági csoport implicit függőségével rendelkező hálózati adapter látható. A hálózati biztonsági csoportra hivatkozik a következővel 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
    }
  }
}

Ha explicit függőséget kell beállítania, használja a következőt:

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

Referencia-erőforrások

Tulajdonság lekérése a sablon egyik erőforrásából:

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

Tulajdonság lekérése olyan meglévő erőforrásból, amely nincs üzembe helyezve a sablonban:

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

A Bicepben használja a beágyazott kiegészítőt (::) egy szülőerőforrásba beágyazott erőforrás tulajdonságának lekéréséhez:

VNet1::Subnet1.properties.addressPrefix

JSON esetén használja a referenciafüggvényt:

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

Kimenetek

Tulajdonság kimenete egy erőforrásból a sablonban:

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

Érték feltételes kimenete:

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

A Bicep ternáris operátor egyenértékű az ARM-sablon JSON-sablonjának if függvényével , nem pedig a feltétel tulajdonságával. A ternáris szintaxisnak az egyik vagy a másik értékre kell kiértékelnie. Ha a feltétel hamis az előző mintákban, a Bicep egy üres sztringgel rendelkező gazdagépnevet ad ki, de a JSON nem ad ki értékeket.

Kód újrafelhasználása

Megoldás több fájlra való elválasztása:

Következő lépések