(IaC) Parte 6: Provisionando um DigitalOcean Droplet com Terraform

DevOps from Zero!đŸ’»
9 min readNov 13, 2021

Faaalllaaaaaaaa turma! Voltando com tudo porque eu amo Cloud e DigitalOcean eu gosto demais💙. Sem mais declaraçÔes
 😅 vamos ao que interessa, hoje vamos fazer do zero um provisionamento de um recurso de Droplet no provider da DigitalOcean usando o queridĂ­ssimo Terraform. Mas Amaury, o que Ă© Droplet? nossa, Terraform? Bom, se vocĂȘ estĂĄ perdido nos termos, calma que hoje vocĂȘ vai aprender todos aqui comigo, do zero ao deploy na DigitalOcean.

Relembrando a trilha de IaC

No passado eu jĂĄ tinha escrito 5 artigos sobre Infraestrutura como CĂłdigo (IaC) usando Terraform, Ansible e AWS. Dessa vez, dando continuidade nessa trilha, vou usar a DigitalOcean como provider, eu acho bacana a gente aprender outros tipos de providers de computação em nuvem e particularmente eu gosto muito da DigitalOcean e acredito que depois dessa leitura vocĂȘ tambĂ©m poderĂĄ gostar! E se vocĂȘ perdeu de ler os 5 artigos sobre a trilha de IaC que eu escrevi, corre lĂĄ no Medium, na parte superior direita, tem o campo de busca onde vocĂȘ pode procurar pelos artigos.

Obtenha $100 para experimentar o DigitalOcean

Basta acessar o site: https://try.digitalocean.com/freetrialoffer/

DigitalOcean

Terraform: Introdução

Lembra no começo quando eu disse que vocĂȘ iria aprender todos os termos comigo? Pois Ă©, vamos começar falando sobre o Terraform. O Terraform Ă© uma ferramenta de infraestrutura como cĂłdigo, ou seja, Ă© a ferramenta ideal para que vocĂȘ possa escrever os requisitos da sua infraestrutura no formato HCL (Hashicorp Configuration Language), Ă© atravĂ©s do Terraform que vocĂȘ faz o provisionamento dos recursos em Cloud, seja mĂĄquinas virtuais, banco de dados, redes, e muito mais!

Vou iniciar essa parte jĂĄ assumindo que vocĂȘ tem instalado o Terraform no seu lab de estudos, pode ser (AWS EC2, Vagrant + VirtualBox) ou outro qualquer de sua preferĂȘncia. Caso vocĂȘ tenha dĂșvidas, basta acessar o site do Terraform, que ele mostra o passo a passo para vocĂȘ efetuar a instalação.

Principais comandos do Terraform

Deixo abaixo alguns dos principais comandos mais utilizados do Terraform. Basicamente vamos usar todos eles aqui no decorrer do nosso lab na DigitalOcean.

Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure

Configurando o token de acesso da DigitalOcean

Nessa etapa teremos que criar nosso token de acesso na DigitalOcean para que o Terraform possa se comunicar com o provider via API. De forma bem simples, basta vocĂȘ acessar a sua conta da DigitalOcean e seguir os passos abaixo.

  • Assim que vocĂȘ acessar sua conta da DigitalOcean, do lado esquerdo vocĂȘ verĂĄ uma opção chamada API. VocĂȘ clica nesse recurso.
  • Assim que vocĂȘ clicar deverĂĄ ver uma tela similar Ă  essa abaixo:
DigitalOcean
  • VocĂȘ deve clicar no botĂŁo de gerar token e prosseguir com as etapas. No meu caso eu jĂĄ tenho o token criado e nĂŁo preciso passar por essa etapa.

OBS: Vale destacar que esse token vocĂȘ nĂŁo deve compartilhar ele de forma alguma com outras pessoas e nem passar ele via commit para o Github. Para isso, vamos gerar uma variĂĄvel, assim vocĂȘ fica mais seguro sobre isso, e basta rodar esse comando no seu terminal colocando o seu token que estarĂĄ tudo certo:

$ export DO_PAT=”your_personal_access_token”

Preparando nosso ambiente

Bom, nessa etapa podemos partir direto para a CLI do Terraform e começar a codar usando a linguagem do prĂłprio Terraform (HCL). Normalmente eu uso VS Code para isso, mas vocĂȘ pode escrever usando qualquer editor/IDE da sua preferĂȘncia. Eu gosto de usar o VS Code para Web, essa Ă© uma feature recĂ©m lançada da Microsoft que disponibilizou essa versĂŁo Web do VS Code.

Se vocĂȘ perdeu de ler meu Ășltimo artigo, cola lĂĄ depois para saber mais detalhes do VS Code para Web, eu fiz um overview sobre essa feature.

Codificando o DigitalOcean Droplet com Terraform HCL

Droplet no DigitalOcean nada mais é do que um serviço de måquina virtual. Abaixo alguns exemplos de serviços disponíveis na DigitalOcean:

digitalocean_droplet: Droplets (servers)
digitalocean_loadbalancer: Load Balancers
digitalocean_domain: DNS domain entries
digitalocean_record: DNS records

Para mais detalhes, sempre use a documentação oficial do produto.

Boas prĂĄticas do Terraform

Seguindo as boas prĂĄticas do Terraform, vamos separar nossos arquivos .tf em vĂĄrios arquivos:

versions.tf
backend.tf
droplet.tf
variables.tf

