{"id":23390521,"url":"https://github.com/tty47/terraform_basics","last_synced_at":"2026-01-21T04:02:48.225Z","repository":{"id":107119479,"uuid":"335332952","full_name":"tty47/terraform_basics","owner":"tty47","description":null,"archived":false,"fork":false,"pushed_at":"2022-05-13T10:04:20.000Z","size":38,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-21T21:53:35.308Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tty47.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-02T15:22:37.000Z","updated_at":"2022-04-20T15:05:59.000Z","dependencies_parsed_at":"2023-03-22T18:06:11.718Z","dependency_job_id":null,"html_url":"https://github.com/tty47/terraform_basics","commit_stats":null,"previous_names":["tty47/terraform_basics","jrmanes/terraform_basics"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tty47/terraform_basics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tty47%2Fterraform_basics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tty47%2Fterraform_basics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tty47%2Fterraform_basics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tty47%2Fterraform_basics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tty47","download_url":"https://codeload.github.com/tty47/terraform_basics/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tty47%2Fterraform_basics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28625926,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T02:47:06.670Z","status":"ssl_error","status_checked_at":"2026-01-21T02:45:44.886Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-22T03:31:58.693Z","updated_at":"2026-01-21T04:02:48.203Z","avatar_url":"https://github.com/tty47.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Terraform\n- [Terraform](#terraform)\n  - [Qué es Terraform](#qué-es-terraform)\n    - [Arquitectura](#arquitectura)\n  - [Flujo de trabajo de Terraform.](#flujo-de-trabajo-de-terraform)\n    - [init.](#init)\n    - [validate](#validate)\n    - [plan](#plan)\n    - [apply](#apply)\n    - [refresh](#refresh)\n    - [destroy](#destroy)\n  - [Módulos.](#módulos)\n  - [Componentes de configuración de terraform](#componentes-de-configuración-de-terraform)\n    - [provider](#provider)\n    - [provisioner](#provisioner)\n    - [resource](#resource)\n    - [datasource](#datasource)\n    - [variable](#variable)\n    - [output](#output)\n  - [Referencias, funciones y más](#referencias-funciones-y-más)\n    - [referencias](#referencias)\n    - [Tipos de datos.](#tipos-de-datos)\n    - [Funciones integradas.](#funciones-integradas)\n    - [dynamic blocks](#dynamic-blocks)\n    - [Comentarios de Terraform.](#comentarios-de-terraform)\n## Qué es Terraform\n\nEs una herramienta declarativa de aprovisionamiento que se basa en el paradigma de la infraestructura como código.\n\nEstá diseñado sobre principios de infraestructura inmutable.\n\nCaracterísticas:\n- Es de código abierto\n- Escrito en Golang\n- Utiliza su propia sintaxis: HCL (lenguaje de configuración Hashicorp). También es compatible con JSON\n- Ayuda a evolucionar la infraestructura de forma segura y predecible\n- Aplica la teoría de gráficos a IaaC y proporciona automatización, control de versiones y reutilización\n- Permite adquirir crecursos de múltiples niveles (SaaS / PaaS / IaaS)\n- Un modelo de arquitectura basado en complementos\n- Compatible con todos los principales proveedores cloud\n\n### Arquitectura\n\n![Arquitectura](https://www.datocms-assets.com/2885/1509044297-terraform-google-calendar-plugin-architecture.svg)\n\n## Flujo de trabajo de Terraform.\n\n![Flujo de trabajo](https://st6.io/static/80d3ec377107b7ccb39cd350e0f8a7e6/1d69c/terraform-execution-flow.png)\n\n### init.\n\nInicializa un directorio de trabajo que contiene archivos de configuración de Terraform.\n\nRealiza la inicialización de backend (almacenamiento para archivo de estado terraform).\n\nInstala los módulos del registro terraform a la ruta local.\n\nInstala los complementos del proveedor(es), los complementos se descargan en el subdirectorio del directorio de trabajo actual dentro del directorio .terraform/plugins.\n\nEs seguro ejecutarlo varias veces, para actualizar el directorio de trabajo con los cambios en la configuración.\n\nNo elimina la configuración o el estado existente.\n\n### validate\n\nValida sintácticamente el formato de los archivos de terraform.\n\nVerifica si una configuración es sintácticamente válida e internamente coherente, independientemente de las variables proporcionadas o del estado existente.\n\nSe realiza una verificación de sintaxis en todos los archivos de terraform en el directorio, mostrando un error si alguno de los archivos no se valida.\n\n\n### plan\n\nCrear un plan de ejecución.\n\nCalcula la diferencia entre el último estado conocido y el estado actual, y presenta las diferencias encontradas\n\nNo modifica la infraestructura ni el estado.\n\nPermite al usuario ver qué acciones realizará Terraform antes de realizar cualquier cambio para alcanzar el estado deseado.\n\nEscaneará todos los *.tf  archivos en el directorio y creará el plan.\n\n### apply\n\nAplicar los cambios necesarios para alcanzar el estado deseado.\n\nEscanea el directorio actual en busca de la configuración y aplica los cambios de manera apropiada.\n\nModificará la infraestructura y el estado.\n\nSi un recurso se crea correctamente pero falla durante el aprovisionamiento, Terraform producirá un error y marcará el recurso como \"tainted\".\n\nTerraform no revierte y destruye automáticamente un recurso si hay un error en el provisionamiento, porque eso iría en contra del plan de ejecución: el plan de ejecución dice que se cree un recurso, pero no dice que se elimine.\n\n### refresh\n\nUtilizado para syncronizar el estado que conoce Terraform (a través de su archivo de estado) con la infraestructura real.\n\nNo modifica la infraestructura, pero modifica el archivo de estado.\n\n### destroy\n\nDestruye la infraestructura y todos los recursos.\n\nModifica tanto el estado como la infraestructura.\n\n## Módulos.\n\nPermiten la reutilización de código.\n\nAdmiten el control de versiones para mantener la compatibilidad.\n\nAlmacenan el código de forma remota.\n\nPermiten la encapsulación con todos los recursos separados en un bloque de configuración.\n\nLos módulos se pueden anidar dentro de otros módulos, lo que le permite activar rápidamente entornos completamente separados.\n\nPuede ser referido usando el atributo source.\n\nAdmite módulos locales y remotos.\n\nLos módulos locales se almacenan junto con la configuración de Terraform (en un directorio separado, fuera de cada entorno pero en el mismo repositorio).\n\nLos módulos remotos se almacenan externamente en un repositorio separado y admiten control de versiones.Terraform admite los siguientes backends:\n- Registro de Terraform.\n- GitHub.\n- Bitbucket.\n- Git genérico, repositorios de Mercurial.\n- URL HTTP.\n- Buckets S3.\n- Buckets de GCS.\n\nMás información: https://www.terraform.io/docs/language/syntax/configuration.html\n\n## Componentes de configuración de terraform \n\n### provider\n\nSon responsables de comprender las interacciones de la API y exponer los recursos.\n\nProporcionan una capa de abstracción por encima de la API.\n\nTerraform admite múltiples instancias de proveedores.\n\nSe puede integrar con cualquier API utilizando el marco de proveedores.\n\nMás información: https://www.terraform.io/docs/language/syntax/configuration.html\n\n### provisioner\n\nPermiten ejecutar código de forma local o remota durante la creación o borrado de recursos.\n\nEl ejecutor local (local_exec) ejecuta código en la máquina que ejecuta terraform.\n\nEl ejecutor remoto (remote_exec) se ejecuta en el recurso aprovisionado. Se conecta mediante ssh o winrm, y requiere una lista de comandos para ejecutar en una terminal.\n\nSi falla la ejecución del ejecutor, se dara el aprovisionamiento como fallido. Este comportamiento se puede anular configurando on_failure al valor to continue.\n\nMás información: https://www.terraform.io/docs/language/syntax/configuration.html\n\n### resource\n\nSon el elemento más importante en el lenguaje Terraform, y describen uno o más objetos de infraestructura, como instancias, etc.\n\nJuntos, el tipo de recurso y el nombre sirven como un identificador para un recurso y deben ser únicos dentro de un mñodulo.\n\nMás información: https://www.terraform.io/docs/language/syntax/configuration.html#\n\n### datasource\n\nPermiten extaer datos para su uso en cualquier otro lugar de la configuración de Terraform.\n\nPermiten que una configuración de Terraform haga uso de información definida fuera de Terraform.\n\nMás información: https://www.terraform.io/docs/language/data-sources/index.html\n\n### variable\n\nSirven como parámetros para un módulo de Terraform y actúan como argumentos de función.\n\nPermiten personalizar aspectos del módulo sin alterar el código fuente propio del módulo, y permite que los módulos se compartan entre diferentes configuraciones.\n\nSe puede definir de varias formas.\n- Mediante línea de comando: -var=\"nombre=valor\".\n- Mediante archivos de definición de variables .tfs o .tfvars. \n- Las variables de entorno se pueden usar para establecer variables usando el formato TF_VAR_name.\n\nMás información: https://www.terraform.io/docs/language/values/variables.html\n\n### output\n\nSon como valores de retorno de funciones.\n\nLa salida se puede marcar como que contiene material sensible utilizando el argumento opcional sensitive, que evita que Terraform muestre su valor en la salida. Sin embargo, esto no evita que se almacenen en el estado como texto plano.\n\nEn un módulo principal, las salidas de los módulos secundarios están disponibles en expresiones como  module.\u003cMODULE NAME\u003e.\u003cOUTPUT NAME\u003e.\n\nMás infomación: https://www.terraform.io/docs/language/values/outputs.html\n\n## Referencias, funciones y más \n\n### referencias\n\nSon expresiones que hace referencia al valor asociado para un recurso.\n\nMás información: https://www.terraform.io/docs/language/expressions/references.html\n\n### Tipos de datos.\nAdmite los siguientes tipos de datos:\n- string\n- number\n- bool\n- list - una secuencia de valores identificados por números enteros consecutivos que comienzan con cero.\n- map - una colección de valores donde cada uno está identificado por una etiqueta de texto.\n- set - una colección de valores únicos que no tienen identificadores secundarios ni orden.\n\nMás información: https://www.terraform.io/docs/language/expressions/types.html\n\n### Funciones integradas.\n\nTerraform incluye una serie de funciones integradas que pueden ser llamadas desde dentro de las expresiones para transformar y combinar los valores para, por ejemplo min, max, file, concat, element, index, lookupetc.\n\nTerraform no admite funciones definidas por el usuario.\n\nMás información: https://www.terraform.io/docs/language/syntax/configuration.html\n\n### dynamic blocks\n\nActúan como una expresión for, pero producen bloques anidados.\n\nItera sobre un valor complejo dado y genera un bloque anidado para cada elemento de ese valor complejo.\n\nMás información: https://www.terraform.io/docs/language/expressions/dynamic-blocks.html\n\n### Comentarios de Terraform.\n\nAdmite tres sintaxis diferentes para comentarios:\n\n- \\# comentario\n- // comentario\n- /* comentario */\n\n\n---\n\n# terraform_basics\n\n## [PART 1](https://github.com/jrmanes/terraform_basics/tree/main/part_01_basic)\nBasic [HCL](https://www.terraform.io/docs/language/syntax/configuration.html) language use, variables, project structure.\n\n\n## [PART 2](https://github.com/jrmanes/terraform_basics/tree/main/part_02_provisioneres)\nProvisioners part, how to inject commands, scripts, ansible playbooks, etc..\n\n\n## [PART 3](https://github.com/jrmanes/terraform_basics/tree/main/part_03_modules)\n\nIn Part 3, we will see how to create a module, use it and improve the variables validation.\n\n### Module for Docker containers\n\nThis module is created with the pourpose to create docker containers.\n\n### Requirements\n\n```terraform\n    container_name = \"name\"\n    image_name = \"image to download\"\n    image_version = \"version to download\"\n    container_ports = [\n        {\n            internal = 80\n            external = 80\n            protocol = \"tcp\"\n        }\n    ]\n```\n\n### Outputs\n\n- ```image_id```: ***Image*** ID\n- ```hostname```: ***Container*** hostname\n- ```ip_address```: ***Container's*** ip address\n- ```id```: ***Container's*** ID\n\n### Variables\n\n| Variables | Description | Must|\n|-|-|-|\n|container_name|Name of the image that we will use|YES|\n|image_name|Name of the image that we will use|YES|\n|image_version|Version for the image that we will use|NO|\n|container_ports|Ports needed for the container|YES|\n\n\n## [PART 4](https://github.com/jrmanes/terraform_basics/tree/main/part_04_ec2)\nAWS EC2 basic instance and module\n\n## [PART 5](https://github.com/jrmanes/terraform_basics/tree/main/part_05_aws)\nAWS EC2 instance, security_groups and ssh keys\n\n## [PART 6](https://github.com/jrmanes/terraform_basics/tree/main/part_06_aws_soanrqube)\nAWS EC2 instance, security_groups and ssh keys\nSonarQube with PSQL in two instances\n\n--- \n\n## TODO\n  - [ ] Add GCP\n    - [ ] Instances\n    - [ ] VPC/Networking\n    - [ ] Modules\n\n---\nJose Ramón Mañes\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftty47%2Fterraform_basics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftty47%2Fterraform_basics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftty47%2Fterraform_basics/lists"}