sábado, abril 20, 2024
No menu items!
InicioBlogsUna introducción a Terraform para principiantes – Tutorial de Terraform

Una introducción a Terraform para principiantes – Tutorial de Terraform

Se pregunta, ¿qué es Terraform? Averigüémoslo.

Infraestructura como código (IaC) es una terminología muy extendida entre los profesionales de DevOps. Es el proceso de administrar y aprovisionar la infraestructura de TI completa (comprende máquinas físicas y virtuales) utilizando archivos de definición legibles por máquina. Es un enfoque de ingeniería de software hacia las operaciones. Ayuda a automatizar el centro de datos completo mediante el uso de scripts de programación.

Con todas las funciones que proporciona Infraestructura como código, tiene múltiples desafíos:

Necesita aprender a programar No conoce el impacto del cambio. Necesita revertir el cambio. No puede rastrear los cambios. No puede automatizar un recurso. Múltiples entornos para infraestructura.

Terraform ha sido creado para resolver estos desafíos.

¿Qué es Terraform?

Terraform es una infraestructura de código abierto como herramienta de código desarrollada por HashiCorp. Se utiliza para definir y aprovisionar la infraestructura completa utilizando un lenguaje declarativo fácil de aprender.

Es una herramienta de aprovisionamiento de infraestructura donde puede almacenar la configuración de su infraestructura en la nube como códigos. Es muy similar a herramientas como CloudFormation, que usaría para automatizar su infraestructura de AWS, pero solo puede usarla en AWS. Con Terraform, también puede usarlo en otras plataformas en la nube.

A continuación se presentan algunos de los beneficios de usar Terraform.

Hace orquestación, no solo administración de configuración Admite múltiples proveedores como AWS, Azure, GCP, DigitalOcean y muchos más Proporciona una infraestructura inmutable donde la configuración cambia sin problemas Usa lenguaje fácil de entender, HCL (lenguaje de configuración de HashiCorp) Fácilmente portátil a cualquier otro proveedor Admite arquitectura solo de cliente, por lo que no necesidad de una gestión de configuración adicional en un servidor

Conceptos básicos de Terraform

A continuación se encuentran los conceptos/terminologías centrales utilizados en Terraform:

Variables: También se utiliza como variable de entrada, es un par clave-valor utilizado por los módulos de Terraform para permitir la personalización.Proveedor: Es un complemento para interactuar con las API del servicio y acceder a sus recursos relacionados.Módulo: Es una carpeta con plantillas de Terraform donde se definen todas las configuracionesEstado: Consiste en información en caché sobre la infraestructura administrada por Terraform y las configuraciones relacionadas.Recursos: Hace referencia a un bloque de uno o más objetos de infraestructura (instancias informáticas, redes virtuales, etc.), que se utilizan para configurar y administrar la infraestructura.Fuente de datos: Lo implementan los proveedores para devolver información sobre objetos externos a terraform.Valores de salida: estos son valores de retorno de un módulo de terraformación que pueden ser utilizados por otras configuraciones.Plan: Es una de las etapas donde determina qué se necesita crear, actualizar o destruir para pasar del estado real/actual de la infraestructura al estado deseado.Aplicar: Es una de las etapas donde se aplican los cambios de estado real/actual de la infraestructura para pasar al estado deseado.

Ciclo de vida de Terraform

El ciclo de vida de Terraform consiste en: en eso, plan, aplicary destruir.

ciclo de vida de terraformación - geekflare

Terraform init inicializa el directorio de trabajo que consta de todos los archivos de configuración Terraform plan se utiliza para crear un plan de ejecución para alcanzar el estado deseado de la infraestructura. Los cambios en los archivos de configuración se realizan para lograr el estado deseado. Terraform apply luego realiza los cambios en la infraestructura como se define en el plan, y la infraestructura llega al estado deseado. Terraform destroy se usa para eliminar todos los recursos de infraestructura antiguos , que se marcan como corruptos después de la fase de aplicación.

¿Cómo funciona Terraform?

