Implementar condicionalmente um recurso num modelo Azure Resource ManagerConditionally deploy a resource in an Azure Resource Manager template

Existem alguns cenários em que precisa para criar o modelo para implementar um recurso com base numa condição, por exemplo, se é ou não um valor de parâmetro está presente.There are some scenarios in which you need to design your template to deploy a resource based on a condition, such as whether or not a parameter value is present. Por exemplo, seu modelo pode implementar uma rede virtual e incluir parâmetros para especificar outras redes virtuais para o peering.For example, your template may deploy a virtual network and include parameters to specify other virtual networks for peering. Se não tiver especificado quaisquer valores de parâmetro para o peering, não quer o Resource Manager para implementar o recurso de peering.If you've not specified any parameter values for peering, you don't want Resource Manager to deploy the peering resource.

Para tal, utilize o [elemento condition] azure-resource-manager-condition no recurso para testar o comprimento da sua matriz de parâmetro.To accomplish this, use the condition element in the resource to test the length of your parameter array. Se o comprimento for igual a zero, devolver false impedem a implementação, mas para todos os valores de maiores que zero devolve true para permitir a implementação.If the length is zero, return false to prevent deployment, but for all values greater than zero return true to allow deployment.

Modelo de exemploExample template

Vamos examinar um modelo de exemplo que demonstra tudo isso.Let's look at an example template that demonstrates this. Nosso modelo utiliza a [elemento condition] azure-resource-manager-condition a implementação de controlo do Microsoft.Network/virtualNetworks/virtualNetworkPeerings recursos.Our template uses the condition element to control deployment of the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource. Este recurso cria um peering entre duas redes virtuais do Azure na mesma região.This resource creates a peering between two Azure Virtual Networks in the same region.

Vamos dar uma olhada em cada secção do modelo.Let's take a look at each section of the template.

O parameters elemento define um parâmetro único chamado virtualNetworkPeerings:The parameters element defines a single parameter named virtualNetworkPeerings:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "virtualNetworkPeerings": {
      "type": "array",
      "defaultValue": []
    }
  },

Nosso virtualNetworkPeerings parâmetro é um array e tem o esquema seguinte:Our virtualNetworkPeerings parameter is an array and has the following schema:

"virtualNetworkPeerings": [
    {
      "name": "firstVNet/peering1",
      "properties": {
          "remoteVirtualNetwork": {
              "id": "[resourceId('Microsoft.Network/virtualNetworks','secondVNet')]"
          },
          "allowForwardedTraffic": true,
          "allowGatewayTransit": true,
          "useRemoteGateways": false
      }
    }
]

Especificam as propriedades no nosso parâmetro a as definições relacionadas com peering de redes virtuais.The properties in our parameter specify the settings related to peering virtual networks. Iremos fornecer os valores para estas propriedades quando podemos especificar o Microsoft.Network/virtualNetworks/virtualNetworkPeerings recurso no resources secção:We'll provide the values for these properties when we specify the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource in the resources section:

"resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2017-05-10",
      "name": "[concat('vnp-', copyIndex())]",
      "condition": "[greater(length(parameters('virtualNetworkPeerings')), 0)]",
      "dependsOn": [
        "firstVNet", "secondVNet"
      ],
      "copy": {
          "name": "iterator",
          "count": "[length(variables('peerings'))]",
          "mode": "serial"
      },
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
          },
          "variables": {
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
              "apiVersion": "2016-06-01",
              "location": "[resourceGroup().location]",
              "name": "[variables('peerings')[copyIndex()].name]",
              "properties": "[variables('peerings')[copyIndex()].properties]"
            }
          ],
          "outputs": {
          }
        }
      }
    }
]

Existem algumas coisas contidas nesta parte do nosso modelo.There are a couple of things going on in this part of our template. Em primeiro lugar, o recurso real a ser implementado é um modelo inline do tipo Microsoft.Resources/deployments que inclui o seu próprio modelo que implementa realmente o Microsoft.Network/virtualNetworks/virtualNetworkPeerings.First, the actual resource being deployed is an inline template of type Microsoft.Resources/deployments that includes its own template that actually deploys the Microsoft.Network/virtualNetworks/virtualNetworkPeerings.

Nosso name para o inline modelo é feito exclusivo, concatenando a iteração atual do copyIndex() com o prefixo vnp-.Our name for the inline template is made unique by concatenating the current iteration of the copyIndex() with the prefix vnp-.

