https://github.com/diocrafts/terraform
https://github.com/diocrafts/terraform
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/diocrafts/terraform
- Owner: DioCrafts
- Created: 2022-02-12T13:36:45.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-02-12T13:40:17.000Z (over 3 years ago)
- Last Synced: 2025-03-31T14:43:28.113Z (6 months ago)
- Language: HCL
- Size: 21.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Terraform
Infraestructura como codigo (IAC)## Capitulo 1
Es una practica que utiliza principios de desarrollo de software buscando automatizar los procesos de crear infraestructura.
Los principios que siguen son:
- Se puede reproducir facilmente (Si tengo archivo de definicion se puede automatizar)
- Son desechables
- Los sistemas son consistentes (Se deberia reflejar lo que se definido)
- Son repetibles
- El diseño siempre esta cambiando (Si ya se tiene definido es mas facil hacer cambios)Practicas generales
- Utilizar archivos de definicion
- Sistemas y procesos documentados (Podemos reutilizar el codigo)
- Versionar todas las cosas (Trazar los cambios que se hacen)
- Preferir cambios pequeños (practica de la metodologia agil, para no impactar)
- Mantener los servicios continuamente disponibles## Capitulo 2
Tipos de herramientas para implementar IAC
Herramientas para definicion de infraestructura: Permiten especificar que recursos de infraestructura desean crear y como deben configurarse
Archivos de definicion de configuracion: Utiles para impulsar la automatizacion
Ejemplo:
> Crea una subnet y una instancia en AWS
Herramientas para configuracion de servidores: Permiten configurar los servidores con el estado deseado
Aprovisionamiento: Es el proceso que permite que un elemento este listo para usar, Ejemplo tener todas las dependencias ya listas.
Diferentes enfoques para la gestion de servidores
- Configuracion de servidores (desde un archivo de definicion)
- Empaquetar plantillas de servidores (Por ejemplo snapshots)
- Ejecutar comandos en los servidores (de forma remoto)
- Configuracion desde un registro centralFactores a tomar en cuenta para elegir una herramienta
- Modo desatendido para herramientas de lineas de comando ()
- Idempotencia (ejecutar un script n veces sin error)
- Parametrizable (Para reutirlizar las definiciones que creamos)Objetivos de la gestion automatizada de servidores
- Un nuevo servidor puede ser aprovisionado a demanda
- Un nuevo servidor puede ser aprovisionado sin intervencion humana
- Cada cambio puede ser aplicado a un conjunto de servidores.Herramientas para definir y configurar infraestructura
Definicion de infraestructura:
- Terraform (Se puede usar en varios proveedores de nube)
- Cloud Formation (Solo AWS)
- Open stack heat (Solo OpenStack)Configuracion de Servidores:
- Ansible
- Chef
- Puppet## Capitulo 3
Beneficios de la IAC
- Creacion rapida bajo demanda (con los archivos de configuracion)
- Automatizacion (creacion y configuracion sin intervencion humana)
- Visibilidad y trazabilidad, todos los cambios quedan registrados (registro de cambios a traves de control de versiones)
- Ambientes homogeneos, una misma definicion permite crear varios ambientes (crear varios ambientes a partir de las mismas configuraciones)
- Facil de testear (Existen herramientas para testear la creacion y configuracion)
## Capitulo 4
¿Que es Terraform?
- Open Source
- Creado por Hashicorp
- Desarrollado en Go
- Crear y administrar infraestructura¿Como funciona?
Terraform interactua con las APIs de los proveedores de nube publica(GCP,AWS,Azure) o privada(Openstack, vsphere)Caracteristicas clave de terraform
- Es una herramienta de infraestructura como codigo
- Tiene planes de ejecucion (tiene un comando para planificar)
- Facil de automatizar## Capitulo 5
Terraform vs otras herramientas de IAC**Creacion y configuración de infraestructura**
**Ansible:** Para gestion de las configuraciones
**Terraform:** Para administrar la infraestructura
**Infraestructura mutable:** Es cuando el estado de un servidor cambia
> Ejemplo: cuando se lanza la nueva version y el aplicativo lo enlaza todo en el mismo servidor
**Infraestructura inmutable:** Es cuando se destruye un servidor y se crea uno nuevo con los cambios
> Ejemplo: La instancia A es la version antigua que se elimina y la instancia B es la nueva version que se implementa en otro servidor.

**Lenguaje declarativo:** Le decimos a nuestra herramienta que hacer
> Ejemplo: En Terraform si le digo que cree 15 instancias y previamente ya creo 10 entonces solo crea 5 instancias mas

**Lenguaje procedural o imperativo:** Le decimos especificamente como hacerlo
> Ejemplo: En cambio en Ansible si le digo que me cree 15 instancias y ya existe 10 creadas anteriormente, lo que hace Ansible es crear 15 instancias

