Adicionar lógica condicional ao modelo do ARM

Concluído

Talvez seja necessário implantar um recurso opcionalmente, em algumas condições. Um caso comum é a adição de um balanceador de carga em uma VM. Digamos que você tenha um site de comércio eletrônico e queira garantir que ele possa resistir ao aumento de tráfego de uma grande venda. Um balanceador de carga é um tipo de recurso que você pode associar a uma VM. Ao adicionar uma regra condicionalmente, você habilita ou desabilita o balanceador de carga que está sendo aplicado à VM em questão.

Imagine as seguintes situações:

  • Recurso pré-existente. Quando você especifica um recurso em um modelo e o implanta, ocorre uma destas duas situações: o recurso é implantado ou, se já existir, não é implantado. Verificar se um recurso existe é algo que o Azure Resource Manager faz por você; está implícito. A questão é se você pode aproveitar esse mecanismo ao refletir sobre como pode verificar a preexistência de algo.
  • Lógica de ramificação. Dependendo de quais parâmetros você passa para um modelo, no momento da implantação, pode ser conveniente implantar um conjunto diferente de recursos. O que você está expressando é algo conhecido como lógica de ramificação. Se o parâmetro tiver determinado tipo de valor, selecione o primeiro branch. Caso contrário, selecione o segundo ou o terceiro branch a ser implantado. A lógica de branch continua dessa maneira.

Ambas as situações acima representam cenários em que a lógica condicional está sendo aplicada. A lógica está no próprio sistema do Resource Manager ou é algo que você precisa expressar explicitamente.

Implantação condicional

O constructo condition permite que você expresse se deseja algo implantado ou não. É uma propriedade, com um valor igual a true ou false, que você anexa a um elemento de recurso. Normalmente, você encontraria um constructo condition parecido com o seguinte JSON em seu modelo:

"resources" : [
  {
    "condition": "[parameters('shouldDeploy')]"
  }
]

No JSON acima, uma propriedade condition é adicionada a um recurso. O valor da propriedade será avaliado como o valor do parâmetro shouldDeploy.

Avaliação

Há duas maneiras pelas quais o constructo condition pode ser avaliado. Saber sobre essas duas maneiras pode afetar a forma como você escolhe expressar sua lógica condicional. As duas maneiras diferentes são:

  • O valor é true/false. Por exemplo, considere o seguinte constructo:

    "condition": "[parameters('deployAccount')]"
    

    O valor deployAccount é um parâmetro cujo valor pode ser transmitido no momento da implantação ou pode retornar para o valor padrão. Independentemente da abordagem usada, o valor é estritamente false ou true. A tentativa de atribuir outro valor que não seja um booliano resulta em um erro.

  • Há uma expressão que avalia como true/false. Aqui, em vez de atribuir um valor true/false estrito ao constructo condition, use a função de modelo interna equals(arg1, arg2). arg1 precisa ser igual a arg2 para que a função seja avaliada como true. Agora, o constructo condition pode ser expresso da seguinte forma:

    "condition": "[equals(parameters('newOrExisting'),'new')]"
    

    Usando a função equals(), o valor transmitido para um parâmetro não precisa mais ser true ou false. Ele precisa corresponder ao segundo argumento da função equals(). No exemplo de JSON acima, o valor do parâmetro newOrExisting precisa corresponder à cadeia de caracteres new para que a função seja avaliada como true.