Voorwaardelijke implementatie in ARM-sjablonen

Soms moet u optioneel een resource implementeren in een Azure Resource Manager-sjabloon (ARM-sjabloon). Gebruik het condition element om op te geven of de resource wordt geïmplementeerd. De waarde voor de voorwaarde wordt omgezet in waar of onwaar. Wanneer de waarde waar is, wordt de resource gemaakt. Wanneer de waarde onwaar is, wordt de resource niet gemaakt. De waarde kan alleen worden toegepast op de hele resource.

Notitie

Voorwaardelijke implementatie wordt niet trapsgewijs naar onderliggende resources gebruikt. Als u een resource en de onderliggende resources voorwaardelijk wilt implementeren, moet u dezelfde voorwaarde toepassen op elk resourcetype.

Tip

We raden Bicep aan omdat het dezelfde mogelijkheden biedt als ARM-sjablonen en de syntaxis eenvoudiger te gebruiken is. Zie Voorwaardelijke implementaties voor meer informatie.

Voorwaarde implementeren

U kunt een parameterwaarde doorgeven die aangeeft of een resource is geïmplementeerd. In het volgende voorbeeld wordt voorwaardelijk een DNS-zone geïmplementeerd.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "deployZone": {
      "type": "bool"
    }
  },
  "functions": [],
  "resources": [
    {
      "condition": "[parameters('deployZone')]",
      "type": "Microsoft.Network/dnsZones",
      "apiVersion": "2018-05-01",
      "name": "myZone",
      "location": "global"
    }
  ]
}

Zie Azure SQL logische server voor een complexer voorbeeld.

Nieuwe of bestaande resource

U kunt voorwaardelijke implementatie gebruiken om een nieuwe resource te maken of een bestaande resource te gebruiken. In het volgende voorbeeld ziet u hoe u een nieuw opslagaccount implementeert of een bestaand opslagaccount gebruikt.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "newOrExisting": {
      "type": "string",
      "defaultValue": "new",
      "allowedValues": [
        "new",
        "existing"
      ]
    }
  },
  "resources": [
    {
      "condition": "[equals(parameters('newOrExisting'), 'new')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    {
      "condition": "[equals(parameters('newOrExisting'), 'existing')]",
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[parameters('storageAccountName')]"
    }
  ],
  "outputs": {
    "storageAccountId": {
      "type": "string",
      "value": "[if(equals(parameters('newOrExisting'), 'new'), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]"
    }
  }
}

Wanneer de parameter newOrExisting is ingesteld op nieuw, wordt de voorwaarde geëvalueerd als true. Het opslagaccount is geïmplementeerd. Anders wordt het bestaande opslagaccount gebruikt.

Zie VM with a new or existing Virtual Network, Storage, and Public IP (VM met een nieuwe of bestaande Virtual Network, opslag en openbaar IP-adres) voor een volledig voorbeeldsjabloon waarin het element wordt gebruiktcondition.

Runtime-functies

Als u een verwijzings- of lijstfunctie gebruikt met een resource die voorwaardelijk is geïmplementeerd, wordt de functie geëvalueerd, zelfs als de resource niet is geïmplementeerd. Er treedt een fout op als de functie verwijst naar een resource die niet bestaat.

Gebruik de functie if om ervoor te zorgen dat de functie alleen wordt geëvalueerd op voorwaarden wanneer de resource wordt geïmplementeerd. Zie de functie if voor een voorbeeldsjabloon die gebruikmaakt van if en reference met een voorwaardelijk geïmplementeerde resource.

U stelt een resource zo in dat deze afhankelijk is van een voorwaardelijke resource, precies zoals bij elke andere resource. Wanneer een voorwaardelijke resource niet wordt geïmplementeerd, verwijdert Azure Resource Manager deze automatisch uit de vereiste afhankelijkheden.

Modus Voltooien

Als u een sjabloon implementeert met de volledige modus en een resource niet wordt geïmplementeerd omdat condition deze resulteert in false, is het resultaat afhankelijk van de REST API-versie die u gebruikt om de sjabloon te implementeren. Als u een eerdere versie dan 2019-05-10 gebruikt, wordt de resource niet verwijderd. Met 2019-05-10 of hoger wordt de resource verwijderd. De meest recente versies van Azure PowerShell en Azure CLI verwijderen de resource wanneer de voorwaarde onwaar is.

Volgende stappen