Isso se faz necessĂĄrio para deixarmos nosso cĂłdigo reutilizĂĄvel. Por menor que seja os recursos que vocĂȘ estĂĄ desenvolvendo, aestrutura bĂĄsica de um projeto em Terraform Ă© ter varios arquivos .tf

O primeiro arquivo que eu vou escrever é o arquivo versions.tf é exatamente aqui nesse arquivo que vou passar as restriçÔes de versÔes que serão exigidas para executar esse projeto com Terraform.

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}

Feito isso, vamos para o segundo arquivo .tf que agora vai ser o backend.tf
Nesse arquivo eu preciso setar qual Ă© o provider que estamos utilizando.

// Configure the DigitalOcean Provider
provider "digitalocean" {
token = var.do_token
}

Agora podemos partir para o nosso recurso em si, que Ă© o arquivo droplet.tf
Nesse arquivo descrevemos tudo sobre o que precisamos para criar um droplet na DigitalOcean.

// Configure the resource for DigitalOceanresource "digitalocean_droplet" "web" {
image = var.image
name = var.name
region = var.region
size = var.size
}

E por fim, vamos escrever nosso Ășltimo arquivo que Ă© o variables.tf
Aqui nesse arquivo definimos todas as variĂĄveis que pretendemos usar.

variable "region" {
description = "my region"
type = string
default = "nyc1"
}
variable "size" {
description = "my size"
type = string
default = "s-1vcpu-1gb"
}
variable "name" {
description = "name of my instance"
type = string
default = "web-1"
}
variable "image" {description = "my image"
type = string
default = "ubuntu-18-04-x64"
}
variable "do_token" {
description = "my token"
type = string
}

Uma boa pråtica para esse cenårio de variåveis é sempre colocar a descrição das variåveis, se é uma variåvel opcional ou obrigatória e qual é o tipo da mesma.

Outro ponto bacana, Ă© incluir o tfstatedentro do .gitignore, para vocĂȘ nĂŁo versionar o seu estado dentro do repositĂłrio. Pra isso Ă© sempre bom usar sempre o backend remoto, para armazenar o estado do Terraform em algum lugar separado do cĂłdigo, por segurança ou atĂ© mesmo backup (ex. AWS S3).

Hora de pÎr o Terraform em ação

Criado os arquivos, podemos partir para executar nosso projeto, lembrando o que queremos Ă© provisionar um DigitalOcean Droplet.

Primeiro comando que devemos executar é o comando $ terraform fmt Esse comando deve formatar corretamente nossos arquivos criados para que esteja dentro do estilo de marcação do HCL.

$ terraform fmt
backend.tf
variables.tf
versions.tf

Feito vamos executar o $ terraform init

$ terraform  initInitializing the backend...Initializing provider plugins...
- Reusing previous version of digitalocean/digitalocean from the dependency lock file
- Using previously-installed digitalocean/digitalocean v2.16.0
Terraform has been successfully initialized!You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Agora vamos gerar o plano da nossa infraestrutura que serĂĄ provisionada. Vale lembrar que o seu token criado serĂĄ exigido aqui nesse comando, basta copiar e colar ele aqui que o Terraform prossegue.

$ terraform plan
var.do_token
my token
Enter a value: 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 will be created
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ 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)
+ 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 = "nyc1"
+ 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: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now

Perceba que ele fez o plano de tudo que vai ser aplicado na DigitalOcean.

Aplicando as configuraçÔes na DigitalOcean

Nesse momento que conhecemos o plano da nossa infraestrutura, vamos executar o comando $ terraform apply

$ terraform apply --auto-approve
var.do_token
my token
Enter a value: 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 will be created
+ resource "digitalocean_droplet" "web" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ graceful_shutdown = false
+ 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)
+ 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 = "nyc1"
+ 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.
digitalocean_droplet.web: Creating...
digitalocean_droplet.web: Still creating... [10s elapsed]
digitalocean_droplet.web: Still creating... [20s elapsed]
digitalocean_droplet.web: Still creating... [30s elapsed]
digitalocean_droplet.web: Still creating... [40s elapsed]
digitalocean_droplet.web: Still creating... [50s elapsed]
digitalocean_droplet.web: Still creating... [1m0s elapsed]
digitalocean_droplet.web: Still creating... [1m10s elapsed]
digitalocean_droplet.web: Creation complete after 1m11s [id=273462873]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
DigitalOcean Droplet

Veja acima que temos o Droplet criado com sucesso na DigitalOcean usando o Terraform, de forma rĂĄpida e simples.

Faça o clone do projeto no Github

TambĂ©m deixarei os arquivos disponĂ­veis no Github para que vocĂȘs possam testar e se tiver alguma sugestĂŁo de melhoria, cria um PR que a gente discute junto depois! 🚀

Finalizando


Para hoje seria isso pessoal, espero que tenham gostado da leitura e que tambĂ©m tenham praticado do seu lado. NĂŁo deixe de comentar se tiver dĂșvida, se gostou ou nĂŁo. Valew demais galera. Tmj!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

DevOps from Zero!đŸ’»
DevOps from Zero!đŸ’»

Written by DevOps from Zero!đŸ’»

SRE/DevOps Engineer| Lifelong learner | Medium Creator | AWS/Azure certified☁ | Hashicorp Ambassador | Containers | Tech | Community | Coffee

No responses yet

Write a response