Terraform - Entendendo o que é isso
Tags: beginners, terraform, cloud, iac
Published: 2022-03-19 18:38:45

![Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iyufu1nxekgvru0twvaa.png)
 
O Terraform é uma ferramenta de software de infraestrutura como código aberto usada para provisionar infraestrutura em plataformas de nuvem como AWS, Azure, DigitalOcean, etc. Se você está considerando uma carreira em nuvem ou DevOps, o Terraform é a ferramenta que você deve começar a aprender.

Mas antes de começar a aprender o Terraform, você deve ter um bom entendimento de Infraestrutura como Código (IaC) — o conceito no qual o Terraform se baseia. Como o Terraform é uma ferramenta de provisionamento de infraestrutura em nuvem, também é importante ter um bom entendimento de Cloud Computing.

### Sobre o Terraform

O Terraform não é uma linguagem de programação, mas empresta conceitos como looping, modularização, operadores, etc. de linguagens de programação.

### Variáveis

Assim como as linguagens de programação, o Terraform possui variáveis ​​e valores. Variáveis ​​são nomes usados ​​para armazenar um ou mais valores. Todos os valores têm tipos que especificam onde esse valor pode ser usado. A seguir estão os tipos disponíveis no Terraform:

- **string** - Uma sequência de caracteres Unicode representando algum texto. **Por exemplo, texto = “Olá”**.
- **number** - Um valor numérico. **Por exemplo, num= 1 ou num = 1,3**.
- **bool** - Um valor booleano, verdadeiro ou falso. **Por exemplo, b = falso**
- **lista** ou **tupla** - Uma sequência de valores, como [“a”, “b”]. Os elementos em uma lista ou tupla são identificados por números inteiros consecutivos, começando com zero. **Por exemplo, l = [“a”, “b”]**.
- **map** ou **object** - Um grupo de valores identificados por rótulos nomeados ou pares de valores-chave. **Por exemplo, m = {“a” = 1, “b” = 2}**
- **null** - Se você definir um argumento de um recurso ou módulo como nulo, o Terraform se comporta como se você o tivesse omitido completamente. **Por exemplo, r = null**

### Como definir variáveis ​​no Terraform

É uma boa prática declarar variáveis ​​em um arquivo chamado `variables.tf`. Aqui `.tf` representa um arquivo terraform. Para declarar uma variável, use a seguinte sintaxe:

```
variable "Nome da Variável" {
  type = string
default = "Valor" 
}
```

Mas você deve estar se perguntando, se todas as variáveis ​​estiverem em `variables.tf` , como eles estão sendo utilizados na lógica principal (ou `main.tf` )?

### Simples te respondo: Variáveis ​​de entrada

Dentro do módulo que declarou uma variável, seu valor pode ser acessado usando a sintaxe: `var.<nome-da-variável>`.

```
resource "cloud_instance" "example" { 
  name = var.variable-name 
}
```
As variáveis ​​de entrada são criadas por um `variable` bloco, mas você as referencia como atributos em um objeto chamado `var`.O valor atribuído a uma variável só pode ser acessado em expressões dentro do módulo onde ela foi declarada.

### Módulos

Módulos são equivalentes a bibliotecas de linguagens de programação. Eles contêm código de infraestrutura que pode ser reutilizado. Toda configuração do Terraform tem pelo menos um módulo, conhecido como `módulo raiz`.

### Módulos de chamada

É uma boa prática criar módulos filhos ou bibliotecas de infraestrutura que possam ser usadas em vez de escrever todo o código do zero. Chamar um módulo filho significa incluir todo o código desse módulo no diretório de chamada. Código para chamar um módulo:

```
module "alias" { 
  source = "./appModule" 
  app-name = "myApp" 
}
```

Um módulo que inclui um `module` bloco é o módulo de chamada do módulo filho. O rótulo “alias” imediatamente após a `module` palavra-chave é um nome local, que o módulo chamador pode usar para se referir a esta instância do módulo. Entre `{`e`}` estão os argumentos para o módulo. O `source` argumento é obrigatório para todos os módulos. É o passado onde o módulo filho está localizado.

Ao chamar um módulo, é importante fornecer valores para quaisquer variáveis ​​presentes no módulo filho. O `app-name` é uma variável cujo valor o módulo de chamada está definindo.

### Acessando os valores de saída dos módulos

Um módulo filho pode usar valores de saída para expor um subconjunto de seus atributos de recurso a um módulo pai.

### Declarando um valor de saída

Cada valor de saída exportado por um módulo deve ser declarado usando um bloco `output`:

```
output "app-Name-outputValue" {
  value = "myApp"
}
#code of child module
```
Usando o valor de saída em outro módulo:

```
resource "cloud_instance" "example" { 
  # ... 

  instances = module.alias.app-name 
} 
#code in call module
```

### Contar

`count` permite provisionar várias instâncias de infraestrutura usando um único bloco de código de configuração.

```
resource "cloud_instance" "server" {
  count = 4 # create 4 servers
   Name = "Server-${count.index}+1"
}
```
`count.index` o número de índice distinto começa com "0" e corresponde à instância.

O Terraform permite que os usuários definam e provisionem uma infraestrutura usando uma linguagem de configuração de alto nível conhecida como Hashicorp Configuration Language (HCL) ou, opcionalmente, JSON. O Terraform oferece suporte a vários provedores de infraestrutura em nuvem, como Amazon Web Services , IBM Cloud (anteriormente Bluemix ), Google Cloud Platform , Linode , Microsoft Azure , Oracle Cloud Infrastructure ou VMware vSphere , bem como OpenStack . Eles podem ser usados ​​para agendar dinamicamente contêineres Docker, Hadoop, Spark e muitas outras ferramentas de software. 

Fontes onde pesquisei esse conteúdo:

- https://www.hashicorp.com/resources
- https://www.hashicorp.com/blog/products/terraform