【问题标题】:ARM template conditional nested resources without template linking没有模板链接的 ARM 模板条件嵌套资源
【发布时间】:2017-02-22 08:11:26
【问题描述】:

我正在尝试创建一个条件资源模板。开发环境不如生产环境强大,而且我在很大程度上成功地做到了这一点。但是,我似乎无法正确获取嵌套资源。

这是我的 ARM 模板中的一个 sn-p:

"webApp-resources": "[variables(concat('webApp-', parameters('env'), '-resources'))]",
"webApp-dev-resources": [],
"webApp-prod-resources": [
  {
    "name": "staging",
    "type": "Microsoft.Web/sites/slots",
    "location": "[resourceGroup().location]",
    "apiVersion": "2015-08-01",
    "dependsOn": [
      "[resourceId('Microsoft.Web/sites', variables('webApp-name'))]"
    ]
  }
],

这个想法很简单,资源变量是使用env 参数组成的。 env 参数可以是 devprod,虽然这有效,但当我尝试部署此模板时出现以下错误。

{
  "name": "[variables('webApp-name')]",
  "type": "Microsoft.Web/sites",
  ...
  "resources": "[variables('webApp-resources')]" // <- culprit!
},

请求内容无效,无法反序列化:“将值“[variables('webApp-resources')]”转换为类型“Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Schema.TemplateResource[]”时出错。路径 'properties.template.resources[1].resources',第 195 行,位置 64。'

我还尝试将资源移动到一个变量中,并以类似的条件方式引用该变量,非常类似于我们如何进行嵌套模板链接但没有模板链接。

resources: [
  "[variables('webApp-resource')]" // <- this doesn't work!
]

如果我没记错的话,这会导致类似的错误,但会出现不同的错误。

由此我得出结论,ARM 模板语法不是简单的查找和替换,我认为这是不好的,因为它确实使推理哪些有效哪些无效更难。因为如果是这样,这将产生一个有效的模板。我已通过将正确的值粘贴到资源部分来验证这一点。

有没有人遇到过类似的问题,你是如何解决这个问题的?

【问题讨论】:

  • 实际上,我什至不确定我是否回答了正确的问题,我不太明白你的问题,你能详细说明一下吗?
  • 部署槽仅受标准及以上应用服务计划支持,开发环境不需要部署槽,因此我选择不使用它们。但是,我现在有一个部署模板,该模板需要根据部署到的环境而有所不同。这我已经成功了,但我无法添加部署槽“staging”,因此这个槽只存在于 prod 环境中。 dev 环境使用基本层,但 prod 使用标准层。我的问题中的错误描述了实现这一目标的各种(IMAO)直接尝试。
  • 您是否尝试使用variable 而不是resource?我很确定你不能这样做,但你可以有条件地创建插槽
  • @4c74356b41 我确实尝试使用变量作为资源,假设 ARM 模板只是进行 JSON 替换,但这不起作用。我不知道为什么。
  • 我遇到了类似的问题,最终得到了原子 ARM 模板(例如 serviceplan、appservice、deploymentslot 等)和几个 PowerShell 模块和脚本。

标签: azure azure-resource-manager arm-template


【解决方案1】:

您应该能够在没有多个模板文件的情况下执行此操作,但如果不使用嵌套部署则不行。因此,根据您要避免的情况,试试这个:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "env": {
      "type": "string",
      "allowedValues": [ "dev", "prod" ]
    }
  },
  "variables": {
    "resourceArray": "[variables(concat('resources', parameters('env')))]",
    "resourcesprod": [
        {
          "name": "as",
          "type": "Microsoft.Compute/availabilitySets",
          "location": "[resourceGroup().location]",
          "apiVersion": "2015-06-15",
          "dependsOn": [],
          "properties": {
          }
        }
      ],
    "resourcesdev": []
  },
    "resources": [
      {
        "name": "nest",
        "type": "Microsoft.Resources/deployments",
        "apiVersion": "2016-09-01",
        "dependsOn": [],
        "properties": {
          "mode": "Incremental",
          "template": {
            "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "resources": "[variables('resourceArray')]"
          },
          "parameters": {
          }
        }
      }
    ],
  "outputs": {}
}

【讨论】:

  • 有趣。我基本上是这样做的,但我尝试将嵌套模板资源直接插入资源数组中。是否需要多次指定$schemacontentVersion?如果可能的话,我想保持文件小而紧凑。
  • 关于嵌套部署,有什么特别需要注意的吗?我注意到它们在资源组中显示为单独的部署。你知道的任何陷阱?
  • 我在原始答案中编辑了代码 - 您可以将其缩小一点,架构验证会引发一些警告,但它应该可以正常工作。回复:陷阱 - 我想不出与你的 OP 相关的任何事情。
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多