Adicionar lógica condicional ao modelo do ARM
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 internaequals(arg1, arg2)
.arg1
precisa ser igual aarg2
para que a função seja avaliada como true. Agora, o constructocondition
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 sertrue
oufalse
. Ele precisa corresponder ao segundo argumento da funçãoequals()
. No exemplo de JSON acima, o valor do parâmetronewOrExisting
precisa corresponder à cadeia de caracteresnew
para que a função seja avaliada comotrue
.