O autor selecionou o Fundo de Código Aberto e Livre para receber uma doação como parte do programa Escreva por Doações.
Introdução
O Terraform oferece recursos avançados que se tornam cada vez mais úteis à medida que seu projeto cresce em tamanho e complexidade. É possível aliviar o custo de manutenção de definições de infraestrutura complexa para múltiplos ambientes, estruturando seu código para minimizar repetições e introduzindo fluxos de trabalho assistidos por ferramentas para um teste e implantação mais fáceis.
O Terraform associa um estado a um backend, o que determina onde e como o estado é armazenado e recuperado. Cada estado tem apenas um backend e está vinculado a uma configuração de infraestrutura. Certos backends, como local
ou s3
, podem conter múltiplos estados. Nesse caso, a combinação de estado e infraestrutura ao backend está descrevendo um espaço de trabalho. Os espaços de trabalho permitem que vocêImplante várias instâncias distintas da mesma configuração de infraestrutura sem armazená-las em backends separados.
Neste tutorial, você primeiro vai implantar várias instâncias de infraestrutura usando diferentes workspaces. Em seguida, vai implantar um recurso com estado, que, neste tutorial, será um Volume DigitalOcean. Finalmente, você vai fazer referência a módulos prontos do Registro Terraform, que você pode usar para complementar seus próprios.
Pré-requisitos
Para concluir este tutorial, você precisará:
- Um token de acesso pessoal do DigitalOcean, que você pode criar através do painel de controle do DigitalOcean. Você pode encontrar instruções nas documentações do produto DigitalOcean, em Como Criar um Token de Acesso Pessoal.
- Terraform instalado em seu computador local e um projeto configurado com o provedor DO. Complete Passo 1 e Passo 2 do tutorial Como Usar Terraform com DigitalOcean e certifique-se de nomear a pasta do projeto
terraform-advanced
, em vez deloadbalance
. Durante Passo 2, não inclua a variávelpvt_key
e o recurso da chave SSH.
Nota: Este tutorial foi testado especificamente com Terraform 1.0.2
.
Implantando Múltiplas Instâncias de Infraestrutura Usando Espaços de Trabalho
Os espaços de trabalho múltiplos são úteis quando você deseja implantar ou testar uma versão modificada de sua infraestrutura principal sem criar um projeto separado e configurar as chaves de autenticação novamente. Uma vez que você tenha desenvolvido e testado uma funcionalidade usando o estado separado, pode incorporar o novo código ao espaço de trabalho principal e possivelmente excluir o estado adicional. Quando você init
um projeto Terraform, independentemente do backend, o Terraform cria um espaço de trabalho chamado default
. Ele sempre está presente e você nunca pode excluí-lo.
No entanto, múltiplos espaços de trabalho não são uma solução adequada para criar múltiplos ambientes, como para staging e produção. Portanto, os espaços de trabalho, que apenas rastreiam o estado, não armazenam o código ou suas modificações.
Como as workspaces não rastreaman o código real, você deve gerenciar a separação do código entre várias workspaces no nível de controle de versão (VCS) ao correlacioná-las com suas variantes de infraestrutura. Como você consegue isso depende do próprio ferramenta de VCS; por exemplo, em branchs Git seria uma abstração apropriada. Para tornar mais fácil gerenciar o código para vários ambientes, você pode dividi-los em módulos reutilizáveis, evitando assim repetir código similar para cada ambiente.
Implantação de Recursos em Workspaces
Agora você criará um projeto que implanta um Droplet, que você aplicará de várias workspaces.
Você armazenará a definição do Droplet em um arquivo chamado droplets.tf
.
Assumindo que você está no diretório terraform-advanced
, crie e abra-o para edição executando:
Adicione as seguintes linhas:
Esta definição criará um Droplet que executa o Ubuntu 18.04 com um núcleo de CPU e 1 GB de RAM na região fra1
. Seu nome conterá o nome da workspace atual de onde ele está sendo implantado. Depois disso, salve e feche o arquivo.
Apply o projeto para o Terraform para executar suas ações com:
A saída será semelhante a esta:
Insira yes
quando solicitado para implantar o Droplet no espaço de trabalho default
.
O nome do Droplet será web-default
, porque o espaço de trabalho com o qual você começou é chamado default
. Você pode listar os espaços de trabalho para confirmar que é o único disponível:
A saída será semelhante a esta:
Output* default
O asterisco (*
) significa que você atualmente tem esse espaço de trabalho selecionado.
Crie e mude para um novo espaço de trabalho chamado testing
, que você usará para implantar um Droplet diferente, executando workspace new
:
A saída será semelhante a esta:
OutputCreated and switched to workspace "testing"!
You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.
Você planeja a implantação do Droplet novamente executando:
A saída será semelhante à corrida anterior:
OutputTerraform 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)
+ id = (known after apply)
+ image = "ubuntu-18-04-x64"
+ ipv4_address = (known after apply)
+ ipv4_address_private = (known after apply)
+ ipv6 = false
+ ipv6_address = (known after apply)
+ ipv6_address_private = (known after apply)
+ locked = (known after apply)
+ memory = (known after apply)
+ monitoring = false
+ name = "web-testing"
+ 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.
...
Observe que o Terraform planeja para implantar um Droplet chamado web-testing
, que ele nomeou de forma diferente de web-default
. Isso ocorre porque os espaços de trabalho default
e testing
têm estados separados e não têm conhecimento das recursos uns dos outros — mesmo que eles provenham do mesmo código.
Para confirmar que você está no espaço de trabalho testing
, insira a atual em que você está com workspace show
:
A saída será o nome do espaço de trabalho atual:
Outputtesting
Para excluir um workspace, você precisa primeiro destruir todos os recursos implantados nele. Em seguida, se ele estiver ativo, você precisa mudar para outro usando workspace select
. Como o workspace testing
aqui está vazio, você pode mudar para default
imediatamente:
Você receberá a saída do Terraform confirmando a mudança:
OutputSwitched to workspace "default".
Você então pode excluí-lo executando workspace delete
:
O Terraform então executará a exclusão:
OutputDeleted workspace "testing"!
Você pode destruir o Droplet que você implantou no workspace default
executando:
Insira yes
quando solicitado para concluir o processo.
Nesta seção, você trabalhou em vários workspaces do Terraform. Na próxima seção, você vai implantar um recurso estadofixo.
Implantando Recursos Estadofixos
Recursos estado-livres não armazenam dados, portanto, você pode criá-los e substituí-los rapidamente, porque eles não são únicos. Recursos estado-fixos, por outro lado, contêm dados que são únicos ou não recriáveis simplesmente; portanto, eles exigem armazenamento de dados persistentes.
Como você pode acabar destruindo esses recursos, ou porque múltiplos recursos precisam de seus dados, é melhor armazená-los em uma entidade separada, como Volumes DigitalOcean.
Volumes fornecem espaço de armazenamento adicional. Eles podem ser anexados a Droplet (servidores), mas são separados deles. Neste passo, você definirá o Volume e o conectará a um Droplet no droplets.tf
.
Abra-o para edição:
Adicione as seguintes linhas:
Aqui você define dois recursos novos, o Volume em si e um anexo de Volume. O Volume será de 10GB, formatado como ext4
, chamado new-volume
, e localizado na mesma região que o Droplet. Como o Volume e o Droplet são entidades separadas, você precisará definir um objeto de anexo de Volume para conectá-los. volume_attachment
pega os IDs de Droplet e Volume e instrui a nuvem DigitalOcean a tornar o Volume disponível para o Droplet como um dispositivo de disco.
Quando terminar, salve e feche o arquivo.
Planeje esta configuração executando:
As ações que o Terraform irá planejar serão as seguintes:
Os detalhes de saída mostram que o Terraform criaria um Droplet, um Volume e um anexo de Volume, que conecta o Volume ao Droplet.
Você agora definiu e conectou um Volume (um recurso estado) the um Droplet. Na próxima seção, você revisará os módulos Terraform públicos e prontos para usar que você pode incorporar em seu projeto.
Referenciando Módulos Pré-montados
Além de criar seus próprios módulos personalizados para seus projetos, você também pode usar módulos e fornecedores pré-montados de outros desenvolvedores, que estão disponíveis publicamente no Registro Terraform.
Na seção de módulos, você pode pesquisar a base de dados de módulos disponíveis e classificar por fornecedor para encontrar o módulo com a funcionalidade de que você precisa. Uma vez encontrado, você pode ler sua descrição, que lista as entradas e saídas que o módulo fornece, bem como suas dependências de módulos e fornecedores externos.
Agora, você adicionará o módulo de chave SSH da DigitalOcean ao seu projeto. Você armazenará o código separado das definições existentes em um arquivo chamado ssh-key.tf
. Crie e abra-o para edição executando:
Adicione as seguintes linhas:
Este código define uma instância do módulo clouddrove/droplet/digitalocean
do registro e configura alguns dos parâmetros oferecidos por ele. Ele deve adicionar uma chave SSH pública à sua conta, lendo-a de ~/.ssh/id_rsa.pub
.
Quando terminar, salve e feche o arquivo.
Antes de plan
ificar este código, você deve baixar o módulo referenciado executando:
Você receberá uma saída semelhante a seguinte:
OutputInitializing modules...
Downloading clouddrove/ssh-key/digitalocean 0.13.0 for ssh-key...
- ssh-key in .terraform/modules/ssh-key
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of digitalocean/digitalocean from the dependency lock file
- Using previously-installed digitalocean/digitalocean v2.10.1
Terraform has been successfully initialized!
...
Agora você pode planificar o código para as alterações:
Você receberá uma saída semelhante a esta:
A saída mostra que você criaria o recurso de chave SSH, o que significa que você baixou e invocou o módulo de seu código.
Conclusão
Projetos maiores podem fazer uso de algumas funcionalidades avançadas que o Terraform oferece para ajudar a reduzir a complexidade e facilitar a manutenção. Espaços de trabalho permitem que você teste novas adições ao seu código sem tocar nas implantações principais estáveis. Você também pode combinar espaços de trabalho com um sistema de controle de versão para rastrear alterações no código. O uso de módulos prontos também pode encurtar o tempo de desenvolvimento, mas pode acarretar despesas adicionais ou tempo no futuro se o módulo se tornar obsoleto.
Esse tutorial faz parte da série Como Gerenciar Infraestrutura com Terraform. A série cobre uma variedade de tópicos sobre Terraform, desde a instalação do Terraform pela primeira vez até o gerenciamento de projetos complexos.