Definición variables en una configuración de Terraform

Í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.
comments powered by Disqus

Relacionados

Despliegue de una aplicación en Kubernetes usando Helm

Helm es una herramienta que permite instalar aplicaciones en un cluster de Kubernetes de forma sencilla en pocos pasos.

Leer

Despliegue de un servidor web con contenido persistente en Kubernetes

Para desplegar un servidor o aplicación web que sea persistente, es necesario usar volúmenes en Kubernetes. Para crear un volumen, es necesario contar con un storageClass definido en el cluster. En este caso, como el cluster se ha creado usando Minikube, incluye, por defecto un storageClass estándar de tipo hostpath, que creará los volúmenes que se soliciten al crear un recurso de tipo PersistentVolumeClaim (PVC)

Leer

Configuración NAT en routers Linux en Openstack

En este post se usa una plantilla YAML para crear una red en Openstack y demostrar el funcionamiento del NAT. NAT (Network Address Translation o traducción de direcciones de red) es un mecanismo que consiste en modificar la información de direccionamiento en los paquetes IP que atraviesan un router.

Leer