

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Comprensión de las variables, los valores locales y los resultados de Terraform
<a name="variables-locals-outputs"></a>

Las variables mejoran la flexibilidad del código al permitir colocar marcadores de posición dentro de los bloques de código. Las variables pueden representar valores diferentes siempre que se reutilice el código. Terraform distingue sus tipos de variables por su alcance modular. Las variables de entrada son valores externos que se pueden inyectar en un módulo, los valores de salida son valores internos que se pueden compartir externamente y los valores locales siempre permanecen dentro de su ámbito original.

## Variables
<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 se pueden configurar y restablecer de una implementación de pila a la siguiente. Del mismo modo, Terraform usa [variables o *variables* de entrada](https://developer.hashicorp.com/terraform/language/values/variables). Las variables se pueden declarar en cualquier parte de un archivo de configuración de Terraform y, por lo general, se declaran con el tipo de datos requerido o el valor predeterminado. Las tres expresiones siguientes son declaraciones de variables de Terraform válidas.

```
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 acceder a la raza de Sparky dentro de la configuración, debes usar la variable. `var.dogs[0].breed` Si una variable no tiene valores predeterminados y no está clasificada como anulable, se debe establecer el valor de la variable para cada implementación. De lo contrario, es opcional establecer un nuevo valor para la variable. En un módulo raíz, puede establecer los valores de las variables actuales en la [línea de comandos](https://developer.hashicorp.com/terraform/language/values/variables#variables-on-the-command-line), como [variables de entorno](https://developer.hashicorp.com/terraform/language/values/variables#environment-variables) o en el archivo [terraform.tfvars](https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files). El siguiente ejemplo muestra cómo introducir valores de variables en el archivo **terraform.tfvars**, que se almacena en el directorio de nivel superior del módulo.

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

random_number = 7

thing_i_made_up = "Kabibble"
```

El valor del archivo **terraform.tfvars de este ejemplo anularía** el valor predeterminado de la declaración de variables. `dogs` Si declaras variables dentro de un módulo secundario, puedes establecer los valores de las variables directamente dentro del bloque de declaración del módulo, como se muestra en el siguiente ejemplo.

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

Algunos de los otros argumentos que puedes usar al declarar una variable son:
+ `sensitive`— Configurarlo para `true` evitar que el valor de la variable quede expuesto en las salidas del proceso de Terraform. 
+ `nullable`— Si se configura de esta manera, se `true` permite que la variable no tenga ningún valor. Esto resulta práctico para las variables en las que no se establece un valor predeterminado.
+ `description`— Añadir una descripción de la variable a los metadatos de la pila.
+ `validation`— Establecer reglas de validación para la variable.

Uno de los aspectos más convenientes de las variables de Terraform es la posibilidad de añadir uno o más objetos de validación dentro de la declaración de variables. Puede usar los objetos de validación para agregar una condición que la variable deba cumplir o, de lo contrario, el despliegue fallará. También puede configurar un mensaje de error personalizado para que se muestre cada vez que se infrinja la condición.

Por ejemplo, estás configurando un archivo de configuración de Terraform que ejecutarán los miembros de tu equipo. Antes de implementar las pilas, un miembro del equipo debe crear un archivo **terraform.tfvars** para establecer un valor de configuración importante. Para recordárselo, puedes hacer algo como lo siguiente.

```
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-'"
  }
}
```

Como se muestra en este ejemplo, puede establecer varias condiciones dentro de una sola variable. Terraform solo muestra los mensajes de error de las condiciones fallidas. De esta forma, puede hacer cumplir todo tipo de reglas sobre los valores de las variables. Si un valor variable provoca un fallo en la canalización, sabrá exactamente por qué.

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

Si hay algún valor dentro de un módulo al que desee asignar un alias, utilice la `locals` palabra clave en lugar de declarar una variable predeterminada que nunca se actualizará. Como su nombre indica, un `locals` bloque contiene términos que se refieren internamente a ese módulo específico. Si quieres transformar un valor de cadena, por ejemplo, añadiendo un prefijo a un valor de variable para usarlo en el nombre de un recurso, usar un valor local puede ser una buena solución. Un solo `locals` bloque puede declarar todos los valores locales del módulo, como se muestra en el siguiente ejemplo.

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

Recuerda que cuando accedes al valor, la `locals` palabra clave pasa a ser singular, por ejemplo`local.LocalConfigId`.

## Valores de salida
<a name="output-values"></a>

[Si las variables de entrada de Terraform son como CloudFormation parámetros, entonces se podría decir que los [valores de salida de Terraform](https://developer.hashicorp.com/terraform/language/values/outputs) son como CloudFormation salidas.](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) Ambos se utilizan para exponer los valores de una pila de despliegue. Sin embargo, dado que el módulo Terraform está más integrado en la estructura de la herramienta, los valores de salida de Terraform también se utilizan para exponer los valores de un módulo a un módulo principal o a otros módulos secundarios, incluso si esos módulos están todos dentro de la misma pila de despliegue. Si estás creando dos módulos personalizados y el primer módulo necesita acceder al valor de ID del segundo módulo, tendrás que añadir el siguiente `output` bloque al 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 los valores de salida de Terraform se pueden usar en la misma pila, también puedes usar el `sensitive` atributo en un `output` bloque para evitar que el valor se muestre en la salida de la pila. Además, un `output` bloque puede usar `precondition` bloques de la misma manera que las variables usan `validation` bloques: para garantizar que las variables sigan un conjunto determinado de reglas. Esto ayuda a garantizar que todos los valores de un módulo existan según lo esperado antes de continuar con la implementación.

```
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."
  }
}
```