Compartir a través de


Comparación de JSON y Bicep para plantillas

En este artículo se compara la sintaxis de Bicep con la sintaxis JSON de las plantillas de Azure Resource Manager (plantillas de ARM). En la mayoría de los casos, Bicep proporciona una sintaxis menos detallada que el equivalente en JSON.

Si está familiarizado con el uso de JSON para desarrollar plantillas de ARM, use los ejemplos siguientes para obtener información sobre la sintaxis equivalente para Bicep.

Comparación de archivos completos

Bicep Playground le permite visualizar Bicep y el JSON equivalente uno al lado del otro. Puede comparar las implementaciones de la misma infraestructura.

Por ejemplo, puede ver el archivo para implementar un servidor SQL Server y una base de datos. El tamaño del archivo Bicep es aproximadamente la mitad de la plantilla ARM.

Captura de pantalla de plantillas en paralelo

Expresiones

Para crear una expresión:

func()
"[func()]"

Parámetros

Para declarar un parámetro con un valor predeterminado:

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

Para obtener un valor de parámetro, use el nombre que definió:

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

variables

Para declarar una variable:

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

Para obtener un valor de variable, use el nombre que definió:

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

Cadenas

Para concatenar cadenas:

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

Operadores lógicos

Para devolver el operador AND lógico:

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

Para establecer condicionalmente un valor:

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

Ámbito de la implementación

Para establecer el ámbito de destino de la implementación:

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

Recursos

Para declarar un recurso:

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

Para implementar condicionalmente un recurso:

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

Para establecer una propiedad de recurso, siga estos pasos:

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

Para obtener el identificador de recurso de un recurso en la plantilla:

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

Bucles

Para recorrer en iteración los elementos de una matriz o un recuento:

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

Dependencias de recursos

Para Bicep, se puede establecer una dependencia explícita, pero no se recomienda este enfoque. En su lugar, confíe en dependencias implícitas. Se crea una dependencia implícita cuando una declaración de recursos hace referencia al identificador de otro recurso.

A continuación se muestra una interfaz de red con una dependencia implícita en un grupo de seguridad de red. Hace referencia al grupo de seguridad de red con netSecurityGroup.id.

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

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

Si debe establecer una dependencia explícita, use:

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

Recursos de referencia

Para obtener una propiedad de un recurso de la plantilla:

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

Para obtener una propiedad de un recurso existente que no se implementa en la plantilla:

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

En Bicep, use el descriptor de acceso anidado (::) para obtener una propiedad en un recurso anidado dentro de un recurso primario:

VNet1::Subnet1.properties.addressPrefix

Para JSON, use la función de referencia:

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

Salidas

Para generar una propiedad de un recurso en la plantilla:

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

Para generar condicionalmente un valor:

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

El operador ternario de Bicep es el equivalente a la función if en un JSON de plantilla de ARM, no a la propiedad condition. La sintaxis ternaria tiene que evaluarse en un valor u otro. Si la condición es false en los ejemplos anteriores, Bicep genera un nombre de host con una cadena vacía, pero JSON no genera ningún valor.

Reutilización de código

Para separar una solución en varios archivos:

Pasos siguientes