ARM 範本中的輸出

本文說明如何在 Azure Resource Manager 範本 (ARM 範本) 中定義輸出值。 當您需要從已部署的資源傳回值時,您可以使用輸出。

每個輸出值的格式都必須解析成其中一種資料類型

提示

我們建議使用 Bicep,因為其提供的功能與 ARM 範本相同,而且語法更易於使用。 若要深入了解,請參閱輸出

範本中限制使用 64 個輸出。 如需詳細資訊,請參閱範本限制

定義輸出值

下列範例示範如何從已部署的資源傳回屬性。

outputs 區段新增至範本。 輸出值會取得公用 IP 位址的完整網域名稱。

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

如果您需要輸出名稱中具有連字號的屬性,請在名稱前後加上括弧,而不是使用點標記法。 例如,使用 ['property-name'] 而不是 .property-name

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "user": {
      "user-name": "Test Person"
    }
  },
  "resources": [
  ],
  "outputs": {
    "nameResult": {
      "type": "string",
      "value": "[variables('user')['user-name']]"
    }
  }
}

條件式輸出

您可以使用 condition 元素以有條件地傳回值。 一般來說,當您有條件地部署資源時,會使用條件式輸出。 下列範例示範如何根據是否部署新的 IP 位址,有條件地傳回公用 IP 位址的資源識別碼:

"outputs": {
  "resourceID": {
    "condition": "[equals(parameters('publicIpNewOrExisting'), 'new')]",
    "type": "string",
    "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
  }
}

如需條件式輸出的簡單範例,請參閱條件式輸出範本 (英文)。

動態輸出數目

在某些情況下,您在建立範本時並不知道傳回值所需的執行個體數目。 您可以使用反覆輸出來傳回數量可變的多個值。 新增 copy 元素以反覆輸出。

"outputs": {
  "storageEndpoints": {
    "type": "array",
    "copy": {
      "count": "[parameters('storageCount')]",
      "input": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
    }
  }
}

如需詳細資訊,請參閱 ARM 範本中的輸出反覆運算

連結的範本

您可以使用連結的範本部署相關的範本。 若要從連結的範本中擷取輸出值,請使用父範本中的參考函式。 父範本中的語法為:

"[reference('<deploymentName>').outputs.<propertyName>.value]"

下列範例示範如何藉由從連結的範本中擷取值,在負載平衡器上設定 IP 位址。

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs.resourceID.value]"
}

如果屬性名稱有連字號,請在名稱前後加上括弧,而不是使用點標記法。

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs['resource-ID'].value]"
}

您無法在巢狀範本的輸出區段中使用 reference 函式。 若要傳回巢狀範本中已部署資源的值,請將巢狀範本轉換成連結範本。

公用 IP 位址範本會建立公用 IP 位址並輸出資源識別碼。 負載平衡器範本會連結至先前的範本。 範本會在建立負載平衡器時,使用輸出中的資源識別碼。

範本範例

下列範本不會部署任何資源, 而是示範幾個傳回不同類型輸出的方式。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [],
  "outputs": {
    "stringOutput": {
      "type": "string",
      "value": "[deployment().name]"
    },
    "integerOutput": {
      "type": "int",
      "value": "[length(environment().authentication.audiences)]"
    },
    "booleanOutput": {
      "type": "bool",
      "value": "[contains(deployment().name, 'demo')]"
    },
    "arrayOutput": {
      "type": "array",
      "value": "[environment().authentication.audiences]"
    },
    "objectOutput": {
      "type": "object",
      "value": "[subscription()]"
    }
  }
}

取得輸出值

當部署成功時,系統會自動在部署的結果中傳回輸出值。

若要從部署歷程記錄取得輸出值,您可以使用指令碼。

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

輸出中的物件排序

在 JSON 中,物件是零或多個索引鍵/值組的未排序集合。 根據實作而定,排序可能會不同。 例如,Bicep items() 函式會依字母順序排序物件。 在其他位置,可以保留原始排序。 由於這種非確定性,請避免在編寫與部署參數和輸出互動的程式碼時,對物件索引鍵的排序進行任何假設。

下一步