Azure 模板:使用参数值按名称访问变量的成员

Azure 模板:使用参数值按名称访问变量的成员

我在模板中有一个变量,它包含许多条目,这些条目将指定模板中的值。我的意思是我有

    "ipSecurityRestrictions" : {
      "denyAllInbound": 
      [
        {
          "ipAddress": "0.0.0.0/0",
          "action": "Deny",
          "priority": 100,
          "name": "Deny All Inbound"
        }
      ],
      "allowAppGatewayOnly": 
      [
        {
          "vnetSubnetResourceId": "[variables('appGatewaySubnet')]",
          "action": "allow",
          "priority": 100,
          "name": "Allow App Gateway"
        }
      ]
    }
  }

我目前使用一个简单的 if 函数来确定根据参数使用哪个(它实际上比这稍微复杂一些,但这对于问题来说已经足够了。)所以目前我有类似的东西

[if (equals(parameters('a'), 'allowAppGatewayOnly'), variables('ipSecurityRestrictions').allowAppGatewayOnly, variables('ipSecurityRestrictions').denyAllInbound)]

运行起来非常顺利。但是,我想向变量添加另一个条目,我不喜欢在其中使用 if 链,否则很快就会变得很难看。

因此,我尝试了基于参数值使用间接的各种方法(所有这些都在复制循环内,并且参数数组中的不同条目可能有不同的条目)。

我尝试过类似的事情

"[variables('ipSecurityRestrictions')[parameters('appservices')[copyIndex()].ipSecurityRestrictions]]"

但我问的事实意味着它不起作用。[编辑:它确实有效 - 如果参数值是正确的,并且其中没有多余的单引号!]

是否可以在 ARM 模板中执行此操作,或者我是否只能使用嵌套的 if 函数调用?

谢谢

答案1

您可以使用参数选择所需的对象,然后将其用作对象选择的一部分来实现这一点。您还需要从“ipSecurityRestrictions”对象中删除数组语法,因为它们都是 1 的数组,这没有任何好处,而且会给您带来问题。

下面的示例允许使用参数选择要使用的对象,然后在输出中使用该对象。您可以对此进行扩展以满足您的需要。

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "ipRestriction": {

        "type": "string",
        "allowedValues": [
            "denyAllInbound",
            "allowAppGatewayOnly",
            "allowAll"
        ],
        "metadata": {
            "description": "description"
        }
    }
},
"variables": {

    "ipSecurityRestrictions": {
        "denyAllInbound": {
            "ipAddress": "0.0.0.0/0",
            "action": "Deny",
            "priority": 100,
            "name": "Deny All Inbound"
        },

        "allowAppGatewayOnly": {
            "action": "allow",
            "priority": 100,
            "name": "Allow App Gateway"
        },
        "allowAll": {
            "action": "allow",
            "priority": 100,
            "name": "Allow All"
        }

    }
},
"resources": [
],
"outputs": {
    "example": {
        "type": "string",
        "value": "[variables('ipSecurityRestrictions')[parameters('ipRestriction')].name]"
    }
},
"functions": [
]

}

相关内容