Como Usar o Terraform com Sua Equipe

O autor selecionou o Fundo de Software Livre e de Código Aberto para receber uma doação como parte do programa Escreva por Doações.

Introdução

Quando várias pessoas estão trabalhando no mesmo projeto Terraform de diferentes locais simultaneamente, é importante lidar corretamente com o código de infraestrutura e o estado do projeto para evitar erros de sobregravação. A solução é armazenar o estado remotamente em vez de localmente. Um sistema remoto está disponível para todos os membros da sua equipe, e é possível que eles travem o estado enquanto estão trabalhando.

Um desses backends remotos é o pg, que armazena o estado em um banco de dados PostgreSQL. Durante o curso deste tutorial, você o utilizará com um Banco de Dados Gerenciado da DigitalOcean para garantir a disponibilidade dos dados.

O Terraform também suporta a oferta oficial e gerenciada na nuvem pela Hashicorp chamada Terraform Cloud – um aplicativo proprietário que sincroniza o trabalho da sua equipe em um só lugar e oferece uma interface de usuário para configuração e gerenciamento.

Neste tutorial, você criará uma organização no Terraform Cloud à qual conectará seu projeto. Em seguida, você usará sua organização para configurar espaços de trabalho e recursos. Você armazenará seu estado na nuvem gerenciada para que esteja sempre disponível. Você também configurará o backend pg com um banco de dados PostgreSQL gerenciado correspondente.

Pré-requisitos

Observação: Testamos especificamente este tutorial usando o Terraform 1.1.3.

Armazenando Estado em um Banco de Dados PostgreSQL Gerenciado

Nesta seção, você configurará um projeto que implanta um Droplet e armazena o estado em um banco de dados PostgreSQL gerenciado pela DigitalOcean usando o provedor pg. Este provedor suporta bloqueio de estado, então o estado nunca será sobrescrito por duas ou mais alterações ocorrendo ao mesmo tempo.

Comece criando um diretório chamado terraform-team-pg onde você irá armazenar o projeto:

  1. mkdir ~/terraform-team-pg

Navegue até ele:

  1. cd ~/terraform-team-pg

Primeiro, você definirá o provedor e depois passará a string de conexão para o banco de dados e o módulo digitalocean. Crie e abra o arquivo provider.tf para edição:

  1. nano provider.tf

Adicione as seguintes linhas:

~/terraform-team-pg/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Aqui você requer o provedor digitalocean e define o backend pg, que aceita uma string de conexão. Em seguida, você define a variável do_token e a passa para a instância do provedor digitalocean.

Lembre-se de substituir sua_string_de_conexão_do_banco_de_dados pela string de conexão para seu banco de dados gerenciado no seu Painel de Controle da DigitalOcean, que você pode encontrar pressionando Ações, selecionando Detalhes da Conexão, e escolhendo String de Conexão no menu suspenso. Em seguida, salve e feche o arquivo

Aviso: Para continuar, nas Configurações do seu banco de dados, certifique-se de ter o endereço IP da máquina da qual você está executando o Terraform em uma lista de permissões.

Inicialize o projeto executando:

  1. terraform init

A saída será semelhante ao seguinte:

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! ...

O Terraform inicializou com sucesso o backend, o que significa que ele se conectou ao banco de dados.

Em seguida, defina o Droplet em um arquivo chamado droplets.tf. Crie e abra-o para edição executando:

  1. nano droplets.tf

Adicione as seguintes linhas:

~/terraform-team-pg/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Este código implantará um Droplet chamado web-1 na região fra1, executando Ubuntu 20.04 com 1GB de RAM e um núcleo de CPU. Isso é tudo que você precisa definir, então salve e feche o arquivo.

Você precisará do seu token da DigitalOcean em uma variável de ambiente. Crie uma, substituindo seu_token_do_do pelo seu token:

  1. export DO_PAT="your_do_token"

Para verificar se a conexão com o banco de dados está funcionando, tente planejar a configuração:

  1. terraform plan -var "do_token=${DO_PAT}"

