ARM 模板中的输出迭代

本文展示了如何为 Azure 资源管理器模板(ARM 模板)中的输出创建多个值。 通过将 copy 循环添加到模板的 outputs 节,可以在部署过程中动态返回许多项。

还可以将 copy 循环用于 resourcesproperties in a resourcevariables

提示

我们建议使用 Bicep,因为它提供与 ARM 模板相同的功能,并且该语法更易于使用。 若要了解详情,请参阅循环

语法

copy 元素添加到模板的 output 节可返回许多项。 copy 元素采用以下常规格式:

"copy": {
  "count": <number-of-iterations>,
  "input": <values-for-the-output>
}

count 属性指定要对该输出值进行的迭代次数。

input 属性指定要重复的属性。 可以创建一个由 input 属性中的值构造的元素数组。 它可以是单个属性(例如字符串),也可以是具有多个属性的对象。

复制限制

count 不能超过 800。

count 不能为负数。 如果使用最新版本的 Azure CLI、PowerShell 或 REST API 部署模板,则它可以为零。 具体而言,必须使用:

  • Azure PowerShell 2.6 或更高版本
  • Azure CLI 2.0.74 或更高版本
  • REST API 版本 2019-05-10 或更高版本
  • 链接的部署必须将 API 版本 2019-05-10 或更高版本用于部署资源类型

更早版本的 PowerShell、CLI 和 REST API 不支持将 count 设为零。

输出迭代

以下示例创建可变数量的存储帐户,并返回每个存储帐户的终结点:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageCount": {
      "type": "int",
      "defaultValue": 2
    }
  },
  "variables": {
    "baseName": "[concat('storage', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(), variables('baseName'))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": "[parameters('storageCount')]"
      }
    }
  ],
  "outputs": {
    "storageEndpoints": {
      "type": "array",
      "copy": {
        "count": "[parameters('storageCount')]",
        "input": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
      }
    }
  }
}

前面的模板返回包含以下值的数组:

[
  "https://0storagecfrbqnnmpeudi.blob.core.chinacloudapi.cn/",
  "https://1storagecfrbqnnmpeudi.blob.core.chinacloudapi.cn/"
]

下一示例返回新存储帐户的三个属性。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageCount": {
      "type": "int",
      "defaultValue": 2
    }
  },
  "variables": {
    "baseName": "[concat('storage', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(), variables('baseName'))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": "[parameters('storageCount')]"
      }
    }
  ],
  "outputs": {
    "storageInfo": {
      "type": "array",
      "copy": {
        "count": "[parameters('storageCount')]",
        "input": {
          "id": "[reference(concat(copyIndex(), variables('baseName')), '2019-04-01', 'Full').resourceId]",
          "blobEndpoint": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]",
          "status": "[reference(concat(copyIndex(), variables('baseName'))).statusOfPrimary]"
        }
      }
    }
  }
}

前面的示例返回包含以下值的数组:

[
  {
    "id": "Microsoft.Storage/storageAccounts/0storagecfrbqnnmpeudi",
    "blobEndpoint": "https://0storagecfrbqnnmpeudi.blob.core.chinacloudapi.cn/",
    "status": "available"
  },
  {
    "id": "Microsoft.Storage/storageAccounts/1storagecfrbqnnmpeudi",
    "blobEndpoint": "https://1storagecfrbqnnmpeudi.blob.core.chinacloudapi.cn/",
    "status": "available"
  }
]

后续步骤