Desarrollado por Hashicorp, creadores de Vagrant y Packer, Terraform es software que nos permite definir nuestra infraestructura como código. Terraform procesa nuestro código, lo compara con el estado del proveedor de servicios especificado y construye un plan de ejecución para que el estado de la infraestructura desplegada sea el definido en el código.
Explicado de forma práctica: podemos añadir nuevas instancias o modificar instancias y recursos en nuestro código (claves ssh, conectividad de red, reglas de firewall…) y aplicarlos a la infraestructura remota sin preocuparnos del cómo.
Terraform tiene soporte para los principales proveedores de infraestructura local o en la nube como Amazon AWS, Microsoft Azure, Openstack, VMware vSphere y Digital Ocean. La lista completa se encuentra, en inglés, en la web de Terraform.
Funcionamiento básico de Terraform.
Terraform tiene principalmente cuatro comandos: refresh, plan, apply y destroy. Refresh refresca la caché actual del estado de la infraestructura definida en el código, plan muestra los cambios que se realizarían comparando el estado del código con el del proveedor, y apply aplica los cambios. Destroy es evidente, y pide confirmación antes de borrar nada.
Apply no pide confirmación. Cualquier diferencia entre el estado remoto y el definido localmente será solucionada de forma irreversible. Es conveniente visualizar el plan antes de ejecutar cambios.
Ventajas e inconvenientes de Terraform.
Pros
Infraestructura como código (IaC): Podremos versionar/revertir/redimensionar nuestra infraestructura de forma no destructiva. Esto nos permite, por ejemplo: mantener un historial reversible de la configuración de la red incluyendo reglas de cortafuegos y VLANs, desplegar un centro de datos 100% idéntico al principal de forma automatizada en una situación de emergencia o recrear nuestra infraestructura de forma parcial o total en un entorno de desarrollo o pruebas.
Velocidad: Terraform es muy, muy rápido. Si el proveedor de infraestructura lo soporta, Terraform es capaz de generar los recursos especificados de forma paralela. En la práctica, esto posibilita que el tiempo de despliegue de 1 máquina sea el mismo que el requerido para 10.
Agnóstico: A diferencia de Heat o CloudFormation, Terraform es capaz de trabajar de forma simultánea con todos sus diferentes proveedores de infraestructura.
Flexibilidad: Terraform procesa todos los ficheros .tf del directorio y los combina en memoria para generar el plan de ejecución, lo que nos permite separar los recursos de manera lógica y manejable.
Inconvenientes y detalles a tener en cuenta.
Depende enteramente de la API de cada proveedor: Aunque la herramienta intenta mitigar posibles fallos mediante reintentos, timeouts y el uso de una caché local que contiene el estado de la infraestructura, está a merced de la fiabilidad de la API. Una respuesta inconsistente por parte del proveedor puede ocasionar que Terraform no reconozca un recurso concreto, y dado que no forma parte del plan declarado en los ficheros, dicho recurso por defecto será eliminado.
Terraform almacena el estado de los recursos en el fichero terraform.state, y esta es el punto de referencia a la hora de generar planes de ejecución. Si se modifica la infraestructura remota desde fuera de Terraform, el comportamiento de la herramienta puede no ser el deseado.
La sintáxis declarativa de los ficheros no es agnóstica respecto al proveedor utilizado. Por tanto, debemos mantener diferentes versiones de nuestra infraestructura según dónde vayamos a desplegarla.
Instalación.
Aunque nosotros utilizaremos Terraform en Linux, también está disponible para otras plataformas como Windows o OSX.
Descargaremos la versión de Terraform deseada desde su página web. Terraform no necesita instalación, basta con descomprimir el archivo.
Primeros pasos: Desplegar una instancia en Amazon AWS.
Para que Terraform pueda acceder a los recursos del proveedor que hayamos elegido, necesitaremos claves API. En el caso de Amazon AWS, podemos obtenerlas en la consola de AWS.
A continuación vamos a generar un fichero ejemplo.tf que contendrá la definición de una máquina Ubuntu 16.04 en una instancia t2.micro, con la configuración mínima necesaria para poder conectarnos por SSH.
Si inspeccionamos el plan generado por Terraform, observamos que va a crear la instancia especificada.
Nota: este plan sólo existe en memoria. Al realizar terraform apply Terraform volverá a refrescar y el plan generado puede ser diferente si las circunstancias son diferentes.
Nota: Es posible almacenar el plan con el switch -out y pasárselo a apply.
Vamos a aplicar los cambios.
Ahora podemos comprobar el estado (cacheado) de nuestra infraestructura con terraform show. Entre otros datos, tenemos la IP pública de la instancia.
Vamos a deshacernos de esta instancia de ejemplo con el comando destroy.
Provisionamiento simple de instancias.
Tras crear la instancia, podemos copiar ficheros y directorios a la misma. Así mismo, con la directiva remote-exec podemos indicarle la ruta de un script local y Terraform lo copiará a la instancia y lo ejecutará.
Vamos a probarlo con un sencillo “Hola”. Creamos un fichero llamado bootstrap.sh que contendrá el comando de prueba.
Modificamos la definición de la instancia para añadir el provisionador, y la clave SSH que debe usar para conectarse.
Tras aplicar el plan, observamos que Terraform se conecta a la instancia y ejecuta bootstrap.sh:
Y comprobamos que funciona.
En un futuro post exploraremos como utilizar esta funcionalidad para provisionar máquinas de forma completamente automática.