O autor selecionou o Fundo de Código Aberto e livre para receber uma doação como parte do programa Escreva para Doações.
Introdução
Terraform oferece recursos avançados que tornam-se cada vez mais úteis à medida que o seu projeto cresce em tamanho e complexidade. É possível aliviar o custo de manutenção de definições de infraestrutura complexas para vários ambientes estruturando seu código para minimizar as repetições e introduzindo fluxos de trabalho auxiliados por ferramentas para testes e implantações mais fáceis.
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á ligado à uma configuração de infraestrutura. Alguns backends, como o local
ou o s3
, podem conter vários estados. Nesse caso, a associação de estado e infraestrutura ao backend descreve um espaço de trabalho. Os espaços de trabalho permitem que você deploy múltiplas instâncias distintas da mesma configuração de infraestrutura sem armazená-las em backends separados.
Neste tutorial, você vai primeiro implantar várias instâncias de infraestrutura usando diferentes workspaces. Em seguida, você 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 os 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. As instruções podem ser encontradas nos documentos do produto do DigitalOcean, em Como Criar um Token de Acesso Pessoal.
- Terraform instalado na sua máquina 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
.
Implementando Múltiplas Instâncias de Infraestrutura Usando Espaços de Trabalho
Múltiplos espaços de trabalho são úteis quando você deseja implantar ou testar uma versão modificada de sua infraestrutura principal sem criar um projeto separado e configurar chaves de autenticação novamente. Uma vez que você tenha desenvolvido e testado um recurso 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 a criação de 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 do gerenciamento de versões (VCS) ao mapear-as para suas respectivas variantes de infraestrutura. Como você consegue isso depende do próprio ferramenta VCS; por exemplo, em branches do 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 , para evitar repetir código similar para cada ambiente.
Implementando Recursos em Workspaces
Agora você criará um projeto que implementa 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 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 implementado. Quando terminar, salve e feche o arquivo.
Aplicar o projeto para Terraform para executar suas ações com:
A saída terá um aspecto semelhante a isto:
Digite yes
quando solicitado para implantar a Droplet no workspace default
.
O nome da Droplet será web-default
, pois o workspace com o qual você inicia é chamado default
. Você pode listar os workspaces para confirmar que é o único disponível:
A saída terá um aspecto semelhante a isto:
Output* default
O asterisco (*
) significa que você atualmente tem esse workspace selecionado.
Crie e troque para um novo workspace chamado testing
, que você usará para implantar uma Droplet diferente, executando workspace new
:
A saída terá um aspecto semelhante a isto:
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 da Droplet novamente executando:
A saída será semelhante à execução 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á criada
+ 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.
...
Note que Terraform planeja implantar uma Droplet chamada web-testing
, que ela chama de forma diferente de web-default
. Isto é porque o default
e o testing
workspaces têm estados separados e não têm conhecimento dos recursos uns dos outros — mesmo sendo oriundos do mesmo código.
Para confirmar que você está no workspace testing
, exiba o workspace atual executando workspace show
:
A saída será o nome do workspace atual:
Outputtesting
Para excluir um workspace, você primeiro precisa destruir todos os recursos implantados nele. Em seguida, se ele estiver ativo, você precisa alternar para outro usando workspace select
. Como o workspace testing
aqui está vazio, você pode alternar para default
imediatamente:
Você receberá a saída do Terraform confirmando a alternação:
OutputSwitched to workspace "default".
Em seguida, você pode excluí-lo executando workspace delete
:
O Terraform então fará a exclusão:
OutputDeleted workspace "testing"!
Você pode destruir o Droplet que você implantou no workspace default
executando:
Insira yes
quando solicitado para finalizar o processo.
Nesta seção, você trabalhou em vários workspaces do Terraform. Na próxima seção, você vai implantar um recurso com estado.
Implantando Recursos com Estado
Recursos sem estado não armazenam dados, portanto, você pode criá-los e substituí-los rapidamente, porque eles não são únicos. Recursos com estado, por outro lado, contêm dados que são únicos ou não podem ser recriados simplesmente; portanto, eles exigem armazenamento de dados persistentes.
Como você pode acabar destruindo esses recursos ou sendo que múltiplos recursos precisam de seus dados, é melhor armazená-los em uma entidade separada, como Volumes DigitalOcean.
Os volumes fornecem espaço de armazenamento adicional. Eles podem ser anexados a Droplets (servidores), mas são separados destes. Neste passo, você definirá o Volume e o conectará a um Droplet no droplets.tf
.
Abrha-o para edição:
Adicione as seguintes linhas:
Aqui você define duas novas recursos, o próprio Volume 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
recebe os IDs do Droplet e do Volume e instrui a nuvem da DigitalOcean a fazer o Volume estar disponível para o Droplet como um dispositivo de disco.
Quando terminar, salve e feche o arquivo.
Plantee essa configuração executando:
As ações que o Terraform planejará serão as seguintes:
A detalhes de saída que o Terraform criaria um Droplet, um Volume e um Anexo de Volume, que conecta o Volume ao Droplet.
Vous agora definiu e conectou um Volume (um recurso com estado) a um Droplet. Na próxima seção, você revisará módulos Terraform públicos e pré-fabricados que pode incorporar no 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. 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 à 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 mudanças:
Você receberá uma saída semelhante a esta:
A saída mostra que você criará o recurso de chave SSH, o que significa que você baixou e invocou o módulo do seu código.
Conclusão
Projetos maiores podem fazer uso de alguns recursos avançados 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 mudanças no código. O uso de módulos prontos também pode encurtar o tempo de desenvolvimento, mas pode implicar em despesas ou tempo adicionais no futuro se o módulo se tornar obsoleto.
Este tutorial faz parte da série Como Gerenciar Infraestrutura com Terraform. A série abrange vários tópicos relacionados a Terraform,从第一次安装Terraform到管理项目 complexos.