Módulos Terraform

Modulos Terraform



No mundo do provisionamento e gerenciamento de infraestrutura, o Terraform surgiu como uma escolha popular entre desenvolvedores e equipes de operações. Com sua sintaxe declarativa (HCL – HashiCorp Configuration Language) e suporte para vários provedores de infraestrutura, o Terraform permite práticas de infraestrutura como código (IaC).

Uma de suas principais características é o uso de módulos que permitem criar e reutilizar o código da infraestrutura modular. Neste artigo, exploraremos o conceito de módulos do Terraform e como eles podem ajudar a organizar e simplificar nosso código de infraestrutura.







Introdução aos Módulos Terraform

Os módulos do Terraform são pacotes independentes de configurações do Terraform que representam um conjunto de recursos com variáveis ​​de entrada e saída definidas. Eles fornecem uma maneira de encapsular e reutilizar o código de infraestrutura que facilita o gerenciamento e a manutenção de implantações de infraestrutura complexa.



Os módulos podem ser criados e usados ​​internamente em um projeto ou compartilhados entre vários projetos ou equipes.



Organização do Módulo

Ao organizar os módulos do Terraform, é comum haver uma estrutura hierárquica composta por módulos raiz e filhos. Vamos explorar como essa organização funciona.





Módulo Raiz



O módulo raiz representa o módulo de nível superior em nossa configuração do Terraform. É o ponto de entrada para definir a infraestrutura geral e gerenciar os relacionamentos entre diferentes recursos.

O módulo raiz geralmente contém o arquivo “main.tf” onde definimos os recursos e configurações que formam a base de nossa infraestrutura. Opcionalmente, podemos ter os arquivos “variables.tf” e “outputs.tf” com ele. Além disso, podemos definir nosso diretório “módulos” dentro do diretório raiz para acessar facilmente os módulos filhos.

Módulos filhos

Os módulos filhos são componentes modulares que encapsulam conjuntos específicos de recursos ou configurações. Eles são projetados para serem reutilizáveis ​​e representam as unidades independentes da funcionalidade da infraestrutura.

Os módulos filhos podem ser usados ​​na raiz ou outros módulos filhos que permitem composição e construção de infraestrutura complexa. Cada módulo filho geralmente tem seu diretório que contém os arquivos de configuração necessários, como “main.tf”, “variables.tf” e “outputs.tf”.

Agora, vamos ver como podemos criar um módulo Terraform.

Criando um Módulo Terraform

Ao criar módulos Terraform, devemos criar um novo diretório para o módulo com os arquivos de configuração necessários do Terraform. Normalmente, esse diretório é chamado de “módulos”. Defini-lo dentro do diretório raiz do nosso projeto é uma prática recomendada.

Vamos dar um exemplo fácil de um módulo simples para provisionar um servidor web local usando o Docker. Primeiro, definimos o módulo no diretório “modules” como “main.tf”.

recurso 'docker_container' 'servidor web' {
nome  = var.nome
imagem = var.imagem
portas {
interno = var.internal_port
externo = var.external_port
}
}

Aqui, criamos um módulo chamado “docker_container” que usa o nome do contêiner, a imagem do Docker, a porta interna e a porta externa como variáveis ​​de entrada. O módulo encapsula a lógica para criar um recurso de contêiner do Docker e permite que o chamador personalize as propriedades do contêiner.

Conforme demonstrado na imagem a seguir, criamos um arquivo separado chamado “variables.tf” no diretório “modules” para definir as variáveis ​​de entrada que podem ser personalizadas ao usar o módulo:

variável 'nome' {
descrição = 'Nome do contêiner Docker'
tipo = string
}

variável 'imagem' {
descrição = 'Imagem Docker'
tipo = string
}

variável 'Porta Interna' {
descrição = 'Porta interna no contêiner do Docker'
tipo = número
}

variável 'porta_externa' {
descrição = 'Porta externa para mapear'
tipo = número
}

Aqui, declaramos quatro variáveis, cada uma com “descrição” e “tipo” como atributos e valores relevantes para elas.