A saída será semelhante ao seguinte:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # O digitalocean_droplet.web será criado + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

O Terraform não relatou erros e planejou as ações como de costume. Conectou-se com sucesso ao seu banco de dados PostgreSQL e armazenou seu estado. Agora, várias pessoas podem trabalhar simultaneamente neste projeto, mantendo-o sincronizado.

Armazenando o Estado no Terraform Cloud

Nesta etapa, você criará um projeto que implanta um Droplet e utiliza o Terraform Cloud como seu backend com o provedor cloud. Isso envolve a criação da organização e espaço de trabalho no Terraform Cloud, escrevendo o código de infraestrutura e planejando-o.

Criando uma Organização

O Terraform Cloud permite que você tenha várias organizações, que abrigam seus espaços de trabalho e módulos. Organizações de planos pagos podem ter várias equipes com recursos de controle de nível de acesso, enquanto o plano gratuito que você usará fornece apenas uma equipe por organização. Você pode convidar membros da equipe para se juntarem à organização.

Comece acessando o Terraform Cloud e faça login. Se você ainda não criou uma organização, será solicitado a fazê-lo.

Insira um nome para a organização de sua escolha e lembre-se de que ele deve ser único entre todos os nomes no Terraform Cloud. Você receberá um erro se o nome já existir. O endereço de e-mail deve estar preenchido com o endereço da sua conta. Quando terminar, clique no botão Criar organização para continuar.

Em seguida, será solicitado que você selecione o tipo de espaço de trabalho.

Como você interagirá com o Terraform Cloud usando a linha de comando, clique na opção Fluxo de trabalho baseado em CLI. Em seguida, insira um nome para o seu espaço de trabalho e deixe a descrição vazia.

Insira um nome para o espaço de trabalho de sua escolha (vamos chamá-lo de sammy), depois clique em Criar espaço de trabalho para finalizar o processo de criação da organização. Em seguida, você será direcionado para uma página de configurações de espaço de trabalho.

Agora você criou seu espaço de trabalho, que faz parte da sua organização. Como você acabou de criá-lo, seu espaço de trabalho não contém código de infraestrutura. Na parte central da interface, o Terraform Cloud fornece instruções iniciais para se conectar a este espaço de trabalho.

Antes de se conectar a ele, você precisará configurar a versão do Terraform que a nuvem usará para executar seus comandos. Para definir isso, clique no menu suspenso Configurações ao lado de Visão geral e selecione Geral na lista. Quando a página abrir, vá até o menu suspenso Versão do Terraform e selecione 1.1.3 (para este tutorial).

Em seguida, clique no botão Salvar configurações para salvar as alterações.

Para conectar seu projeto à sua organização e espaço de trabalho, você primeiro precisará fazer login usando a linha de comando. Antes de executar o comando, navegue até a página de tokens para criar um novo token de acesso para seu servidor, que fornecerá acesso à sua conta. Você receberá um prompt para criar um token de API.

A descrição padrão está bem, então clique em Criar token de API para criá-lo.

Clique no valor do token, ou no ícone após ele, para copiar o token da API. Você usará este token para conectar seu projeto à sua conta do Terraform Cloud.

Na linha de comando, execute o seguinte comando para fazer login:

  1. terraform login

Você receberá a seguinte saída:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

O Terraform está avisando que o token será armazenado localmente. Digite yes quando ele solicitar:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Cole o token que você copiou e confirme com ENTER. O Terraform mostrará uma mensagem de sucesso:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

Você configurou sua instalação local do Terraform para acessar sua conta do Terraform Cloud. Agora você criará um projeto que implanta um Droplet e o configurará para usar o Terraform Cloud para armazenar seu estado.

Configurando o Projeto

Primeiro, crie um diretório chamado terraform-team-cloud onde você irá armazenar o projeto:

  1. mkdir ~/terraform-team-cloud

Navegue até ele:

  1. cd ~/terraform-team-cloud

