Azure资源管理器(ARM)模板具有使用链接模板的能力。这些链接的模板可以定义在ARM模板部署期间创建的额外资源。
ARM模板支持依赖关系,确保一些资源在其他资源之前被创建。
我想在链接模板中为主模板中创建的资源指定依赖项。如果我将依赖项包含在链接模板中,它看起来像这样:
"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}
创建了a资源,部署ARM模板时输出以下错误消息:
当我定义链接的模板调用时,我目前正在主模板中定义这个依赖项。这个看起来很脆,很容易碎。有比在主ARM模板中定义依赖关系更好的方法吗?InvalidTemplate:部署模板验证失败:'资源'Microsoft。Web/sites/blahblahblahblah'没有在模板中定义。使用详情请参阅https://aka.ms/arm-template。
{
"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')]"
}
}
}
}
你可以用两种方式定义依赖关系——两种都是有效的。将依赖项放在部署资源上(您的第二种方法)将意味着整个嵌套部署直到提供了web站点才开始。如果您想并行地启动一些事情,那么您可以将依赖项放在嵌套模板中(您的第一种方法)。这对你的场景可能很重要,也可能不重要,但这是一个关键的区别。
dependsOn
需要resourceId
-并且正如错误试图说的那样,如果资源未在模板中定义,则需要在resourceId
中定义更多细节,在这种情况下,您需要resourceGroup
(可能是订阅,但我对此表示怀疑)。例如,你可以使用:
"dependsOn": [
"[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
dependsOn需要链接部署的名称,而不是其中的一个资源。
例如:
取决于:"微软。资源/部署/myExternalTemplate "
"dependsOn": [
"[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],