Terraform tiene dos componentes principales que componen su arquitectura:

arquitectura terraform - geekflare

Núcleo de terraformación

El núcleo de Terraform utiliza dos fuentes de entrada para hacer su trabajo.

los primero La fuente de entrada es una configuración de Terraform que usted, como usuario, configura. Aquí, define lo que debe crearse o aprovisionarse. Y el segundo la fuente de entrada es un estado en el que terraform mantiene el estado actualizado de cómo se ve la configuración actual de la infraestructura.

🔥 Leer:  Elementos de enlace de la última época en el chat: su guía rápida para compartir equipo

Entonces, lo que hace terraform core es tomar la entrada y determinar el plan de lo que se debe hacer. Compara el estado, cuál es el estado actual y cuál es la configuración que desea en el resultado final. Calcula lo que se debe hacer para llegar al estado deseado en el archivo de configuración. Calcula lo que debe crearse, lo que debe actualizarse, lo que debe eliminarse para crear y aprovisionar la infraestructura.

proveedores

El segundo componente de la arquitectura son los proveedores de tecnologías específicas. Estos podrían ser proveedores de la nube como AWS, Azure, GCP u otra infraestructura como plataforma de servicio. También es un proveedor de más componentes de alto nivel como Kubernetes u otras herramientas de plataforma como servicio, incluso algún software como herramienta de autoservicio.

Te da la posibilidad de crear infraestructura en diferentes niveles.

Por ejemplo, cree una infraestructura de AWS, luego implemente Kubernetes encima de ella y luego cree servicios/componentes dentro de ese clúster de Kubernetes.

Terraform tiene más de cien proveedores para diferentes tecnologías, y cada proveedor otorga a los usuarios de terraform acceso a sus recursos. Entonces, a través del proveedor de AWS, por ejemplo, tiene acceso a cientos de recursos de AWS como instancias EC2, los usuarios de AWS, etc. Con el proveedor de Kubernetes, accede a productos básicos, recursos como servicios e implementaciones y espacios de nombres, etc.

Entonces, así es como funciona Terraform, y de esta manera, intenta ayudarlo a aprovisionar y cubrir la configuración completa de la aplicación desde la infraestructura hasta la aplicación.

Hagamos algunas cosas prácticas. 👨‍💻

Instalaremos Terraform en Ubuntu y aprovisionaremos una infraestructura muy básica.

Instalar Terraform

Descarga el último paquete de terraform.

Consulte la página de descarga oficial para obtener la última versión para el sistema operativo respectivo.

[email protected]:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
--2020-08-14 16:55:38--
https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.153.183, 2a04:4e42:24::439
Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 34851622 (33M) [application/zip]
Saving to: ‘terraform_0.13.0_linux_amd64.zip’

terraform_0.13.0_linux_amd64.zip
100%[=================================================================>] 33.24M
90.3KB/s in 5m 28s

2020-08-14 17:01:06 (104 KB/s) - ‘terraform_0.13.0_linux_amd64.zip’ saved [34851622/34851622]

Extraiga el paquete descargado.

