Post

Terraform: Como usar if/else para controlar deployments

Terraform: Como usar if/else para controlar deployments

Olá pessoal! Blz?

Nesse artigo eu quero trazer para vocês como usar if / else para controlar deployments com o Terraform. O engraçado é que não existe o if / else no Terraform 😆 😜, mas há algo “parecido” onde seguimos a mesma lógica condicional.

Eu costumo usar essa expressão condicional para controlar se devo ou não criar um recurso, para utilizar um valor de variável de acordo com uma validação e entre outras situações que irei exemplificar aqui.

Como usar essa expressão condicional?

A sintaxe da expressão é de fácil compreensão já que diferente de linguagens de programação não podemos executar blocos de comandos dentro do if else como nas linguagens. A sintaxe que devemos usar é:

1
condição ? valor se a condição for verdadeira : valor se a condição for falsa

Uma expressão condicional usa o valor de uma expressão booleana para selecionar um de dois valores. Esta expressão é avaliada como valor verdadeiro se o valor da condição for verdadeiro e, caso contrário, como valor falso. Isso é equivalente a uma instrução If.

Como validar as condições

Para validar a condição devemos usar um operado para comparar valores e tomar uma decisão, podemos usar:

  • Operadores de Igualdade

    • Os operadores de igualdade aceitam dois valores de qualquer tipo e produzem valores booleanos como resultados.

      • a == b retorna verdadeiro se a e b tiverem o mesmo tipo e o mesmo valor, ou falso caso contrário.
      • a != b é o oposto de a == b.
  • Operadores de comparação

    • Todos os operadores de comparação esperam valores numéricos e produzem valores booleanos como resultados.

      • a < b retorna verdadeiro se a for menor que b, ou falso caso contrário.
      • a <= b retorna verdadeiro se a for menor ou igual a b, ou falso caso contrário.
      • a > b retorna verdadeiro se a for maior que b, ou falso caso contrário.
      • a >= b retorna verdadeiro se a for maior ou igual a b, ou falso caso contrário.

Vamos a alguns exemplos

1. Definir a região de acordo com o ambiente

No exemplo abaixo vamos supor que: se uma empresa está localizada no Brasil e para ambiente de produção devemos criar os recursos na região “brazilsouth” para termos uma latência baixa, mas para qualquer outro ambiente (DEV ou HML) onde a latência é menos importante do que o custo, devemos usar uma região mais barata como “astus2”, podemos usar o seguinte exemplo:

1
2
3
4
5
6
7
8
9
variable "environment" {
  type    = string
  default = "PRD"
} 

resource "azurerm_resource_group" "rg" {
  name     = "rg-teste"
  location = var.environment == "PRD" ? "brazilsouth" : "eastus2"
}

terraform-devops-if-else

2. Uso do COUNT para determinar se criamos ou não um IP público para uma máquina virtual

No exemplo abaixo estamos usando o count, que de uma forma grosseira de explicar, é essencialmente um valor numérico que determina quantas instâncias de um recurso criar, no exemplo abaixo só irá executar se a variável public_ip for verdadeira e como o default é false o count terá o valor de 0 e o recurso não será criado pois o bloco não será executado:

1
2
3
4
5
6
7
8
9
10
11
12
variable "public_ip" {
  type    = bool
  default = false
} 

resource "azurerm_public_ip" "ip_public" {
  count               = var.public_ip ? 1 : 0 
  name                = "pip-vm-windows-01"
  resource_group_name = "rg-teste"
  location            = "eastus"
  allocation_method   = "Dynamic"
}

terraform-devops-if-else

No exemplo acima definimos a variável public_ip com o tipo bool, como a validação da condição é verdadeiro ou falso não precisamos comparar se verdadeiro é igual a verdadeiro, por isso só colocamos o nome da variável e se ela for verdadeira já valida a condição.

3. Usando os 2 exemplos acima juntos

No exemplo abaixo vamos usar a condição para o count e se for ser executado teremos uma condição para a região do IP público, como o valor da váriavel public_ip é “true” o recurso será criado e com o valor da variável environment é “DEV” a região será eastus2 porque a condição é falsa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
variable "environment" {
  type    = string
  default = "DEV"
}

variable "public_ip" {
  type    = bool
  default = true
}

resource "azurerm_public_ip" "ip_public" {
  count               = var.public_ip ? 1 : 0 
  name                = "pip-vm-windows-01"
  resource_group_name = "rg-teste"
  location            = var.environment == "PRD" ? "brazilsouth" : "eastus2"
  allocation_method   = "Dynamic"
}

azure-avd-mfa

4. Definir quantas máquinas virtuais serão criadas

Podemos usar o valor de uma variável para controlar quantas máquinas virtuais iremos criar, no exemplo abaixo se a variável vm_type for diferente de “Cluster” irá criar somente 1 máquina virtual senão irá criar 2 máquinas virtuais.

Usei o modo de comparação “!= (diferente)” para mudar o que usamos acima que foi a comparação de “== (igual)”.

1
2
3
4
5
6
7
8
9
10
11
12
13
variable "vm_type" {
  type    = string
  default = "Cluster"
}

resource "azurerm_linux_virtual_machine" "example" {
  count               = var.vm_type != "Cluster" ? 1 : 2
  name                = "vm-linux-app-0${count.index+1}"
  resource_group_name = "RG-APPLICATION"
  location            = "westus"
  size                = "Standard_F2"
...

azure-avd-mfa azure-avd-mfa

5. Controlando dynamic blocks

Nesse exemplo abaixo dynamic bloco cria uma instância do network_rules somente se a variável “public_access” for definida como “true” com isso é criado uma regra liberando o IP informado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
variable "public_access" {
  type    = bool
  default = true
}
resource "azurerm_storage_account" "example" {
 
  name                     = "stoterraformtest"
  resource_group_name      = azurerm_resource_group.rg.name
  location                 = azurerm_resource_group.rg.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
 
  dynamic "network_rules" {
    for_each = public_access ? [1] : []
 
    content {
    default_action             = "Allow"
    ip_rules                   = ["100.200.250.1"]
    }
  }
}

azure-avd-mfa

Concluindo!

Terraform usa lógica de expressão condicional para construir instruções If. Isto pode ser combinado com outras funções para formar expressões mais complexas. O domínio dessas técnicas ajudará você a criar um código de infraestrutura adaptável, multi ambientes e muito mais eficiente.

Bom pessoal, espero que tenha gostado e que esse artigo seja útil a vocês!

Artigos relacionados

Conditional Expressions

Arithmetic and Logical Operators

Compartilhe o artigo com seus amigos clicando nos icones abaixo!!!

Este post está licenciado sob CC BY 4.0 e pelo autor.