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:
- Necesito aprender a codificar
- No sé el impacto del cambio.
- Necesito revertir el cambio
- No puedo rastrear los cambios
- No se puede automatizar un recurso
- Múltiples entornos para infraestructura
Terraform ha sido creado para resolver estos desafíos.
¿Qué es Terraform?
Terraformar 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 Formación de nubes, que usaría para automatizar su infraestructura de AWS, pero solo puede usar eso 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.
- ¿La orquestación, no solo la gestión de la configuración?
- Admite múltiples proveedores como AWS, Azure, GCP, DigitalOcean y muchos más
- Proporcione una infraestructura inmutable donde la configuración cambia sin problemas
- Utiliza un lenguaje fácil de entender, HCL (lenguaje de configuración de HashiCorp)
- Fácilmente portátil a cualquier otro proveedor
- Admite la arquitectura de solo cliente, por lo que no es necesario administrar la configuración adicional en un servidor
Tabla de contenido
Conceptos básicos de Terraform
A continuación se encuentran los conceptos/terminologías centrales utilizados en Terraform:
- Variables: también utilizadas como variables 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 configuraciones
- Estado: Consiste en información en caché sobre la infraestructura administrada por Terraform y las configuraciones relacionadas.
- Recursos: se refiere 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 lo que 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: iniciar, planificar, aplicar y destruir.
- Terraform init inicializa el directorio de trabajo que consta de todos los archivos de configuración
- El plan Terraform 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.
- Luego, Terraform apply realiza los cambios en la infraestructura como se define en el plan, y la infraestructura llega al estado deseado.
- Terraform destroy se utiliza para eliminar todos los recursos de infraestructura antiguos, que se marcan como contaminados después de la fase de aplicación.
¿Cómo funciona Terraform?
Terraform tiene dos componentes principales que componen su arquitectura:
Núcleo de terraformación
El núcleo de Terraform utiliza dos fuentes de entrada para hacer su trabajo.
La primera fuente de entrada es una configuración de Terraform que usted, como usuario, configura. Aquí, define lo que debe crearse o aprovisionarse. Y la segunda 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.
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.
Referirse a pagina oficial de descarga 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 kirukiru.es: [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.
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.
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ó.
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 Curso de aprendizaje de DevOps con Terraform.