Terraform — Infraestrutura como código (IoC)

O Terraform é uma ferramenta open source e extensível que permite o gerenciamento e provisionamento da infraestrutura como código (IaC). Desenvolvida e mantido pela HashiCorp, a ferramenta utiliza uma linguagem simples e declarativa, permitindo desta forma o provisionamento desde uma simples VM até uma infra completa, passando por recursos de rede, segurança, banco de dados, balanceadores de carga e outros.

Nas palavras da própria HashiCorp:

O Terraform é usado para criar, gerenciar e atualizar recursos de infraestrutura, como máquinas físicas, VMs, comutadores de rede, contêineres e muito mais. Quase qualquer tipo de infraestrutura pode ser representado como um recurso no Terraform.

> Site oficial da ferramenta: https://www.terraform.io

Direto ao ponto

O funcionamento da ferramenta é muito simples, como ela foi construída utilizando a linguagem GoLang, suas dependências estão contidas no próprio binário, desta forma basta:

  • Baixar uma das versões disponíveis para MacOS, FreeBSD, Linux, OpenBSD, Solaris ou Windows; e
  • Opcionalmente registrar o binário na variável PATH, deste modo será possível realizar a chamada ao executavel a partir de qualquer local do sistema operacional.

> Download da ferramenta: https://www.terraform.io/downloads.html

> O código produzido ao longo deste material pode ser baixado em: https://github.com/fabiojaniolima/terraform-examples

Que os jogos comecem

Para os propósitos gerais deste material irei utilizar como exemplo a nuvem pública Linode, entretanto, todo o conhecimento aqui transmitido pode ser reaproveitado para implantações na DigitalOcean, AWS, Azure, Google Cloud, VMware vSphere, Docker e outros.

Os serviços de nuvem apresentados acima oferecem um crédito inicial para você testar os serviços contidos no catalogo. Dê uma “pesquisadinha” no Google para achar cupons de desconto/crédito 😉

Preparando o terreno

Iremos preparar o terreno tendo como base sólida a documentação oficial. Para simplificar vamos seguir por etapas:

1- Acessar a lista de providers:

All Providers: https://www.terraform.io/docs/providers/index.html

2 – Procure e clique em Linode. Também é possível ignorar o passo anterior ao utilizar o link direto:

Linode Provider: https://www.terraform.io/docs/providers/linode/index.html

A página apresentada fala rapidamente a respeito do provider e trás algumas informações como exemplo de uso (Example Usage) e referencias de configuração (Configuration Reference). Conforme podemos observar no tópico Configuration Reference, o token é uma configuração obrigatória, ou seja, precisamos obter esse dado junto ao provedor, que neste caso é o Linode.

Supondo que você já acessou o site oficial do provedor em http://linode.com e possui um cadastro ativo, vamos ao passo seguinte.

3 – Para obter um token, dentro do painel cliquem em seu Username > My Profile > API Tokens > Add a Personal Access Token:

Imagem 01 — Painel de gestão de Access Tokens

Ao clicar em Add a Personal Access Token uma lista de opções será exibida:

Imagem 02 — Painel de gestão do nível de acesso do token

Vejamos as opções disponíveis:

  • Label: um título livre para identificar seu token no painel de listagem;
  • Expiry: prazo de validade do token. Como este é um ambiente de teste estou criando um token que expira em 1 mês, porém, temos opções com prazos maiores ou token que nunca expira;
  • Access: determina o nível de acesso a cada recurso. Observe que ativei somente o recurso Linodes, este é justamente o recurso que permite provisionar e gerenciar os VPS (VMs virtuais), para os propósitos deste material é suficiente.

Lembre-se que é uma questão de segurança ativar somente os recursos que de fato precisamos, isso evita abrir brechas desnecessárias caso este token seja “sequestrado”. Essa abordagem é valida independente do provedor escolhido.

E aqui está nosso Token:

imagem 3 — Token id

Token ID gerado será utilizado mais adiante, por este motivo é importante que você grave o valor apresentado uma vez que não há como recuperá-lo mais tarde. Caso venha a perder este token ou o mesmo for comprometido, será necessário ir ao painel de gestão, revogar o token e gerar um novo.

Declarando a infraestrutura como código

Nossa infra será declarada tendo como base 4 arquivos, isso irá garantir organização e flexibilidade. Os arquivos são:

  • variables.tf: declaração das variáveis de input
  • main.tf: declaração dos objetos da infraestrutura
  • outputs.tf: define quais informações a respeito de cada elemento devem ser retornada e armazenada no estado do projeto
  • terraform.tfvas: um dos possíveis locais onde podemos definir os valores das variáveis declaradas em variables.tf

Arquivo variables.tf

Crie o arquivo de definição de variáveis variables.tf e cole o código abaixo:

variable "token" {
  type        = string
  description = "Informe o Linode API Access Token"
}

variable "instances_name" {
  type        = list(string)
  default     = ["server-1"]
  description = "Nome da(s) instância(s)"
}

variable "region" {
  type    = string
  default = "us-southeast"
}

variable "root_pass" {
  type        = string
  description = "Informe a senha do usuário root"
}

variable "authorized_keys" {
  type        = list(string)
  default     = []
  description = "Zero ou mais chaves RSA para autenticação SSH"
}

variable "identification_tags" {
  type        = list(string)
  default     = []
  description = "Zero ou mais tags utilizadas para identificação do elemento"
}

Continue lendo em: https://lnkd.in/dBfSEDX