SRE - DevOps

Terraform: Criando módulos

Utilizar módulos em nosso código Terraform faz com que possamos ter a reutilização de código, evitando a repetições bem como nos dando flexibilidade para criarmos dezenas de recursos similares porém com suas respectivas particularidades utilizando-se da mesma base de código.

   Um módulo é um contêiner para vários recursos usados juntos. Os módulos podem ser usados para criar abstrações leves, para que você possa descrever sua infraestrutura em termos de arquitetura, em vez de diretamente em termos de objetos físicos.  

   Os arquivos .tf em seu diretório de trabalho formam juntos o módulo raiz. Esse módulo pode chamar outros módulos e conectá-los, passando os valores de saída (outputs) de um para os valores de entrada (inputs) de outro.  

   Estrutura de um Módulo  

   Módulos reutilizáveis   são definidos usando todos os mesmos conceitos de linguagem de configuração que usamos nos módulos raiz. Mais comumente, os módulos usam:  

  • Input aceitam valores do módulo chamado.
  • Output para retornar resultados, que ele pode usar para preencher argumentos em outro lugar.
  • Resources para definir um ou mais objetos de infraestrutura que o módulo gerenciará.

   Para definir um módulo, basta criar um novo diretório para ele e coloque um ou mais arquivos .tf dentro, da mesma forma que faria em um root module.  

   O Terraform pode carregar módulos de forma local ou de repositórios remotos. Se um módulo for reutilizado por várias configurações, você pode colocá-lo em seu próprio repositório de controle de versão(git).  

   Criando nosso próprio Módulo  

   Após entender como funciona e qual a estrutura de um módulo, iremos criar um diretório chamado "modules" dentro do nosso projeto e iremos criar os seguintes arquivos:  

├── modules
|   └─── ec2
│       ├── main.tf
│       └── variables.tf
└── main.tf      
   Para construir o nosso módulo, precisamos ajusta-lo para trabalhar de forma genérica, então repassaremos todos os parâmetros em forma de variável. O nosso /ec2/main.tf ficará da seguinte forma:  
resource "aws_instance" "Teste" {
 ami = var.ami_aws
 instance_type = var.type_instance
 key_name = var.ssh_key
 tags = var.tags
}      

O nosso arquivo variables.tf terá a declaração das variáveis porém sem nenhuma configuração pré ajustada:  

variable "ami_aws" {
 type = "string"
}

variable "type_instance" {
 type = "string"
}

variable "ssh_key" {
 type = "string"
}

variable "tags" {
 type        = "map"
}      

   Feito isso, já temos o nosso módulo em branco para receber as variáveis como input através do carregamento do módulo. Nosso arquivo main.tf na raiz do projeto deverá carregar o módulo e repassar as variáveis:  

provider "aws" {
 region  = "sa-east-1"
 shared_credentials_file = "~/.aws/credentials"
 profile = "default"
}

module "server" {
 source          = "./modules/ec2"
 ami_aws         = "ami-05dbe393e7e1c810a"
 type_instance   = "t2.micro"
 ssh_key         = "MyKeySSH"
 tags            = {"Name" = "meu-modulo-teste", "Ambiente" = "Desenvolvimento"}
}      

   Dessa forma, iremos carregar o módulo "ec2" e repassaremos os valores das variáveis que o módulo espera receber, com isso conseguimos reutilizar a mesma estrutura e chamar o módulo várias vezes para aplicações diferentes, por exemplo, subir duas máquinas com configurações diferentes:  

provider "aws" {
 region  = "sa-east-1"
 shared_credentials_file = "~/.aws/credentials"
 profile = "default"
}

module "server" {
 source          = "./modules/ec2"
 ami_aws         = "ami-05dbe393e7e1c810a"
 type_instance   = "t2.micro"
 ssh_key         = "MyKeySSH"
 tags            = {"Name" = {"Name" = "meu-modulo-teste", "Ambiente" = "Desenvolvimento"}
}

module "server2" {
 source          = "./modules/ec2"
 ami_aws         = "ami-035e6197f1f09dd23"
 type_instance   = "t2.2xlarge"
 ssh_key         = "MyKeySSH_1"
 tags            = {"Name" = {"Name" = "meu-modulo-teste", "Ambiente" = "Produção"}
}      

   Bom, esse foi um modo rápido e simples de demostrar com criar um modulo no terraform, recurso essencial para o dia a dia, breve farei um post com usar o console do terraform para debugar e obter dados da cloud antes de aprovisionar sua infraestrutura.