Azure资源管理器(ARM)模板可以使用Linked Templates。这些链接模板可以定义在ARM模板部署期间创建的其他资源。
ARM模板支持dependencies,确保在其他人之前创建一些资源。
我想在主模板中创建的资源的链接模板中指定依赖项。如果我在链接模板中包含依赖项,它看起来像这样:
"resources": [
{
"apiVersion": "2015-08-01",
"type": "Microsoft.Web/sites/hostNameBindings",
"name": "[concat(parameters('siteName'),'/', parameters('fqdn'))]",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"siteName": "[parameters('siteName')]"
}
}
]
虽然dependsOn
显示正确,但是资源是在Microsoft.Web/sites/{siteNameParameter}
创建的,部署ARM模板会输出以下错误消息:
InvalidTemplate:部署模板验证失败:'资源'Microsoft.Web / sites / blahblahblahblah'未在模板中定义。有关使用详情,请参阅https://aka.ms/arm-template。'。
当我定义链接模板调用时,我当前正在主模板中定义此依赖项。这似乎很脆弱,容易打破。有没有比在主ARM模板中定义依赖项更好的方法?
{
"apiVersion": "2015-01-01",
"name": "SomeName",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "https://tempuri.org/supersecrettemplatepath/azuredeploy.json",
"contentVersion": "1.0.0.0"
},
"parameters":
{
"fqdn": {
"value": "www.tempuri.org"
},
"siteName": {
"value": "[parameters('siteName')]"
}
}
}
}
答案 0 :(得分:5)
您可以以任何方式定义依赖关系 - 两者都有效。将依赖关系部署资源(第二种方法)意味着在配置网站之前不会启动整个嵌套部署。如果你想并行地解决一些问题,那么你会将依赖项放在嵌套模板中(第一种方法)。对于您的场景,这可能或不重要,但这是一个关键的区别。
dependsOn
需要resourceId
- 并且正如错误所示,如果资源未在模板中定义,则需要resourceId
中的更多详细信息,在这种情况下,你需要resourceGroup
(可能是订阅,但我对此表示怀疑)。例如,您可以使用:
"dependsOn": [
"[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
答案 1 :(得分:0)
dependsOn需要链接部署的名称,而不是其中的资源之一。
例如:
dependsOn:“ Microsoft.Resources / deployments / myExternalTemplate”
答案 2 :(得分:-1)
"dependsOn": [
"[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],