## Capitulo 6
Herramientas para construir infraestructura inmutable
**Packer:** Es una herramienta creada por hashicorp para crear imagenes en cualquier nube,
usa formato JSON
variables: aca definimos las variables que vamos a utilizar, se puede tomar variables de entorno
builders: definimos de donde vamos a construir nuestra iamgen base
provisioners: aca personalizamos nuestra imagen, añadir paquetes, crear directorios, actualizar paquetes.
post-processor: podemos tener archivos de salida y ejecutar comandos despues de haber creado la infraestructura, todo corre de manera local
## Capitulo 7
**Instalacion de Terraform:**
Una vez descargado el instalador se debe guardar en una ruta, en la variable de entorno de windows PATH la modificamos

Y ponemos la ruta

**Instalacion de Packer:**
Como ya se realizo el proceso con Terraform ahora solo guardamos el instalador de packer en la misma ruta que el terraform
Otra manera es instalar packer por medio de chocolatey que es un "open-source package management system para Windows"
Para validar en el powershell ejecutaremos los comandos:
`terraform version`
`packer version`

## Capitulo 8
Credenciales de AWS en Windows (Previamente ya deberias tener un cuenta AWS para seguir con lo indicado)
https://portal.aws.amazon.com/billing/signup#/start
Se debe crear un usuario en IAM de AWS

Y darle los permisos respectivos


Se crea sin etiquetas
Descargamos el archivo csv con las credenciales

En windows se crea un archivo credentials con el Powershell
`PS C:\users\usuario> mkdir .aws`
`PS C:\users\usuario> cd .\.aws\`
En esta ruta se crea el archivo creddentials
`PS C:\users\usuario\.aws>`
En amazon hay una guia para configurar las credenciales
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.htmlreemplazamos los valores de access_key y scret_keys por los valores del archivo csv que guardamos anteriormente
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY## Capitulo 9
[Packer Demo](https://github.com/muchikon/terraform/tree/master/demo-packer "Packer Demo")
## Capitulo 10
**Docker: Conceptos Clave**
Docker es una herramienta que nos permite crear infraestructura inmutable permitiéndonos encapsular y portar nuestras aplicaciones en una misma imagen logrando que instanciemos la misma imagen la cantidad de veces que queramos.
Imagen: Es una capa creada a partir de un archivo Dockerfile donde definimos la imagen base, todos los paquetes que vayamos a utilizar, directorios, etc.
Container: Un container es una instancia de una imagen de Docker. No tienen estado, no deben guardar ningún tipo de información.
Ejemplo de archivo dockerfile

## Capitulo 11
[Docker Demo](https://github.com/muchikon/terraform/tree/master/demo-docker "Docker Demo")
## Capitulo 12
Instalar terraform y configurar una cuenta de AWS, se vio en capitulos anteriores
## Capitulo 13
[Terraform1 Demo](https://github.com/muchikon/terraform/tree/master/demo-terraform1 "Terraform1 Demo")
## Capitulo 14
Lista de proveedores Terraform:
https://www.terraform.io/docs/providers/index.html
## Capitulo 15
[Archivos de definicion y variables](https://github.com/muchikon/terraform/tree/master/variables "Archivos de definicion y variables")
## Capitulo 16
[Interpolacion, condiciones y ciclos](https://github.com/muchikon/terraform/tree/master/interpolacion "Interpolacion, condiciones y ciclos")
## Capitulo 17
[Security groups](https://github.com/muchikon/terraform/tree/master/interpolacion "Security groups")
## Capitulo 18
**Archivo de estados**
Terraform utiliza un estado donde almacena todas las configuraciones que vayas realizando, este archivo se llama `terraform.tfstate`. Este archivo en formato JSON contiene toda la información respecto a nuestra infraestructura, tambien almacena las credenciales
Debemos tener cuidado al manejar información sensible si utilizamos nuestro archivo sin encriptación ya que toda la información es visible.
## Capitulo 19
**Archivo de Backends**
Terraform permite almacenar el estado de manera remota a través de Backends. Podemos almacenarlo en diferentes servicios de storage en la nube como S3, GCP,Azure,etc.
Entre sus muchas ventajas que trae el trabajar con backends son:
* Es más fácil trabajar en equipo. (Tenemos el archivo centralizado)
* Facilita la integración continua.
* Mayor disponibilidad.Los tipos de backend soportados por terraform son:
https://www.terraform.io/docs/backends/types/index.html
Algunos de ellos no tienen encriptacion.Ejemplo con S3
```
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/my/key"
region = "us-east-1"
}
}
```## Capitulo 20
**[Creacion de backend](https://github.com/muchikon/terraform/tree/master/demo-backend1 "Creacion de backend")**
## Capitulo 21
[**Encriptado del backend**](https://github.com/muchikon/terraform/tree/master/demo-backend2 "**Encriptado del backend**")
## Capitulo 22
**Tips de la vida real: Trabajo en equipo con backends**
* Es una buena práctica tener el archivo de estado almacenado y versionado en algún Cloud Provider.
* Encriptar nuestro archivo de estado.
* Versionar nuestro backend.## Capitulo 23
[**Modulos locales**](https://github.com/muchikon/terraform/tree/master/modulos-locales "**Modulos locales**")
## Capitulo 24
[**Modulos remotos**](https://github.com/muchikon/terraform/tree/master/modulos-remotos "**Modulos remotos**")
## Capitulo 25 y 26
[**Provisioners**](https://github.com/muchikon/terraform/tree/master/provisioners "**Provisioners**")