共用方式為


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() 函式會依字母順序排序物件。 在其他位置,可以保留原始排序。 由於這種非確定性,請避免在編寫與部署參數和輸出互動的程式碼時,對物件索引鍵的排序進行任何假設。

下一步