Назад | Перейти на главную страницу

Шаблоны 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?

Спасибо

Вы можете добиться этого, используя параметр, выбирающий, какой объект вы хотите, а затем используя это как часть выбора объекта. Вам также необходимо удалить синтаксис Array из ваших объектов «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": [
]

}