O condition elemento Especifica que o nosso recurso deve ser processados quando o greater() função for avaliada como true.The condition element specifies that our resource should be processed when the greater() function evaluates to true. Aqui, vamos testar se o virtualNetworkPeerings matriz de parâmetros é greater() que zero.Here, we're testing if the virtualNetworkPeerings parameter array is greater() than zero. Se for, ela é avaliada como true e o condition foi satisfeita.If it is, it evaluates to true and the condition is satisfied. Caso contrário, ele tem false.Otherwise, it's false.

Em seguida, especificamos nosso copy loop.Next, we specify our copy loop. É um serial loop que significa que o loop é feito na sequência, com cada recurso aguardar até o último recurso tiver sido implementado.It's a serial loop that means the loop is done in sequence, with each resource waiting until the last resource has been deployed. O count propriedade especifica o número de vezes que faz a iteração do loop.The count property specifies the number of times the loop iterates. Aqui, normalmente, configurá-lo para a extensão do virtualNetworkPeerings matriz porque contém os objetos de parâmetro especificando o recurso que pretende implementar.Here, normally we'd set it to the length of the virtualNetworkPeerings array because it contains the parameter objects specifying the resource we want to deploy. No entanto, se fazer isso, validação falhará se a matriz está vazia porque o Gestor de recursos observa está a tentar aceder às propriedades que não existem.However, if we do that, validation will fail if the array is empty because Resource Manager notices that we are attempting to access properties that do not exist. Podemos trabalhar em torno disso, no entanto.We can work around this, however. Vamos dar uma olhada nas variáveis que vamos precisar de:Let's take a look at the variables we'll need:

  "variables": {
    "workaround": {
       "true": "[parameters('virtualNetworkPeerings')]",
       "false": [{
           "name": "workaround",
           "properties": {}
       }]
     },
     "peerings": "[variables('workaround')[string(greater(length(parameters('virtualNetworkPeerings')), 0))]]"
  },

Nosso workaround variável inclui duas propriedades, um denominado true e outra com o nome false.Our workaround variable includes two properties, one named true and one named false. O true propriedade é avaliada como o valor da virtualNetworkPeerings matriz de parâmetros.The true property evaluates to the value of the virtualNetworkPeerings parameter array. O false propriedade é avaliada como um objeto vazio, incluindo as propriedades nomeadas que espera que o Resource Manager para ver—tenha em atenção que false é, na verdade, uma matriz, assim como nosso virtualNetworkPeerings parâmetro é, que irá satisfazer a validação.The false property evaluates to an empty object including the named properties that Resource Manager expects to see—note that false is actually an array, just as our virtualNetworkPeerings parameter is, which will satisfy validation.

Nosso peerings utiliza a variável nossa workaround variável ao testar novamente se o comprimento do virtualNetworkPeerings matriz de parâmetros é maior que zero.Our peerings variable uses our workaround variable by once again testing if the length of the virtualNetworkPeerings parameter array is greater than zero. Se estiver, o string avalia como true e o workaround variável é avaliada como o virtualNetworkPeerings matriz de parâmetros.If it is, the string evaluates to true and the workaround variable evaluates to the virtualNetworkPeerings parameter array. Caso contrário, ela é avaliada como false e o workaround variável é avaliada como nosso objeto vazio do primeiro elemento da matriz.Otherwise, it evaluates to false and the workaround variable evaluates to our empty object in the first element of the array.

Agora que nós Trabalhamos em todo o problema de validação, podemos simplesmente especificar a implementação do Microsoft.Network/virtualNetworks/virtualNetworkPeerings recurso no modelo aninhado, passando o name e properties da nossa virtualNetworkPeerings matriz de parâmetros.Now that we've worked around the validation issue, we can simply specify the deployment of the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource in the nested template, passing the name and properties from our virtualNetworkPeerings parameter array. Pode ver isso no template elemento aninhados no properties elemento do nosso recurso.You can see this in the template element nested in the properties element of our resource.

Experimentar o modeloTry the template

Um modelo de exemplo está disponível no GitHub.An example template is available on GitHub. Para implementar o modelo, execute o seguinte [CLI do Azure] cli comandos:To deploy the template, run the following Azure CLI commands:

az group create --location <location> --name <resource-group-name>
az group deployment create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example2-conditional/deploy.json

Passos SeguintesNext steps