Variabel dalam templat ARM

Artikel ini mendeskripsikan cara menentukan dan menggunakan variabel dalam templat Azure Resource Manager Anda (templat ARM). Gunakan variabel untuk menyederhanakan templat Anda. Daripada mengulangi ekspresi rumit di seluruh templat Anda, Anda tentukan variabel yang berisi ekspresi rumit. Kemudian, Anda gunakan variabel tersebut sesuai kebutuhan di seluruh templat Anda.

Resource Manager menyelesaikan nilai parameter sebelum memulai operasi penyebaran. Di mana pun parameter digunakan dalam templat, Resource Manager menggantinya dengan nilai yang diselesaikan.

Tip

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

Anda dibatasi hingga 256 variabel dalam templat. Untuk informasi selengkapnya, lihat Batas templat.

Menentukan variabel

Saat menentukan variabel, Anda tidak menentukan jenis data untuk variabel. Sebagai gantinya, berikan nilai atau ekspresi templat. Jenis variabel tersebut disimpulkan dari nilai yang diselesaikan. Contoh berikut mengatur variabel ke string.

"variables": {
  "stringVar": "example value"
},

Untuk membangun variabel, Anda dapat menggunakan nilai dari parameter atau variabel lain.

"parameters": {
  "inputValue": {
    "defaultValue": "deployment parameter",
    "type": "string"
  }
},
"variables": {
  "stringVar": "myVariable",
  "concatToVar": "[concat(variables('stringVar'), '-addtovar') ]",
  "concatToParam": "[concat(parameters('inputValue'), '-addtoparam')]"
}

Anda dapat menggunakan fungsi templat untuk membuat nilai variabel.

Contoh berikut membuat nilai string untuk nama akun penyimpanan. Ini menggunakan beberapa fungsi templat untuk mendapatkan nilai parameter, dan menggabungkannya ke string yang unik.

"variables": {
  "storageName": "[concat(toLower(parameters('storageNamePrefix')), uniqueString(resourceGroup().id))]"
},

Anda tidak dapat menggunakan fungsi referensi atau fungsi daftar apa pun dalam deklarasi variabel. Fungsi tersebut mendapatkan status runtime sumber daya, dan tidak dapat dijalankan sebelum penyebaran ketika variabel diselesaikan.

Menggunakan variabel

Contoh berikut menunjukkan cara menggunakan variabel untuk properti sumber daya.

Untuk mereferensikan nilai variabel, gunakan fungsi variabel.

"variables": {
  "storageName": "[concat(toLower(parameters('storageNamePrefix')), uniqueString(resourceGroup().id))]"
},
"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageName')]",
    ...
  }
]

Contoh templat

Templat berikut tidak menyebarkan sumber daya apa pun. Ini menunjukkan beberapa cara mendeklarasikan variabel dari berbagai jenis.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "inputValue": {
      "defaultValue": "deployment parameter",
      "type": "string"
    }
  },
  "variables": {
    "stringVar": "myVariable",
    "concatToVar": "[concat(variables('stringVar'), '-addtovar') ]",
    "concatToParam": "[concat(parameters('inputValue'), '-addtoparam')]",
    "arrayVar": [
      1,
      2,
      3,
      4
    ],
    "objectVar": {
      "property1": "value1",
      "property2": "value2"
    },
    "copyWithinVar": {
      "copy": [
        {
          "name": "disks",
          "count": 5,
          "input": {
            "name": "[concat('myDataDisk', copyIndex('disks', 1))]",
            "diskSizeGB": "1",
            "diskIndex": "[copyIndex('disks')]"
          }
        },
        {
          "name": "diskNames",
          "count": 5,
          "input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
        }
      ]
    },
    "copy": [
      {
        "name": "topLevelCopy1",
        "count": 5,
        "input": {
          "name": "[concat('oneDataDisk', copyIndex('topLevelCopy1', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('topLevelCopy1')]"
        }
      },
      {
        "name": "topLevelCopy2",
        "count": 3,
        "input": {
          "name": "[concat('twoDataDisk', copyIndex('topLevelCopy2', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('topLevelCopy2')]"
        }
      },
      {
        "name": "topLevelCopy3",
        "count": 4,
        "input": "[concat('stringValue', copyIndex('topLevelCopy3'))]"
      },
      {
        "name": "topLevelCopy4",
        "count": 4,
        "input": "[copyIndex('topLevelCopy4')]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "stringOutput": {
      "type": "string",
      "value": "[variables('stringVar')]"
    },
    "concatToVariableOutput": {
      "type": "string",
      "value": "[variables('concatToVar')]"
    },
    "concatToParameterOutput": {
      "type": "string",
      "value": "[variables('concatToParam')]"
    },
    "arrayOutput": {
      "type": "array",
      "value": "[variables('arrayVar')]"
    },
    "arrayElementOutput": {
      "type": "int",
      "value": "[variables('arrayVar')[0]]"
    },
    "objectOutput": {
      "type": "object",
      "value": "[variables('objectVar')]"
    },
    "copyWithinVariableOutput": {
      "type": "object",
      "value": "[variables('copyWithinVar')]"
    },
    "topLevelCopyOutput1": {
      "type": "array",
      "value": "[variables('topLevelCopy1')]"
    },
    "topLevelCopyOutput2": {
      "type": "array",
      "value": "[variables('topLevelCopy2')]"
    },
    "topLevelCopyOutput3": {
      "type": "array",
      "value": "[variables('topLevelCopy3')]"
    },
    "topLevelCopyOutput4": {
      "type": "array",
      "value": "[variables('topLevelCopy4')]"
    }
  }
}

Variabel konfigurasi

Anda dapat menahan variabel yang menyimpan nilai terkait untuk mengonfigurasi lingkungan. Anda tentukan variabel sebagai objek dengan nilai. Contoh berikut menunjukkan objek yang menahan nilai untuk dua lingkungan - uji dan prod. Masukkan salah satu nilai tersebut selama penyebaran.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "environmentName": {
      "type": "string",
      "allowedValues": [
        "test",
        "prod"
      ],
      "metadata": {
        "description": "Specify either test or prod for configuration values."
      }
    }
  },
  "variables": {
    "environmentSettings": {
      "test": {
        "instanceSize": "Small",
        "instanceCount": 1
      },
      "prod": {
        "instanceSize": "Large",
        "instanceCount": 4
      }
    }
  },
  "resources": [],
  "outputs": {
    "instanceSize": {
      "value": "[variables('environmentSettings')[parameters('environmentName')].instanceSize]",
      "type": "string"
    },
    "instanceCount": {
      "value": "[variables('environmentSettings')[parameters('environmentName')].instanceCount]",
      "type": "int"
    }
  }
}

Langkah berikutnya