Когда вы пишете шаблон, вы хотите использовать его для развертывания нескольких сред, разработчика, к качеству, производству. Вы также хотите иметь возможность повторно запустить этот шаблон, например, добавить больше ресурсов. Но между этими разными состояниями есть, иногда незначительная разница, поскольку количество узлов, которые вы хотите развернуть, размер VM или другого. Некоторые ресурсы могут иметь разные варианты в зависимости от их SKU. Как справляться с этим?
Есть две возможности логические функции и условия развертывания.
Логические функции
Логические функции, такие как другие встроенные функции в шаблонах ARM, преобразуют значение, прежде чем использовать его в ресурсе или переменной. Есть несколько логических функций в ARM, а наиболее используемое — это функция IF. Эта функция работает как a if {} else {} операторы в любом языке программирования, кроме как, если и оператор ELF и ELS только вернет значение.
[если (равен (параметры («VariaBletotest»), «Valueetest»), «Valueiftrue», «Tatingifalse»)] «
Как вы видите, нужно ли логическое значение. Эти значения могут исходить из функции сравнения, пользовательскую функцию, параметр или любые функции, возвращающие TRUE или FALSE.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "myParam": { "type": "string", "allowedValues": [ "Basic", "Standard" ], "metadata": { "description": "Test parameter" } }, "myBoolparam": { "type": "bool" } }, "variables": {}, "resources": [], "outputs": { "outputMyParam": { "value": "[if(equals(parameters('myParam'), 'Standard'), 'Standard Value Selected','Basic Value Selected')]", "type" : "String" }, "outputBoolean": { "value": "[if(parameters('myBoolparam'), 'True Selected','False Selected')]", "type" : "String" } } }
New-AzResourceGroupDeployment -Name test01 -ResourceGroupName myRG -TemplateFile .\Iffunction.json -myParam Basic -myBoolparam $true
Outputs : Name Type Value =============== ========================= ========== outputMyParam String Basic Value Selected outputBoolean String True Selected
Вы можете комбинировать несколько, если с и и
"outputAnd": { "value": "[and(equals(parameters('myParam'), 'Standard'), parameters('myBoolparam'))]", "type": "bool" }
Это вернется, если параметр «MyParam» равен стандарту, а параметр «MyBoolParam» верно. Вы также можете использовать или.
"outputOr": { "value": "[or(equals(parameters('myParam'), 'Standard'), parameters('myBoolparam'))]", "type": "bool" }
Это вернется, если параметр «MyParam» равный стандарт или параметр «MyBoolParam» является TRUE.
Наилучшая практика заключается в использовании логических функций в разрезе переменных.
"variables": { "myVariable" : "[if(and(equals(parameters('myParam'), 'Standard'), parameters('myBoolparam')), 'Ok','notOk')]" },
И использовать его в ваших ресурсах.
Для более конкретного примера, если вы хотите развернуть шлюз VPN генерации 2, вам необходимо использовать, по крайней мере, SKU VPNGW2. Но для неработающей среды вы можете использовать менее дорогостоящий вариант.
"gatewaySku": { "type": "string", "defaultValue": "VpnGw2", "allowedValues": [ "Basic", "VpnGw1", "VpnGw2", "VpnGw3" ], "metadata": { "description": "The Sku of the Gateway. This must be one of Basic, Standard or HighPerformance." } } "variables": { "gatewayGeneration": "[if(equals(parameters('gatewaySku'), 'VpnGw1'), 'Generation1','Generation2')]" }, ... "properties": { "sku": { "name": "[parameters('gatewaySku')]", "tier": "[parameters('gatewaySku')]" }, "gatewayType": "Vpn", "vpnType": "[parameters('vpnType')]", "enableBgp": false, "vpnGatewayGeneration": "[variables('gatewayGeneration')]" }
Условное развертывание
Иногда это не просто значение, которое вы хотите изменить, но целый ресурс. Как и в примере, непроизводственная среда может не понадобиться набор доступности или балансировщик нагрузки. Как вы можете иметь дело с этим? Вместо того, чтобы использовать две шаблоны, один для производства и другого для не добычи, вы можете использовать свойство условия в ресурсе. Он определит, развернут ли ресурс. Значение является логическим, правдивым или ложным.
«Состояние»: «[равен (параметры (« среда »),« PROD »)]»
Есть две вещи, которые нужно знать о собственности условия. Первый — это то, как бороться с свойствами Dependeson. При развертывании ресурсов, которые зависят от одного или нескольких условных ресурсов о том, как написать предложение Dependson? Если вы включаете или не условные ресурсы в Dependendonon? Вам не нужно заботиться об этом, API будет автоматически удалять неразличный ресурс из списка Dependendon.
... { "name": "myAvSet", "condition": "[equals(parameters('environement'), 'prod')]", "type": "Microsoft.Compute/availabilitySets", "apiVersion": "2019-07-01", "location": "[resourceGroup().location]", "tags": { "displayName": "Prod Av Set" }, "properties": { "platformFaultDomainCount": 2, "platformUpdateDomainCount": 3 }, "sku": { "name": "Aligned" } } ... { "apiVersion": "2018-06-01", "type": "Microsoft.Compute/virtualMachines", "name": "vm01", "location": "[resourceGroup().location]", "tags": "Vm Prod or Non Prod", "dependsOn": [ "[concat('Microsoft.Network/networkInterfaces/', 'Vm01-01R-nic'))]", "[concat('Microsoft.Compute/availabilitySets/','myAvSet')]" ] ... }
Если параметр окружающей среды не производится, Azure удалит зависимость от ресурса виртуальной машины. Второе, что нужно знать, это режим развертывания. При использовании дополнительного режима нет изменений, но NN полного режима, когда условный ресурс повторно развернут, и условие является ложным, если версия API ресурса раньше, чем на 2019-05-10, она ничего не сделает, но с более поздней версией. ресурс будет удален.
Условное развертывание может помочь вам управлять тем, как вы можете развернуть несколько сред, используя только один шаблон. Это может быть сложно, но для проще, чем наличие файлов шаблонов группы, выполняющих то же самое.
Оригинал: «https://dev.to/omiossec/arm-templates-conditional-deployments-in-azure-5kc»