Definición variables en una configuración de Terraform
- Francisco Javier Huete
- Ia c , Cloud
- August 28, 2025
Índice
Una de las grandes ventajas de la Infraestructura como Código (IaC) es que permite crear recursos en proveedores de cloud o en local de forma automática y, sobre todo, replicar los escenarios generados. Para permitir la reutilización de las configuraciones de Terraform es conveniente hacer uso de las variables. En esta entrada se crean diferentes recursos en Oracle Cloud Infrastructure utilizando esta característica de la IaC.
Declaración de variables
El uso de variables tanto en Terraform como en otras herramientas de IaC hace que la configuración que se define en cada proyecto sea más flexible, legible y reutilizable. Para demostrar el funcionamiento de las variables en Terraform, en este post se crean varios recursos en OCI: una VCN y una subnet, un escenario equivalente al definido en una entrada previa en este mismo blog.
En Terraform las variables se declaran en un fichero generalmente llamado variables.tf
aunque, en realidad, la herramienta carga todos los ficheros del directorio terminados en la extensión .tf
cuando va a aplicar una configuración.
Así, en este caso, en el fichero de variables se declaran una variable para el OCID del compartimento en el que se crean los recursos y otra para la región.
variable "compartment_id" {
description = "OCID del compartimento"
type = string
sensitive = true
}
variable "region" {
description = "región del arrendamiento de OCI"
type = string
default = "eu-madrid-1"
}
Cada variable se define con un bloque de tipo variable "<nombre>" {}
. Al menos, el campo type
es obligatorio y, además, es una buena práctica añadir una descripción de la variable en el campo description
. Además, algunas variables se pueden declarar con un valor por defecto que se puede sobrescribir posteriormente usando el campo default
.
Otra opción que se puede usar al declarar una variable es sensitive
. Cuando este campo toma el valor true
, la salida del comando terraform plan
o terraform apply
no mostrará el valor real de esa variable, sino el texto (sensitive value)
.
Definición de variables
Las variables en Terraform se definen en un fichero separado generalmente llamado terraform.tfvars
.
compartment_id = "<OCID del compartimento>"
region = "eu-madrid-1"
Es en este fichero donde da valor a las variables definidas en el fichero variables.tf
y en el que se pueden sobrescribir los valores por defecto configurados en ese fichero de definición de variables.
Una práctica recomendada cuando trabaja con variables en Terraform en directorios que cuentan con control de versiones es excluir los ficheros con extensión .tfvars
de este control de versiones. De esta forma se evita que el contenido sensible quede expuesto en repositorios públicos de control de versiones como GitHub o GitLab.
Referenciar las variables
En el fichero (o los ficheros) de configuración de Terraform las variables se referencian con el formato var.<nombre_variable>
. Así, el fichero para la definición de una VCN y una subred en OCI usando las variables anteriormente definida quedaría de la siguiente forma:
terraform {
required_providers {
oci = {
source = "oracle/oci"
version = "7.15.0"
}
}
}
provider "oci" {
region = var.region
auth = "SecurityToken"
config_file_profile = "terraform-tutorial"
}
resource "oci_core_vcn" "mi_vcn" {
dns_label = "mivcn"
cidr_block = "172.22.0.0/16"
compartment_id = var.compartment_id
display_name = "Mi VCN"
}
resource "oci_core_subnet" "private_subnet" {
vcn_id = oci_core_vcn.mi_vcn.id
cidr_block = "172.22.0.0/24"
compartment_id = var.compartment_id
display_name = "Subred Privada"
prohibit_public_ip_on_vnic = true
dns_label = "privatesubnet"
}
Al planificar o aplicar la configuración se muestra en la salida del comando que terraform ya ha tomado los valores del fichero .tfvars
y los ha aplicado a la configuración definida.
❯ terraform apply
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# oci_core_subnet.private_subnet will be created
+ resource "oci_core_subnet" "private_subnet" {
+ availability_domain = (known after apply)
+ cidr_block = "172.22.0.0/24"
+ compartment_id = (sensitive value)
+ defined_tags = (known after apply)
+ dhcp_options_id = (known after apply)
+ display_name = "Subred Privada"
+ dns_label = "privatesubnet"
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ ipv6cidr_block = (known after apply)
+ ipv6cidr_blocks = (known after apply)
+ ipv6virtual_router_ip = (known after apply)
+ prohibit_internet_ingress = (known after apply)
+ prohibit_public_ip_on_vnic = true
+ route_table_id = (known after apply)
+ security_list_ids = (known after apply)
+ state = (known after apply)
+ subnet_domain_name = (known after apply)
+ time_created = (known after apply)
+ vcn_id = (known after apply)
+ virtual_router_ip = (known after apply)
+ virtual_router_mac = (known after apply)
}
# oci_core_vcn.mi_vcn will be created
+ resource "oci_core_vcn" "mi_vcn" {
+ byoipv6cidr_blocks = (known after apply)
+ cidr_block = "172.22.0.0/16"
+ cidr_blocks = (known after apply)
+ compartment_id = (sensitive value)
+ default_dhcp_options_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_list_id = (known after apply)
+ defined_tags = (known after apply)
+ display_name = "Mi VCN"
+ dns_label = "mivcn"
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ ipv6cidr_blocks = (known after apply)
+ ipv6private_cidr_blocks = (known after apply)
+ is_ipv6enabled = (known after apply)
+ is_oracle_gua_allocation_enabled = (known after apply)
+ security_attributes = (known after apply)
+ state = (known after apply)
+ time_created = (known after apply)
+ vcn_domain_name = (known after apply)
+ byoipv6cidr_details (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
oci_core_vcn.mi_vcn: Creating...
oci_core_vcn.mi_vcn: Creation complete after 0s [id=<OCID de la VCN>]
oci_core_subnet.private_subnet: Creating...
oci_core_subnet.private_subnet: Creation complete after 5s [id=<OCID de la subnet>]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.