[email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
Archive:
terraform_0.13.0_linux_amd64.zip
inflating: terraform

Mueva el archivo ejecutable de terraform a la ruta que se muestra a continuación. Compruebe la versión de terraformación.

[email protected]:~$ sudo mv terraform /usr/local/bin/
[sudo] password for geekflare:
[email protected]:~$ terraform -v
Terraform v0.13.0

Puede ver que estos son los comandos disponibles en terraform para su ejecución.

[email protected]:~$ terraform
Usage: terraform [-version] [-help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
destroy Destroy Terraform-managed infrastructure
env Workspace management
fmt Rewrites config files to canonical format
get Download and install modules for the configuration
graph Create a visual graph of Terraform resources
import Import existing infrastructure into Terraform
init Initialize a Terraform working directory
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Read an output from a state file
plan Generate and show an execution plan
providers Prints a tree of the providers used in the configuration
refresh Update local state file against real resources
show Inspect Terraform state or plan
taint Manually mark a resource for recreation
untaint Manually unmark a resource as tainted
validate Validates the Terraform files
version Prints the Terraform version
workspace Workspace management

All other commands:
0.12upgrade Rewrites pre-0.12 module source code for v0.12
0.13upgrade Rewrites pre-0.13 module source code for v0.13
debug Debug output management (experimental)
force-unlock Manually unlock the terraform state
push Obsolete command for Terraform Enterprise legacy (v1)
state Advanced state management

Aprovisione la instancia EC2 de AWS con Terraform

En esta demostración, voy a lanzar una nueva instancia AWS EC2 usando Terraform.

Cree un directorio de trabajo para esta demostración de Terraform.

[email protected]:~$ mkdir terraform_demo

Vaya al directorio y cree un archivo de configuración de terraform donde defina el proveedor y los recursos para lanzar una instancia de AWS EC2.

[email protected]:~$ cd terraform_demo/
[email protected]:~/terraform_demo$ gedit awsec2.tf

provider "aws" {
access_key = "B5KG6Fe5GUKIATUF5UD"
secret_key = "R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H"
region = "us-west-2"
}

resource "aws_instance" "terraform_demo" {
ami = "ami-0a634ae95e11c6f91"
instance_type = "t2.micro"
}

Nota: he cambiado las claves de acceso y secretas 😛, debes usar las tuyas.

🔥 Leer:  Cómo habilitar Windows 11 Auto HDR para juegos

De la configuración mencionada anteriormente, puede ver que estoy mencionando el proveedor como AWS. Dentro del proveedor, doy las credenciales de usuario de AWS y las regiones donde se debe lanzar la instancia.

En recursos, doy detalles de AMI de Ubuntu (ami-0a634ae95e11c6f91) y menciono que el tipo de instancia debe ser t2.micro

Puede ver lo fácil y legible que es el archivo de configuración, incluso si no es un codificador empedernido.

inicio de terraformación

Ahora, el primer paso es inicializar terraform.

[email protected]:~/terraform_demo$ terraform init

Initializing the backend...

Initializing provider plugins...
- Using previously-installed hashicorp/aws v3.2.0

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.

* hashicorp/aws: version = "~> 3.2.0"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

plan de terraformación

La siguiente es la etapa del plan; creará el gráfico de ejecución para crear y aprovisionar la infraestructura.

[email protected]:~/terraform_demo$ terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Aplicar terraformación

La etapa de aplicación ejecutará el archivo de configuración y lanzará una instancia de AWS EC2. Cuando ejecute el comando de aplicación, le preguntará: “¿Desea realizar estas acciones?”, Debe escribir sí y presionar enter.

[email protected]:~/terraform_demo$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

# aws_instance.terraform_demo will be created
+ resource "aws_instance" "terraform_demo" {
+ ami = "ami-0a634ae95e11c6f91"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
+ outpost_arn = (known after apply)
+ password_data = (known after apply)
+ placement_group = (known after apply)
+ primary_network_interface_id = (known after apply)
+ private_dns = (known after apply)
+ private_ip = (known after apply)
+ public_dns = (known after apply)
+ public_ip = (known after apply)
+ secondary_private_ips = (known after apply)
+ security_groups = (known after apply)
+ source_dest_check = true
+ subnet_id = (known after apply)
+ tenancy = (known after apply)
+ volume_tags = (known after apply)
+ vpc_security_group_ids = (known after apply)

+ ebs_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ snapshot_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}

+ ephemeral_block_device {
+ device_name = (known after apply)
+ no_device = (known after apply)
+ virtual_name = (known after apply)
}

+ metadata_options {
+ http_endpoint = (known after apply)
+ http_put_response_hop_limit = (known after apply)
+ http_tokens = (known after apply)
}

+ network_interface {
+ delete_on_termination = (known after apply)
+ device_index = (known after apply)
+ network_interface_id = (known after apply)
}

+ root_block_device {
+ delete_on_termination = (known after apply)
+ device_name = (known after apply)
+ encrypted = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ volume_id = (known after apply)
+ volume_size = (known after apply)
+ volume_type = (known after apply)
}
}

Plan: 1 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

aws_instance.terraform_demo: Creating...
aws_instance.terraform_demo: Still creating... [10s elapsed]
aws_instance.terraform_demo: Still creating... [20s elapsed]
aws_instance.terraform_demo: Still creating... [30s elapsed]
aws_instance.terraform_demo: Still creating... [40s elapsed]
aws_instance.terraform_demo: Creation complete after 44s [id=i-0eec33286ea4b0740]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Vaya a su panel de AWS EC2 y verá que se ha creado una nueva instancia con el ID de instancia mencionado al final del comando de aplicación.

🔥 Leer:  Las 5 mejores CDN de imágenes para WordPress en 2024
terraform aws ec2 - geekflare

Ha lanzado con éxito una instancia de AWS EC2 utilizando Terraform.

terraformar destruir

Finalmente, si desea eliminar la infraestructura, debe ejecutar el comando destroy.

[email protected]:~/terraform_demo$ terraform destroy
aws_instance.terraform_demo: Refreshing state... [id=i-0eec33286ea4b0740]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy

Terraform will perform the following actions:

# aws_instance.terraform_demo will be destroyed
- resource "aws_instance" "terraform_demo" {
- ami = "ami-0a634ae95e11c6f91" -> null
- arn = "arn:aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740" -> null
- associate_public_ip_address = true -> null
- availability_zone = "us-west-2c" -> null
- cpu_core_count = 1 -> null
- cpu_threads_per_core = 1 -> null
- disable_api_termination = false -> null
- ebs_optimized = false -> null
- get_password_data = false -> null
- hibernation = false -> null
- id = "i-0eec33286ea4b0740" -> null
- instance_state = "running" -> null
- instance_type = "t2.micro" -> null
- ipv6_address_count = 0 -> null
- ipv6_addresses = [] -> null
- monitoring = false -> null
- primary_network_interface_id = "eni-02a46f2802fd15634" -> null
- private_dns = "ip-172-31-13-160.us-west-2.compute.internal" -> null
- private_ip = "172.31.13.160" -> null
- public_dns = "ec2-34-221-77-94.us-west-2.compute.amazonaws.com" -> null
- public_ip = "34.221.77.94" -> null
- secondary_private_ips = [] -> null
- security_groups = [
- "default",
] -> null
- source_dest_check = true -> null
- subnet_id = "subnet-5551200c" -> null
- tags = {} -> null
- tenancy = "default" -> null
- volume_tags = {} -> null
- vpc_security_group_ids = [
- "sg-b5b480d1",
] -> null

- credit_specification {
- cpu_credits = "standard" -> null
}

- metadata_options {
- http_endpoint = "enabled" -> null
- http_put_response_hop_limit = 1 -> null
- http_tokens = "optional" -> null
}

- root_block_device {
- delete_on_termination = true -> null
- device_name = "/dev/sda1" -> null
- encrypted = false -> null
- iops = 100 -> null
- volume_id = "vol-0be2673afff6b1a86" -> null
- volume_size = 8 -> null
- volume_type = "gp2" -> null
}
}

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

aws_instance.terraform_demo: Destroying... [id=i-0eec33286ea4b0740]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 10s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 20s elapsed]
aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 30s elapsed]
aws_instance.terraform_demo: Destruction complete after 34s

Destroy complete! Resources: 1 destroyed.

Si vuelve a comprobar el panel de control de EC2, verá que la instancia se canceló.

terraform aws ec2 destruido - geekflare

Conclusión

Creo que lo anterior le da una idea para comenzar con Terraform. Continúe y pruebe el ejemplo que acabo de mostrar.

También debe consultar este software de automatización de infraestructura.

Si está interesado en obtener más información, le sugiero que consulte el curso Learning DevOps with Terraform.

Recomendamos

Populares