Infraestructura como codigo (IAC)
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
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 central
Factores 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
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)
¿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
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
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
Instalacion de Terraform: https://www.terraform.io/downloads.html
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
https://www.packer.io/downloads.html
Otra manera es instalar packer por medio de chocolatey que es un "open-source package management system para Windows" https://learn.hashicorp.com/tutorials/packer/getting-started-install
Para validar en el powershell ejecutaremos los comandos:
terraform version
packer version
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.html
reemplazamos 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
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
Instalar terraform y configurar una cuenta de AWS, se vio en capitulos anteriores
Lista de proveedores Terraform: https://www.terraform.io/docs/providers/index.html
Archivos de definicion y variables
Interpolacion, condiciones y ciclos
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.
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"
}
}
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.