Azure ARM模板 - 使用其他部署的输出

时间:2015-08-17 19:47:30

标签: azure azure-resource-manager

我感兴趣的是读取不同资源组中另一个部署的输出参数。 我的ARM模板类似于:

  1. platform.json - 设置DNS,虚拟网络和安全性
  2. storage.json - 设置数据库和其他商店
  3. app.json - 设置网络应用程序/ api
  4. 每个都部署在 不同的 资源组中,因为它们具有不同的生命周期。但是,当我部署app.json时,我想提取最新平台和存储部署的输出,并使用它们来配置应用程序。

    链接模板不是解决方案,因为链接模板最终部署在与应用程序相同的资源组中,这违背了在资源组中隔离资源的目的。

    有什么办法可以从不同的资源组中读取部署的输出参数?如果没有,Azure是否计划支持它?

    我知道有一种方法可以通过id获取资源,使用resourceId函数,并查看它们的属性,但我试图避免这样做而不进入资源引用spagetti。

3 个答案:

答案 0 :(得分:4)

您是如何进行部署的?在PowerShell中,您可以执行以下操作:

(Get-AzureResourceGroupDeployment NameOfResourceGroup).Outputs.NameOfOuputProperty.Value

这将为您提供最新部署的输出。您还可以将整个部署对象抛出到var中并以此方式使用。

$d = Get-AzureResourceGroupDeployment NameOfResourceGroup

如果您需要许多输出属性,哪个会更快。

那有帮助吗?

AzureRM cmdlet的更新

语法基本相同:

(Get-AzureRmResourceGroupDeployment -ResourceGroupName NameOfResourceGroup -Name NameOfDeployment).Outputs.NameOfOutputProperty.value

如果您有多个部署,则可以使用:

Get-AzureRmResourceGroupDeployment -ResourceGroupName NameOfResourceGroup 

全部查看,看看名字是什么......

答案 1 :(得分:0)

我知道这是一个老问题,但是对于其他随之而来的人,截至18年3月12日,您绝对可以这样做。

您需要确保您的输出按照Microsoft documentation for output variables的格式进行格式化,该格式大致具有这种格式

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

然后,您可以使用resource reference(格式为

)引用部署,从而在模板中使用这些输出
reference(resourceName or resourceIdentifier, [apiVersion], ['Full'])

请注意,您需要提供api版本,因为部署所使用的api版本可能与父模板使用的api版本不同。

您的参考将类似于以下内容

{
  "comments": "This would have an output named myOutput you want to use",
  "apiVersion": "2017-05-10",
  "type": "Microsoft.Resources/deployments",
  "name": "my-deployment",
  "resourceGroup": "...",
  "properties": {
    "mode": "Incremental",
    "templateLink": {
      "uri": "...",
      "contentVersion": "1.0.0.0"
    },
    "parameters": { }
},
{
  "comments": "This makes use of myOutput from my-deployment",
  "apiVersion": "2017-05-10",
  "type": "Microsoft.Resources/deployments",
  "name": "my-dependent-deployment",
  "properties": {
    "mode": "Incremental",
    "templateLink": {
      "uri": "...",
      "contentVersion": "1.0.0.0"
    },
    "parameters": {
      "myValueFromAnotherDeployment": { "value": "[reference('my-deployment', '2017-05-10').outputs.myOutput.value]" }
    }
  }
}

请注意该值的稍显笨拙的“重新打包”,在该情况下,我们使用myOutput.value作为从属部署的输入,并将其放入键为"value": "...."的对象中。这是因为ARM参数必须具有“值”属性才能生效。

如果尝试直接使用输出,将会得到无效的模板错误(因为output变量具有'type'并且这不是parameter中的允许键)。因此,您需要获取value属性,然后将其放回下游模板的value中。

答案 2 :(得分:0)

您是否正在使用Azure DevOps发布管道?您只需将输出设置为变量即可,以便可以在相同或不同阶段重复使用它们。

我们在项目中使用这些扩展名