

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Compreendendo as variáveis, valores locais e saídas do Terraform
<a name="variables-locals-outputs"></a>

As variáveis aprimoram a flexibilidade do código ao permitir espaços reservados em blocos de código. As variáveis podem representar valores diferentes sempre que o código é reutilizado. O Terraform distingue entre seus tipos de variáveis por seu escopo modular. As variáveis de entrada são valores externos que podem ser injetados em um módulo, os valores de saída são valores internos que podem ser compartilhados externamente e os valores locais sempre permanecem dentro do escopo original.

## Variáveis
<a name="variables"></a>

AWS CloudFormation usa [parâmetros](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) para representar valores personalizados que podem ser definidos e redefinidos de uma implantação de pilha para a próxima. Da mesma forma, o Terraform usa [variáveis de entrada](https://developer.hashicorp.com/terraform/language/values/variables) ou *variáveis*. As variáveis podem ser declaradas em qualquer lugar em um arquivo de configuração do Terraform e geralmente são declaradas com o tipo de dados necessário ou o valor padrão. Todas as três expressões a seguir são declarações de variáveis válidas do Terraform.

```
variable "thing_i_made_up" {
  type = string
}

variable "random_number" {
  default = 5
}

variable "dogs" {
  type = list(object({
    name  = string
    breed = string
  }))

  default = [
    {
      name  = "Sparky",
      breed = "poodle"
    }
  ]
}
```

Para acessar a raça do Sparky dentro da configuração, você usaria a variável`var.dogs[0].breed`. Se uma variável não tiver padrão e não for classificada como anulável, o valor da variável deverá ser definido para cada implantação. Caso contrário, é opcional definir um novo valor para a variável. Em um módulo raiz, você pode definir os valores das variáveis atuais na [linha de comando](https://developer.hashicorp.com/terraform/language/values/variables#variables-on-the-command-line), como [variáveis de ambiente](https://developer.hashicorp.com/terraform/language/values/variables#environment-variables) ou no arquivo [terraform.tfvars](https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files). O exemplo a seguir mostra como inserir valores variáveis no arquivo **terraform.tfvars**, que é armazenado no diretório de nível superior do módulo.

```
# terraform.tfvars
dogs = [
   { 
      name  = "Sparky", 
      breed = "poodle" 
   },
   { 
      name  = "Fluffy", 
      breed = "chihuahua" 
   }
]

random_number = 7

thing_i_made_up = "Kabibble"
```

O valor do arquivo **terraform.tfvars** neste exemplo substituiria o valor padrão na declaração da variável. `dogs` Se você estiver declarando variáveis em um módulo filho, poderá definir os valores das variáveis diretamente no bloco de declaração do módulo, conforme mostrado no exemplo a seguir.

```
module "my_custom_module" {
  source        = "modulesource/custom"
  version       = "0.0.1"
  random_number = 8
}
```

Alguns dos outros argumentos que você pode usar ao declarar uma variável incluem:
+ `sensitive`— Definir isso para `true` evitar que o valor da variável seja exposto nas saídas do processo do Terraform. 
+ `nullable`— Definir isso para `true` permitir que a variável não tenha valor. Isso é conveniente para variáveis em que um padrão não está definido.
+ `description`— Adicione uma descrição da variável aos metadados da pilha.
+ `validation`— Defina regras de validação para a variável.

Um dos aspectos mais convenientes das variáveis do Terraform é a capacidade de adicionar um ou mais objetos de validação na declaração da variável. Você pode usar objetos de validação para adicionar uma condição que a variável deve passar, caso contrário, a implantação falhará. Você também pode definir uma mensagem de erro personalizada para ser exibida sempre que a condição for violada.

Por exemplo, você está configurando um arquivo de configuração do Terraform que os membros da sua equipe executarão. Antes de implantar as pilhas, um membro da equipe precisa criar um arquivo **terraform.tfvars** para definir um valor de configuração importante. Para lembrá-los, você pode fazer algo como o seguinte.

```
variable "important_config_setting" {
  type = string

  validation {
    condition     = length(var.important_config_setting) > 0
    error_message = "Don't forget to create the terraform.tfvars file!"
  }

  validation {
    condition     = substr(var.important_config_setting, 0, 7) == "prefix-"
    error_message = "Remember that the value always needs to start with 'prefix-'"
  }
}
```

Conforme mostrado neste exemplo, você pode definir várias condições dentro de uma única variável. O Terraform mostra apenas mensagens de erro para condições com falha. Dessa forma, você pode aplicar todos os tipos de regras em valores variáveis. Se o valor de uma variável causar uma falha na tubulação, você saberia exatamente o motivo.

## Valores locais
<a name="local-values"></a>

Se houver algum valor em um módulo que você queira criar um alias, use a `locals` palavra-chave em vez de declarar uma variável padrão que nunca será atualizada. Como o nome sugere, um `locals` bloco contém termos que têm como escopo interno esse módulo específico. Se você quiser transformar um valor de string, por exemplo, adicionando um prefixo a um valor de variável para uso em um nome de recurso, usar um valor local pode ser uma boa solução. Um único `locals` bloco pode declarar todos os valores locais do seu módulo, conforme mostrado no exemplo a seguir.

```
locals {
  moduleName    = "My Module"
  localConfigId = concat("prefix-", var.important_config_setting)
}
```

Lembre-se de que, quando você está acessando o valor, a `locals` palavra-chave se torna singular, como`local.LocalConfigId`.

## Valores de saída
<a name="output-values"></a>

[Se as variáveis de entrada do Terraform forem como CloudFormation parâmetros, você poderia dizer que os [valores de saída do Terraform](https://developer.hashicorp.com/terraform/language/values/outputs) são como CloudFormation saídas.](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) Ambos são usados para expor valores de dentro de uma pilha de implantação. No entanto, como o módulo Terraform está mais enraizado na estrutura da ferramenta, os valores de saída do Terraform também são usados para expor valores dentro de um módulo a um módulo pai ou a outros módulos secundários, mesmo que esses módulos estejam todos na mesma pilha de implantação. Se você estiver criando dois módulos personalizados e o primeiro módulo precisar acessar o valor de ID do segundo módulo, você precisará adicionar o `output` bloco a seguir ao segundo módulo.

```
output "module_id" {
  value = local.module_id
}
Then in the first module you could use it like this:
module "first_module" {
  source = "path/to/first/module"
}

resource "example_resource" "example_resource_name" {
  module_id = module.first_module.module_id
}
```

Como os valores de saída do Terraform podem ser usados na mesma pilha, você também pode usar o `sensitive` atributo em um `output` bloco para impedir que o valor seja exibido na saída da pilha. Além disso, um `output` bloco pode usar `precondition` blocos da mesma forma que as variáveis usam `validation` blocos: para garantir que as variáveis sigam um determinado conjunto de regras. Isso ajuda a garantir que todos os valores em um módulo existam conforme o esperado antes de prosseguir com a implantação.

```
output "important_config_setting" {
  value = var.important_config_setting

  precondition {
    condition     = length(var.important_config_setting) > 0
    error_message = "You forgot to create the terraform.tfvars file again."
  }
}
```