使用參數和輸出,為您的 Azure Resource Manager 範本增加彈性

已完成

在上一個單元中,您已建立 Azure Resource Manager (ARM) 範本,並將 Azure 儲存體帳戶新增至其中。 您可能已經注意到範本有問題。 儲存體帳戶名稱是硬式編碼的。 您每次只能使用此範本部署相同的儲存體帳戶。 若要部署不同名稱的儲存體帳戶,必須建立新的範本,這不是將部署自動化的實用方式。 儲存體帳戶 SKU 也是硬式編碼的,也就是說,您無法針對不同的環境,改變儲存體帳戶的類型。 回想一下,在我們的案例中,每個部署都可能會有不同類型的儲存體帳戶。 您可以為儲存體帳戶 SKU 新增參數,讓您的範本增加重複使用性。

在此單元中,您將了解範本的 parametersoutputs 區段。

ARM 範本參數

ARM 範本參數讓您能提供針對特定環境的值來自訂部署。 例如,您可以根據是否要部署至用於開發、測試、實際執行等等的環境,傳入不同的值。 例如,先前的範本會使用 Standard_LRS 儲存體帳戶 SKU。 您可以將儲存體帳戶 SKU 的名稱設為參數,以針對可建立儲存體帳戶的其他部署,重複使用此範本。 接著,您要在部署範本時,傳入您想要用於此特定部署的 SKU 名稱。 您可以在命令列或使用參數檔案來執行此步驟。

在範本的 parameters 區段中,您要指定可以在部署資源時輸入的值。 一個範本的限制為 256 個參數。 參數定義可以使用大部分的範本函式。

參數的可用屬性包括:

"parameters": {
  "<parameter-name>": {
    "type": "<type-of-parameter-value>",
    "defaultValue": "<default-value-of-parameter>",
    "allowedValues": [
      "<array-of-allowed-values>"
    ],
    "minValue": <minimum-value-for-int>,
    "maxValue": <maximum-value-for-int>,
    "minLength": <minimum-length-for-string-or-array>,
    "maxLength": <maximum-length-for-string-or-array-parameters>,
    "metadata": {
      "description": "<description-of-the-parameter>"
    }
  }
}

允許的參數類型為:

  • string
  • secureString
  • integers
  • boolean
  • object
  • secureObject
  • 陣列

使用參數的建議

針對根據環境 (例如 SKU、大小或容量) 而有所不同的設定,請使用參數。 對於您想要自行指定以方便識別或要符合內部命名慣例的資源名稱,也請使用參數。 提供每個參數的描述,並盡可能使用預設值。

基於安全性理由,請務必不要為範本中的使用者名稱和/或密碼進行硬式編碼或提供預設值。 請一律為使用者名稱和密碼 (或祕密) 使用參數。 針對所有密碼和祕密使用 secureString。 如果您在 JSON 物件中傳遞敏感性資料,請使用 secureObject 類型。 資源部署之後,無法讀取或搜集具有 secureStringsecureObject 類型的範本參數。

在 ARM 範本中使用參數

在 ARM 範本的 parameters 區段中,請指定您可在部署資源時輸入的參數。 一個範本的限制為 256 個參數。

以下是範本檔案的範例,其中儲存體帳戶 SKU 的參數定義於範本的 parameters 區段中。 如果在執行時未指定任何值,您可以為要使用的參數提供預設值。

"parameters": {
  "storageAccountType": {
    "type": "string",
    "defaultValue": "Standard_LRS",
    "allowedValues": [
      "Standard_LRS",
      "Standard_GRS",
      "Standard_ZRS",
      "Premium_LRS"
    ],
    "metadata": {
      "description": "Storage Account type"
    }
  }
}

接著,在資源定義中使用參數。 語法是 [parameters('name of the parameter')]。 您將使用 parameters 函式。 您會在下一個課程模組中深入了解函式。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-04-01",
    "name": "learntemplatestorage123",
    "location": "[resourceGroup().location]",
    "sku": {
      "name": "[parameters('storageAccountType')]"
    },
    "kind": "StorageV2",
    "properties": {
      "supportsHttpsTrafficOnly": true
    }
  }
]

當您部署範本時,可以提供參數的值。 請注意下列命令中的最後一行:

templateFile="azuredeploy.json"
az deployment group create \
  --name testdeployment1 \
  --template-file $templateFile \
  --parameters storageAccountType=Standard_LRS

ARM 範本輸出

在 ARM 範本的 outputs 區段中,您可以指定將在成功部署後傳回的值。 以下是組成 outputs 區段的元素。

"outputs": {
  "<output-name>": {
    "condition": "<boolean-value-whether-to-output-value>",
    "type": "<type-of-output-value>",
    "value": "<output-value-expression>",
    "copy": {
      "count": <number-of-iterations>,
      "input": <values-for-the-variable>
    }
  }
}
元素 描述
output-name 必須是有效的 JavaScript 識別碼。
condition (選擇性) 布林值,指出是否傳回此輸出值。 如果是 True,此值會包含在部署的輸出中。 如果是 False,則會跳過此部署的輸出值。 若未指定,預設值為 True。
type 輸出值的類型。
value (選擇性) 經過評估並傳回為輸出值的範本語言運算式。
copy (選擇性) Copy 用於傳回多個輸出值。

在 ARM 範本中使用輸出

以下是輸出儲存體帳戶端點的範例:

"outputs": {
  "storageEndpoint": {
    "type": "object",
    "value": "[reference('learntemplatestorage123').primaryEndpoints]"
  }
}

請注意運算式的 reference 部分。 此函式會取得儲存體帳戶的執行階段狀態。

重新部署 ARM 範本

回想一下,ARM 範本具「等冪性」,也就是說,您可以再次將範本部署至相同的環境,且如果範本中沒有任何變更,環境中將不會有任何變更。 如果對範本進行了變更 (例如,您變更了參數值),則只會部署該變更。 您的範本可以包含 Azure 解決方案所需的所有資源,而且您可以安全地再次執行範本。 僅當資源還未存在時才會建立資源,而且只有在有變更時才會進行更新。