Penyebaran kondisional dengan templat ARM

Terkadang Anda perlu menyebarkan sumber daya secara opsional dalam templat Azure Resource Manager (templat ARM) atau file Bicep. Gunakan elemen condition untuk menentukan apakah sumber daya disebarkan. Nilai untuk kondisi ini diselesaikan dengan benar atau salah. Ketika nilai tersebut benar, sumber daya dibuat. Saat bernilai false, sumber daya tidak dibuat. Nilai hanya dapat diterapkan ke seluruh sumber daya.

Catatan

Penyebaran kondisional tidak berkaskade dengan sumber daya turunan. Jika Anda ingin meyebarkan sumber daya dan turunannya secara kondisional, Anda harus menerapkan kondisi yang sama untuk setiap jenis sumber daya.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari lebih lanjut, lihat penyebaran bersyarat.

Kondisi penyebaran

Anda dapat meneruskan nilai parameter yang menunjukkan apakah sumber daya disebarkan. Contoh berikut menyebarkan zona DNS secara kondisional.

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

Untuk contoh yang lebih kompleks, lihat Azure SQL logical server.

Sumber daya baru atau yang sudah ada

Anda dapat menggunakan penyebaran kondisional untuk membuat sumber daya baru atau menggunakan sumber daya yang sudah ada. Contoh berikut menunjukkan cara menyebarkan akun penyimpanan baru atau menggunakan akun penyimpanan yang sudah ada.

{
  "$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')))]"
    }
  }
}

Ketika parameter newOrExisting diatur ke baru, kondisi bernilai benar. Akun penyimpanan disebarkan. Jika tidak, akun penyimpanan yang ada digunakan.

Untuk contoh templat lengkap yang menggunakan condition elemen, lihat VM dengan Virtual Network, Penyimpanan, dan IP Publik baru atau yang sudah ada.

Fungsi runtime

Jika Anda menggunakan fungsi referensi atau daftar dengan sumber daya yang disebarkan secara kondisional, fungsi tersebut dievaluasi meskipun sumber daya tidak disebarkan. Anda mendapatkan kesalahan jika fungsi merujuk ke sumber daya yang tidak ada.

Gunakan fungsi if untuk memastikan fungsi hanya dievaluasi untuk kondisi saat sumber daya sedang disebarkan. Lihat fungsi if untuk templat sampel yang menggunakan if dan reference dengan sumber daya yang disebarkan secara kondisional.

Anda set sumber daya sebagai dependen pada sumber daya kondisional persis seperti yang Anda lakukan pada sumber daya lainnya. Saat sumber daya kondisional tidak disebarkan, Azure Resource Manager secara otomatis menghapusnya dari dependensi yang diperlukan.

Mode lengkap

Jika Anda menyebarkan templat dengan mode lengkap dan resource tidak diterapkan karena condition bernilai false, hasilnya bergantung pada versi REST API mana yang Anda gunakan untuk menyebarkan template. Jika Anda menggunakan versi yang lebih lama dari 2019-05-10, sumber daya tidak dihapus. Dengan 2019-05-10 atau yang lebih baru, sumber daya dihapus. Versi terbaru Azure PowerShell dan Azure CLI menghapus sumber daya saat kondisinya false.

Langkah berikutnya