首页 > 解决方案 > Azure ARM 模板:表达式作为非字符串或具有允许值的参数的默认值

问题描述

我正在定义一些参数来在我的 ARM 模板中配置我的 SQL 数据库弹性池。我想为每个参数指定默认值,第二个和第三个参数的默认值基于第一个参数的值。但是,每当我尝试将表达式指定为具有允许值集的参数的默认值时,我都会遇到错误:“此值不是参数'...'的允许值之一。” 对于具有非字符串类型的参数也会发生同样的情况:“参数'...'必须是'...'类型。”。

我可以通过消除允许的值并将所有参数类型更改为字符串来解决此问题。但是,这将失去对用户输入值的验证。定义默认值时我做错了什么,还是这是 ARM 限制?

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "sqlSkuName": {
      "type": "string",
      "allowedValues": [
        "BasicPool",
        "StandardPool",
        "PremiumPool"
      ],
      "defaultValue": "StandardPool"
    },
    "sqlSkuTier": {
      "type": "string",
      "allowedValues": [
        "Basic",
        "Standard",
        "Premium"
      ],
      "defaultValue": "[if(equals(parameters('sqlSkuName'), 'BasicPool'), 'Basic',
                        if(equals(parameters('sqlSkuName'), 'StandardPool'), 'Standard',
                        if(equals(parameters('sqlSkuName'), 'PremiumPool'), 'Premium',
                        '')))]"
    },
    "sqlDatabaseMaxCapacity": {
      "type": "int",
      "defaultValue": "[if(equals(parameters('sqlSkuName'), 'BasicPool'), 5, 50)]"
    },
  }
}

在此处输入图像描述

在此处输入图像描述

标签: azureazure-resource-managerarm-template

解决方案


您必须使用对象变量有条件地使用参数,因此您必须执行以下操作:

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "sqlSkuName": {
        "type": "string",
        "allowedValues": [
            "BasicPool",
            "StandardPool",
            "PremiumPool"
        ],
        "defaultValue": "StandardPool"
    },
    "sqlSkuTier": {
        "type": "string",
        "allowedValues": [
            "Basic",
            "Standard",
            "Premium"
        ]
    },
    "sqlDatabaseMaxCapacity": {
        "type": "int",
        "defaultValue": 0
    }
},
"variables": {
    "sqlSkuTier-Var": "[if(equals(parameters('sqlSkuName'), 'BasicPool'), 'Basic',
                    if(equals(parameters('sqlSkuName'), 'StandardPool'), 'Standard',
                    if(equals(parameters('sqlSkuName'), 'PremiumPool'), 'Premium',
                    '')))]",
    "sqlDatabaseMaxCapacity-var": "[if(equals(parameters('sqlDatabaseMaxCapacity'),0 ),
                                        if(equals(parameters('sqlSkuName'), 'BasicPool'), 5,50),
                                        parameters('sqlDatabaseMaxCapacity'))]"
},
"resources": []

}

然后使用该值:

variables('sqlSkuTier-Var')

我建议您使用 Visual Studio 代码插件 ( https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools ) 来拥有 IntelliSense,它对工作和查看您的错误有很大帮助。


推荐阅读