Azure ARM Inline IF не работает - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать Azure VNET с помощью шаблона .json.

Я пытаюсь использовать встроенный условный оператор для создания 2-й подсети или пропуска при создании 2-й подсети. Я не думаю, что я использую json ('null') правильно, или если это вообще возможно. Насколько я понимаю, если json ('null') выбран, ничего не выбрано.

Любая помощь приветствуется!

"apiVersion": "2016-06-01",
"type": "Microsoft.Network/virtualNetworks",
"name": "My-VNET",
"location": "[resourceGroup().location]",
"properties": {
    "addressSpace": {
        "addressPrefixes": [
            "[parameters('virtualNetworkCIDR')]"
        ]
    },
    "subnets": [{
            "name": "[parameters('firstSubnetName')]",
            "properties": {
                "addressPrefix": "10.10.1.0/24"
            }
        }, {
            "name": "[if(equals(parameters('createSecondSubnet'), 'Yes'), parameters('secondSubnetName'), json('null'))]",
            "properties": {
                "addressPrefix": "10.10.2.0/24"
            }
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я уверен, что вам удалось найти какое-то решение этой проблемы некоторое время назад ... однако у меня есть решение, которое хорошо работает для такого рода вещей ... хотя оно не использует условные выражения.

В PowerShell создайте несколько хеш-таблиц, например ...

# Resource group Hashtables.
$rgDev = @{
    Name = "DEV-RG"
    SubscriptionId = $subNonProd
    Location = "desiredregion"
}
$rgUat = @{
    Name = "UAT-RG"
    SubscriptionId = $subNonProd
    Location = "desiredregion"
}

#Vnet Hashtables
$vnetDev = @{
    ResourceGroup = $rgDev
    VnetName = "Dev-vnet"
    CIDR = @('x.x.x.x/27')
    Subnets = @(
             @{
                Name = "Dev-Web-subnet"
                CIDR = "y.y.y.y/28"
             },
             @{
                Name = "Dev-DB-subnet"
                CIDR = "z.z.z.z/28"
             })
}
$vnetUat = @{
    ResourceGroup = $rgUat
    VnetName = "UAT-vnet"
    CIDR = @('f.f.f.f/27')
    Subnets = @(
             @{
                Name = "UAT-Web-subnet"
                CIDR = "g.g.g.g/28"
             },
             @{
                Name = "UAT-DB-subnet"
                CIDR = "h.h.h.h/28"
             })
}

Далее я собираю хеш-таблицы в массив и выполняю foreach по всему лоту. У меня есть небольшой скрипт, который переключает мой контекст, чтобы я мог развернуть несколько подписок в одном скрипте типа начальной загрузки.

$vnets = @($vnetDev, $vnetUat)

ForEach ($vn in $vnets) {

    $deploymentName = $vn.VnetName + "_Deployment."

    .\SwitchSubscription.ps1 -subName $vn.ResourceGroup.SubscriptionName -subId $vn.ResourceGroup.SubscriptionId

    New-AzureRmResourceGroupDeployment  -Name $deploymentName `
                                        -ResourceGroupName $vn.ResourceGroup.Name `
                                        -TemplateFile .\JSONFiles\Vnets.json `
                                        -vnet $vn

}

Раздел параметров шаблона ARM выглядит следующим образом ...

    "parameters": {        
        "vnet": {
            "type": "object",
        }
    },

тогда раздел ресурсов выглядит следующим образом ...

        {
            "name": "[concat(parameters('vnet').VnetName)]",
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2017-10-01",
            "location": "[resourceGroup().location]",
            "tags": "[parameters('vnet').tags]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": "[parameters('vnet').CIDR]"
                },
                "copy": [
                    {
                        "name": "subnets",
                        "count": "[length(parameters('vnet').Subnets)]",
                        "input": {
                            "name": "[parameters('vnet').Subnets[copyIndex('Subnets')].Name]",
                            "properties": {
                                "addressPrefix": "[parameters('vnet').Subnets[copyIndex('Subnets')].CIDR]"
                            }
                        }
                    }
                ]
            }
        }
    ]

Итак, все, что это делает, это передает объект в шаблон ARM, который может иметь один Vnet с одной или несколькими подсетями, и создавать их все.

Надеюсь, это поможет кому-то другому, когда / если он обнаружит это, когда гуглит.

Приветствия

Дэйв.

:)

0 голосов
/ 12 мая 2018

Обычно для условного создания ресурсов в шаблоне можно использовать свойство «Condition»: https://docs.microsoft.com/en-us/azure/architecture/building-blocks/extending-templates/conditional-deploy

если вы хотите создать несколько ресурсов одного типа, вы можете использовать свойство «Копировать»: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#resource-iteration

К сожалению, у подсетей нет условия или свойства копирования, поскольку они являются подресурсом ресурса «Виртуальная сеть». Из-за этого вся VNET должна быть условной, и вы можете указать несколько VNETS, развернув только одну из них. VNETS также может не иметь одно и то же имя, поэтому вам нужно будет указать несколько VNETS в вашем шаблоне.

Например:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    "NumberofSubnets": {
      "type": "string",
      "allowedValues": ["1","2"],
      "metadata": {
        "description": "would you like to deploy 1 or 2 subnets?"
      }
    }
    },
    "resources": [
        {
        "type": "Microsoft.Network/virtualNetworks",
        "apiVersion": "2016-06-01",
        "name": "My-VNET1",
        "location": "[resourceGroup().location]",
        "condition": "[equals(parameters('NumberofSubnets'), 1)]",
        "properties": {
            "addressSpace": {
            "addressPrefixes": ["10.10.0.0/23"]
            },
    "subnets": [{
            "name": "Subnet1",
            "properties": {
                "addressPrefix": "10.10.0.0/24"
            }
        }
        ]
        }
        },
        {
        "type": "Microsoft.Network/virtualNetworks",
        "apiVersion": "2016-06-01",
        "name": "My-VNET2",
        "location": "[resourceGroup().location]",
        "condition": "[equals(parameters('NumberofSubnets'), 2)]",
        "properties": {
            "addressSpace": {
            "addressPrefixes": ["10.10.0.0/23"]
            },
    "subnets": [{
            "name": "Subnet1",
            "properties": {
                "addressPrefix": "10.10.0.0/24"
            }
        },
        {
            "name": "Subnet2",
            "properties": {
                "addressPrefix": "10.10.1.0/24"
            }
        }
        ]
        }
        }
    ]
}

Это решит вашу проблему, но, учитывая большое количество подсетей, вы можете увидеть, как шаблон может стать очень утомительным.

Лучший, но самый сложный способ - использовать связанные шаблоны. Этот репозиторий показывает, как вы можете создать динамическое число подсетей, используя связанные шаблоны

...