Hoje vamos dar os primeiros passos no mundo da Infraestrutura como um Código, a.k.a. IaC, fazendo a instalação local do Terraform, autenticando no Azure via cli e criando o primeiro objeto no Azure.

O Terraform faz uso do HCL (Hashicorp Configuration Language) e a sua sintaxe foi muito baseada na libucl.

Para falar sobre o Terraform (como funciona, detalhes, componentes, divisões, etc), eu poderia criar uma série apenas para isso, mas não é a ideia aqui. Vamos colocar a mão na massa direto.

Passo 1: Instalando o Chocolatey & Terraform

Para instalar o Terraform no Windows, antes, precisamos instalar o Chocolatey antes (que é um gerenciador de pacotes do windows). Você pode rodar tudo em uma linha (lembre-se de executar como administrador, senão vai dar erro), mas se quiser, rode os 3 comandos separadamente:

Set-ExecutionPolicy Bypass -Scope Process -Force; 
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; 
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Instalado o Chocolatey, vamos instalar o Terraform:

choco install terraform

Uma recomendação… Coloquem o Terraform no Path, para não precisarem ficar copiando o executável a cada novo projeto.

Passo 2: Instalação do Azure CLI

Pelo print acima, vocês devem ter notado que eu já estava com o CLI habilitado, mas o que vocês devem rodar no terminal (mais uma vez, como administrador):

Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; 
Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; 
rm .\AzureCLI.msi

O que essa linha fará:

  • Baixar o instalador do AZ CLI
  • Executar em modo silencioso
  • Remover o instalador

Passo 3: Autenticar no Azure

Para se autenticar no Azure, você deve executar o comando:

az login

(Caso dê erro, feche o terminal, abra novamente e reexecute o comando)

Ao digitar o az login uma página abrirá para você se autenticar no Azure… Coloque seu usuário, sua senha e o retorno será de um json com os dados das assinaturas que a conta tem acesso. Algo mais ou menos assim:

Caso apareça várias subscriptions e você queira se conectar em alguma em específico, use o seguinte comando:

az account set --subscription "123ABC-SubscriptionID"

Não vai ser nesse post que eu vou falar sobre a criação de um Service Principal específico para o Terraform e como configurar as variáveis de ambiente para fazer uso dele… Isso vai ficar para um outro momento, mas tenham isso em mente quando forem desenvolver, fechado?

Passo 4: Criar o Resource Group

Feita toda a função… chegou a hora de brincarmos com o HCL!

Aqui, nós temos duas opções…

  1. Criar um único arquivo e fazer o deploy. (*Meh*)
  2. Organizar em alguns arquivos e fazer um deploy “diferente”

É óbvio que vamos para a segunda opção… 😉

Vamos criar os seguintes arquivos:

  • providers.tf
terraform{
    required_version = ">=1.1.0"
    required_providers {
        azurerm = {
            source = "hashicorp/azurerm"
            version = "~>3.10.0"
        }
    }
}

provider “azurerm”{ features {} }

Com a opção required_version, é possível determinar uma versão mínima para o funcionamento do Terraform. No meu caso, coloquei a versão 1.1.0. Veja o que acontece se, ao invés de ‘>=1.1.0‘, eu tivesse colocado um ‘=1.1.0‘ (informando que eu só posso executar o script com esta versão em especial:

Spoilers de execução do Terraform…

Com o required_providers, eu informo quais o providers eu vou utilizar no projeto. Neste caso, será o azurerm e a versão última versão a partir da 3.10.0 (para mais informações, veja sobre version-constraints)

No bloco provider eu determino as configurações de cada provider que eu vou utilizar. Neste caso, eu vou usar o provider azurerm e vou utilizar as opções padrão.

  • variables.tf

A ideia aqui é mostrar a possibilidade de criarmos algumas opções caso se queira aproveitar alguma informação mais adiante, como por exemplo, um prefixo ou então a localização que iremos colocar o nosso ambiente:

variable "rg_prefixo" {
    default = "rg"
    description = "Prefixo para os Resource Groups criados"
}

variable “ambiente” { default = “dev” description = “Ambiente que estamos utilizando” }

variable “rg_localizacao”{ default = “eastus” description = “Localização do RG” }

  • main.tf

Aqui é onde vamos criar os recursos propriamente ditos.

resource "random_pet" "nome-rg"{
    prefix = "${var.rg_prefixo}-${var.ambiente}"
}

resource “azurerm_resource_group” “rg” { name = random_pet.rg-name.id location = var.rg_localizacao }

Talvez você esteja se perguntando de onde saiu esse random_pet né? Dê uma olhada aqui.

A ideia é que, usando o provider random, você possa construir recursos usando nomes aleatórios, crie senhas, número inteiros, uuids, etc.

Em resumo: Primeiro determinamos o nome do nosso recurso (que aqui ficará como rg-dev) e, em seguida, a gente consiga criar o Resource Group usando as informações acima.

  • output.tf

Vamos criar agora um arquivo apenas para podermos validar como os dados ficaram, no final.

output "nome_do_rg" {
    value = azurerm_resource_group.rg.name
}

Passo 5: Executando o Terraform

Ufa! Agora, vamos para a parte massa… Vamos ver a coisa toda rodando.

Primeiro, devemos inicializar o projeto:

terraform init

Agora, devemos validar se está tudo de acordo e planejar:

terraform validate
terraform plan

Veja que o plan criou um passo a passo do que será feito, avisando sobre a criação dos recursos e informando que alguns dos nomes serão conhecidos apenas no momento da criação, pois será criado dinamicamente.

E por último (mas não menos importante):

terraform apply

Apenas como observação… Notem que é preciso realizar uma confirmação para realizar o processo e, logo em seguida, ele já retorna o valor do Resource Group criado.

Vamos ver se deu certo? Vamos no Portal do Azure e ver os Resources Groups:

E voi lá, temos o nosso primeiro objeto criado usando IaC.

Caso queira destruir o que fez, ainda via Terraform, basta rodar um terraform destroy e confirmar a operação. Levou pouco mais de um minuto para mim nos testes. Eu não vou rodar, pois quero usar esse mesmo RG para os próximos passos.

Próximos passos:

  • Criar novos objetos.
  • Configurar o Service Principal
  • Colocar no git ou no DevOps para pensar em CI/CD

Caso queira acompanhar as evoluções, estou colocando as alterações no meu github:

Dark Mode

** Terraform (this link opens in a new window) ** * by LoganMerazzi (this link opens in a new window) *

<p class="ebg-br-description">


<p class="ebg-br-footer">
   <span class="ebg-br-background-image"> 1 Subscriber </span>  <span class="ebg-br-background-image"> 0 Watchers </span>  <span class="ebg-br-background-image"> 0 Forks </span> <a target="_blank" rel="noopener noreferrer" class="ebg-br-link" href="https://github.com/LoganMerazzi/Terraform"> Check out this repository on GitHub.com (this link opens in a new window) </a>

Mas claro que toda nova manutenção, informarei em um novo post por aqui (saindo a primeira série de 2022?).

[]’s!!