Azure ARM模板嵌套模板部署不会更新资源\启动失败
我有以下ARM模板结构:Azure ARM模板嵌套模板部署不会更新资源\启动失败,azure,azure-resource-manager,Azure,Azure Resource Manager,我有以下ARM模板结构: Parent Template |--Nested Template 1 |--... |--Nested Template 6 所以我只有两层模板,父模板和嵌套模板 假设我将父级部署到一个空的资源组,并且一切正常。在此之后,我删除了其中一个资源,并希望使用相同的参数部署相同的父模板,以恢复删除的资源。但是部署会失败,因为资源已经存在,而不是我试图重新创建的资源。我尝试了增量模式和完全模式进行部署。 若我直接调用缺少资源的嵌套模板,它将按预期工作,所以具
Parent Template
|--Nested Template 1
|--...
|--Nested Template 6
所以我只有两层模板,父模板和嵌套模板
假设我将父级部署到一个空的资源组,并且一切正常。在此之后,我删除了其中一个资源,并希望使用相同的参数部署相同的父模板,以恢复删除的资源。但是部署会失败,因为资源已经存在,而不是我试图重新创建的资源。我尝试了增量模式和完全模式进行部署。
若我直接调用缺少资源的嵌套模板,它将按预期工作,所以具体地说,只使用嵌套模板创建部署,而不使用调用嵌套模板的父级
UPD:
经过一些额外的测试,我可以得出结论,这比以前更奇怪。因此,我将使用powershell启动此部署:
新AzureRmResourceGroupDeployment@parameters
它部署得很好,但是如果在第一次部署完成后调用相同的命令,则会出现错误:
位置中已存在资源“gggg-1s-The-wordd”
资源组“gggg”中的“西欧”。具有相同名称的资源
无法在位置“northeurope”中创建。请选择一个新的
资源名称
这种行为例外吗?我似乎找不到任何相关的,谢谢
UPD2:如果我使用portal或powershell并不重要,我会得到相同的错误。如果您故意部署相同的资源,而没有将word模板用于相同的资源组,Azure应该这样做。注意,如果它不在那里,它会创建它,如果它在那里,它应该不起作用。它不是黑白的,有一些细微差别,比如如果资源存在,您不能更改某些属性,但是如果您将具有相同属性值的同一资源部署到同一资源组,您不应该得到错误 一般来说,嵌套与否都不应该影响这些 如果要部署到不同的资源组,则可能会看到关于已存在的错误,具体取决于资源
综上所述,在你的具体案例中,如果没有更多细节,真的很难说出发生了什么。。。因此,如果这没有帮助,您能否添加一些详细信息?我们可以看到问题的确切错误消息或复制模板是什么?因此,在Brian的帮助下,我们能够识别罪犯。问题是WebApp的位置设置为resourcegroup.location,而应用服务计划从参数中正确获取位置。因此,在部署时,Webapp将部署到应用程序服务计划的地区,但在评估的时候,它会认为这个Webapp属于资源组的区域。
TLDR-复制粘贴错误,再加上ARM中的位置评估错误,导致了一个非常奇怪的行为。我也遇到了同样的问题。原因是,应用程序服务的位置被定义为[resourceGroup.location],而不是造成问题的应用程序服务计划ASP位置。我通过将ASP的位置作为参数传递给模板对其进行了更改 获取ASP的位置如下所示:
internal static string GetASPLocation(TokenCloudCredentials credentials, string resourceGroup, string ASP)
{
Console.WriteLine($"Getting location of App Service Plan {ASP} in Resource Group {resourceGroup}");
var resourceClient = new ResourceManagementClient(credentials);
ResourceExistsResult result = resourceClient.Resources.CheckExistence(resourceGroup, new ResourceIdentity(ASP, "Microsoft.Web/serverfarms", "2015-08-01"));
var appServicePlan = resourceClient.Resources.Get(resourceGroup, new ResourceIdentity(ASP, "Microsoft.Web/serverfarms", "2015-08-01"));
return appServicePlan.Resource.Location;
}
在ARM模板中,位置可以更改为:
"location": "[parameters('ASPLocation')]"
“重新部署”只是使用相同的模板和参数启动一个新的部署,因此,它与门户或PowerShell中的单独部署执行相同的操作是有意义的。但它没有意义,因为resourceGroup函数在嵌套模板和链接模板之间解析的方式不同。基本上,在嵌套模板中,指定resourcegroup会获取主模板的resourcegroup,因此如果使用resourcegroup.location,则可能指向错误的位置。下面的文档对此进行了很好的解释。我已经添加了更多的细节,如果您需要更多的数据,请您亲自查看并与我联系,好吗?我的twitter昵称和这里一样。谢谢我不是一个很会发推特的人,但如果你想给我发电子邮件,我很乐意深入了解。。。我认为这是一个bug,应该这样处理。这不是您的复制粘贴错误。如果您已经指定了托管计划名称,那么应该使用resourceGroup.location,但是,此错误会迫使您重复并传递位置。在我的例子中,我已经有了一个计划,我只使用了一个简单的模板,猜猜看,我需要告诉那个网站将要去哪里。。所有这些ARM模板感觉就像是一个不知道如何管理资源IRL的人在10分钟内完成的。PS验证器甚至不工作。PS验证器是一堆垃圾,它只测试基本语法错误