Usando um Módulo Terraform

Como criamos nosso módulo, agora podemos usá-lo em nossa configuração principal do Terraform referenciando sua fonte. Vamos fazer nosso arquivo de configuração principal que é “main.tf” no diretório raiz.

módulo 'webserver_container' {
fonte = '../modules/docker_container'
nome            = 'meuservidor'
imagem           = 'nginx:mais recente'
porta_interna   = 80
porta_externa   = 8080
}

Usamos o bloco “module” no código anterior para instanciar o módulo contêiner do Docker. Fornecemos os valores de entrada necessários para o módulo, como o nome do contêiner, a imagem do Docker e a configuração da porta. O parâmetro “source” especifica o caminho relativo para o diretório “module”.

A seguir, veremos como usar as saídas do Terraform para usar com módulos.

Saídas do módulo

As saídas do módulo no Terraform fornecem uma maneira de expor valores específicos de dentro de um módulo, tornando-os disponíveis para uso na configuração principal ou por outros módulos. Eles servem como um canal de comunicação entre o módulo e o chamador, o que permite ao módulo fornecer uma informação ou dado que pode ser útil ou necessário para posterior configuração ou tomada de decisão.

saída 'container_id' {
descrição = 'ID do container Docker criado'
valor       = docker_container.webserver.id
}

Aqui, criamos um arquivo “outputs.tf” dentro do diretório “modules”. Essa variável de saída expõe o ID do contêiner do Docker que é criado pelo recurso “docker_container” denominado “webserver” dentro do módulo.

Agora, podemos acessar o ID do contêiner em nosso arquivo de configuração raiz. Consulte o seguinte código atualizado do arquivo “main.tf” no diretório raiz:

módulo 'webserver_container' {
fonte = '../modules/docker_container'
nome            = 'meuservidor'
imagem           = 'nginx:mais recente'
porta_interna   = 80
porta_externa   = 8080
}

recurso 'docker_volume' 'dados' {
# Resto dos argumentos vai aqui
vincular = module.webserver_container.container_id
}

Ao usar o “module.webserver_container.container_id” como o valor para o argumento “bind”, instruímos o Terraform a vincular o volume do Docker ao local especificado pelo ID do contêiner do módulo “web_container”. Isso estabelece um relacionamento entre o recurso de volume do Docker e o contêiner criado pelo módulo “webserver_container”, garantindo que o volume seja montado no local apropriado.

Práticas recomendadas para módulos do Terraform

Modularizar para reutilização

Devemos considerar a reutilização ao projetar os módulos. Além disso, devemos identificar os componentes ou padrões lógicos de nossa infraestrutura e encapsulá-los em módulos separados. Isso promove a reutilização de código, padronização e colaboração mais fácil entre as equipes.

Nomenclatura clara e consistente

O uso de convenções de nomenclatura claras e consistentes para módulos, variáveis ​​e recursos melhora a legibilidade e a compreensão da base de código, o que torna mais fácil para outras pessoas trabalhar e manter os módulos.

Isolar Dependências

Devemos evitar o acoplamento apertado entre os módulos. Cada módulo deve encapsular seus próprios recursos e dependências. Isso garante que os módulos possam ser reutilizados independentemente e promove melhor isolamento e encapsulamento.

Controle de versão e registro de módulo

Podemos publicar nossos módulos em um repositório controlado por versão ou registro de módulo. Isso fornece um local centralizado para compartilhar e descobrir módulos, garantindo fácil acesso e controle de versão.

Conclusão

Fizemos uma breve introdução aos módulos do Terraform e aprendemos como criá-los com um exemplo simples. Em seguida, vimos como usar as variáveis ​​e saídas com nosso módulo para aprimorar sua flexibilidade, capacidade de reutilização e capacidade de manutenção. Concluindo, os módulos do Terraform são ferramentas poderosas para organizar e simplificar o código da infraestrutura. Eles nos permitem encapsular um conjunto de recursos ou configurações em componentes reutilizáveis, promovendo modularidade, reutilização e colaboração em nossos projetos de infraestrutura como código.