我感兴趣的是读取不同资源组中另一个部署的输出参数。 我的 ARM 模板类似于:
- platform.json - 设置 DNS、虚拟网络和安全性
- storage.json - 设置数据库和其他存储
- app.json - 设置网络应用程序/api
每个资源组都部署在不同资源组中,因为它们具有不同的生命周期。但是,当我部署 app.json 时,我想提取最新平台和存储部署的输出并使用它们来配置应用程序。
链接模板不是解决方案,因为链接模板最终部署在与应用程序相同的资源组中,这违背了在资源组中隔离资源的目的。
有什么方法可以从不同的资源组读取部署的输出参数吗?如果没有,Azure 是否计划支持它?
我知道有一种方法可以通过 id 获取资源,使用 resourcesId 函数,并查看它们的属性,但我试图避免这样做,以免进入资源引用 spagetti。
最佳答案
我知道这是一个老问题,但对于其他来的人来说,截至 2018 年 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 版本。
您的引用将类似于以下内容
{
"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 参数必须具有“值”属性才能有效。
如果您尝试直接使用输出,您将收到无效模板错误(因为输出
变量具有“类型”,并且这不是参数
中允许的键) >)。这就是为什么您需要获取 value
属性,然后将其放回下游模板中的 value
中。
关于Azure ARM 模板 - 使用其他部署的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058494/