Para configurar seu projeto, você precisará:

  • definir e configurar o provedor cloud, que se comunica com o Terraform Cloud.
  • requerer o provedor digitalocean para poder implantar recursos do DigitalOcean.
  • definir e inicializar variáveis que você usará.

Você irá armazenar as especificações de requisitos de provedor e módulo em um arquivo chamado provider.tf. Crie e abra para edição executando:

  1. nano provider.tf

Adicione as seguintes linhas:

~/terraform-team-cloud/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Aqui, você primeiro especifica sua versão do Terraform. Em seguida, especifica o provedor digitalocean como necessário e define o backend como cloud. Para organization e workspaces.name, substitua os valores destacados pelos nomes que você especificou.

Em seguida, você define uma variável chamada do_token, que você passa para o provedor digitalocean criado após ele. Agora você configurou seu projeto para se conectar à sua organização, então salve e feche o arquivo.

Inicialize seu projeto com o seguinte comando:

  1. terraform init

A saída será semelhante a esta:

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform Cloud has been successfully initialized! ...

Uma vez que a definição do Droplet é a mesma do projeto anterior, você pode copiá-la executando:

  1. cp ../terraform-team-pg/droplets.tf .

Finalmente, você irá definir os valores das variáveis. O provedor de nuvem não suporta a passagem de valores para variáveis através da linha de comando, então você terá que passá-los usando arquivos de variáveis ou configurá-los no Terraform Cloud. O Terraform lê os valores das variáveis de arquivos com um nome de arquivo terminando em .auto.tfvars. Crie e abra um arquivo chamado vars.auto.tfvars para edição, no qual você irá definir a variável do_token:

  1. nano vars.auto.tfvars

Adicione a seguinte linha, substituindo seu_do_token pelo seu token da API DigitalOcean:

vars.auto.tfvars
do_token = "your_do_token"

Quando terminar, salve e feche o arquivo. O Terraform lerá automaticamente este arquivo ao planejar ações.

Seu projeto está agora completo e configurado para usar o Terraform Cloud como backend. Agora você irá planejar e aplicar o Droplet e revisar como isso se reflete no aplicativo Cloud.

Aplicando a Configuração

No Passo 1 deste tutorial, você planejou um projeto usando o comando terraform plan. Uma vez que o projeto Terraform Cloud tem os mesmos recursos definidos, você pode pular o planejamento novamente e aplicá-lo diretamente no Terraform Cloud.

Você aplica o projeto executando o seguinte comando para atualizá-lo:

  1. terraform apply

Você notará que a saída é diferente quando você usa local como seu backend:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web será criado + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Ao usar o backend cloud, o Terraform não está planejando ou aplicando a configuração da máquina local. Em vez disso, ele delega essas tarefas para o Terraform Cloud e apenas transmite a saída para o console em tempo real.

Digite yes quando solicitado. O Terraform em breve terminará de aplicar a configuração, e você poderá navegar até o espaço de trabalho no site do Terraform Cloud para ver que uma nova ação foi aplicada.

Agora você pode destruir os recursos implantados executando o seguinte:

  1. terraform destroy

Nesta seção, você conectou seu projeto ao Terraform Cloud, tornando o estado do seu projeto acessível à sua equipe em um local central. Isso permite que o estado seja compartilhado e sincronizado para todos com acesso ao projeto, proporcionando uma experiência mais tranquila.

Conclusão

Neste tutorial, você utilizou dois backends diferentes: Terraform Cloud, que é a oferta de nuvem gerenciada da Hashicorp para o Terraform; e pg, que permite armazenar o estado do projeto em um banco de dados PostgreSQL. Você usou um banco de dados PostgreSQL gerenciado da DigitalOcean, que você pode provisionar e usar com o Terraform em questão de minutos.

Para obter mais informações sobre os recursos do Terraform Cloud, visite a documentação oficial.

Este tutorial faz parte da série Como Gerenciar Infraestrutura com Terraform. A série abrange diversos tópicos do Terraform, desde a instalação do Terraform pela primeira vez até o gerenciamento de projetos complexos.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team