【问题标题】:Azure ARM template nested template deployment won't update resources\fails to startAzure ARM 模板嵌套模板部署不会更新资源\无法启动
【发布时间】:2019-11-05 18:38:39
【问题描述】:

我有以下 ARM 模板结构:

Parent Template
  |--Nested Template 1 
  |--...
  |--Nested Template 6

所以我只有 2 级模板,父级和嵌套级。

假设我将父级部署到一个空资源组并且一切正常。之后,我删除了其中一个资源,并希望使用相同的参数部署相同的父模板以恢复已删除的资源。但是部署会失败,说资源已经存在(另一个,不是我试图重新创建的那个)。我尝试了增量模式和完整模式进行部署。 如果我直接使用缺少的资源调用嵌套模板,它会按预期工作(因此专门创建一个仅使用嵌套模板的部署,而不是调用嵌套模板的父级)。

更新: 经过一些额外的测试,我可以得出结论,这比以前更奇怪。所以我用 powershell 开始这个部署:

New-AzureRmResourceGroupDeployment @parameters

它部署得很好,但是如果我在第一次部署完成后调用相同的命令,我会得到一个错误:

资源 'gggg-1s-the-wordd' 已存在于位置 资源组“gggg”中的“westeurope”。同名资源 无法在位置“northeurope”中创建。请选择一个新的 资源名称。

这种行为是否例外?我似乎找不到任何相关内容,谢谢!

UPD2:不管我使用的是门户还是 powershell,我都会遇到同样的错误。

【问题讨论】:

  • 重新部署只需使用相同的模板和参数启动新部署,因此它与门户或 PowerShell 中的单独部署执行相同的操作是有意义的。
  • 但是它出错了没有意义
  • resourceGroup() 函数在嵌套模板和链接模板之间的解析方式有所不同。基本上在嵌套模板中指定resourcegroup 获取主模板的resourcegroup,所以如果你使用resourceGroup().location,你可能指向错误的地方。以下文档很好地解释了它。 docs.microsoft.com/en-us/azure/azure-resource-manager/…

标签: azure azure-resource-manager


【解决方案1】:

因此,在 Brian 的帮助下,我们能够确定罪魁祸首。问题是 WebApp 将其位置设置为 resourcegroup().location 而应用服务计划正确地从参数获取位置。这会导致一个问题,即在部署时 WebApp 将部署到其应用服务计划所在的区域,但在评估时它会认为此 WebApp 属于资源组所在的区域。 TLDR - 复制粘贴错误,再加上 ARM 中位置评估中的错误导致非常奇怪的行为。

【讨论】:

  • 我认为这是一个错误,应该这样处理。这不是您的复制粘贴错误。如果您已经指定了托管计划名称,则应该使用 resourceGroup().location,但是,此错误会迫使您重复自己并传递位置。就我而言,我已经有一个计划,我只使用一个简单的模板,猜猜看,我需要告诉那个网站将在哪里。所有这些 ARM 模板感觉就像是由一个有过的人在 10 分钟内完成的不知道如何管理资源 IRL。 PS 验证器甚至不起作用。
  • ps 验证器是一堆废话,它只测试基本的语法错误
【解决方案2】:

如果您将相同的资源(此处故意不使用“模板”一词)部署到相同的资源组,Azure 应该“使其如此”。 IOW,如果它不存在,它将创建它,如果它存在,它应该无操作。并不是非黑即白,有一些细微差别(例如,如果资源存在,则无法更改某些属性),但是如果您将具有相同属性值的相同资源部署到同一资源组,则不应出现错误。

一般来说,嵌套(或不嵌套)不应该影响这些。

如果您要部署到不同的资源组,那么您可能会看到有关“已存在”的错误,具体取决于资源。

说了这么多,在您的具体情况下,如果没有更多细节,真的很难说出发生了什么......所以如果这没有帮助,您可以添加一些细节(确切的错误消息是什么)或复制(模板我们可以看到问题)?

【讨论】:

  • 我已经添加了更多详细信息,如果您需要更多数据,请您查看它们并亲自与我联系吗?我的推特昵称和这里一样。谢谢!
  • 我不是一个高音扬声器 - 但如果你想给我发电子邮件,我很乐意深入了解... bmoore at microsoft.com...
【解决方案3】:

我遇到了同样的问题。原因是,应用服务的位置被定义为 [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')]"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多