Infraestructura como Código (IaC: Infrastructure as Code) es una práctica clave de DevOps y se utiliza junto con la entrega continua. En este articulo, vamos a revisar algunos conceptos de IaC y entender el caso de Ansible, una gran herramienta, que hace poco superó a Puppet como herramienta preferida de configuración según RightScale/Flexera.
Característica clave de IaC
IaC es la administración de infraestructura (redes, máquinas virtuales, balanceadores de carga, topología de conexión, etc) en un modelo descriptivo, usando el mismo versionado que usa el equipo de DevOps para el código fuente. IaC está muy unido al concepto de Cloud, aunque no está limitado a este.
Siguiendo el principio de que el mismo código fuente genera el mismo binario ejecutable (idempotencia), un modelo IaC genera el mismo entorno cada vez que se aplica.
Esto es posible gracias a herramientas como Kubernetes, Ansible, Puppet, Chef , Terraform, Salt, etc.
Las características más importantes del IaC son:
- Se usa código para describir la infraestructura: No se utiliza interfaz de usuario para iniciar una máquina virtual, sino que se describen sus características deseadas en código y se usa una herramienta para que lo ejecute.
- Todos usan el mismo código probado para las operaciones de administración de infraestructura: Las operaciones comunes de administración de infraestructura deben confiar en las funciones de código probadas que se utilizan en el equipo. Esto hace que las operaciones diarias sean más eficientes en tiempo y menos propensas a errores. Esto garantiza que no se estén creando su propia implementación cada vez.
- Operaciones automatizadas: No se ejecutan comandos para iniciar y configurar un sistema, sino que se usa una sintaxis de configuración proporcionada por la herramienta IaC para decirle qué se debe hacer.
- Se aplican prácticas de desarrollo de software a la infraestructura: En el desarrollo de software, las prácticas como mantener el código en el control de fuente o revisiones por pares son muy comunes. Hacen que el desarrollo sea fiable y el trabajo en equipo posible. Como nuestra infraestructura se describe en el código, podemos aplicar estas mismas prácticas.
Beneficios de IaC
Como os podéis imaginar trabajar las infraestructuras de esta manera trae consigo un conjunto importante de beneficios, asociados al control y predictibilidad de nuestras infrastructuras.
Velocidad y simplicidad
IaC permite gestionar la arquitectura de infraestructura completa ejecutando un script.
No solo implementar servidores virtuales, si no que también iniciar bases de datos preconfiguradas, infraestructura de red, sistemas de almacenamiento, balanceadores de carga y cualquier otro servicio en la nube necesario.
Esto se puede hacer rápida y fácilmente para diferente entornos (desarrollo, organización y producción), lo que puede hacer que el proceso de desarrollo de software sea mucho más eficiente.
Además, se pueden implementar fácilmente entornos de infraestructura estándar en otras regiones donde opera el proveedor de nube; lo que permite utilizarla para generar copias de seguridad y la recuperación ante desastres.
Podemos hacer todo esto escribiendo y ejecutando el código.
Consistencia de configuración
Los procedimientos operativos estándar ayudan a mantener cierta consistencia en el proceso de implementación de la infraestructura. Pero, como sabemos, el error humano siempre aparece, lo que puede dejarte con sutiles diferencias en las configuraciones que pueden ser difíciles de depurar y generar de esta manera deriva.
IaC estandariza completamente la configuración de la infraestructura para reducir la posibilidad de errores o derivas. Esto reducirá las posibilidades de problemas de incompatibilidad en la infraestructura y ayudará a que las aplicaciones se ejecuten con mayor facilidad.
Minimiza riesgos
IaC no solo automatiza el proceso, sino que también sirve como una forma de documentación de la manera correcta de crear una instancia de la infraestructura. Esto es muy interesante en el caso de que los implicados abandonen una empresa con su know-how.
Las configuraciones están obligadas a cambiar para adaptarse a nuevas funciones, integraciones adicionales y otras ediciones del código fuente de la aplicación.
En el método tradicional, si un miembro de equipo edita el protocolo de implementación, puede ser difícil precisar exactamente qué ajustes se hicieron y quién fue el responsable.
En Iac, debido a que el código puede ser controlado por sistemas de versionados, permite que cada cambio en la configuración de su servidor sea documentado, registrado y rastreado.
“Y todas estas configuraciones se pueden probar, al igual que el código”
Mayor eficiencia en el desarrollo de software
La productividad de un desarrollador aumenta drásticamente. Las arquitecturas en la nube se pueden implementar fácilmente en múltiples etapas para hacer que el ciclo de vida del desarrollo del software sea mucho más eficiente.
Los desarrolladores pueden lanzar sus propios entornos de espacio aislado para desarrollar. QA puede tener una copia de la producción que pueden probar a fondo. La seguridad y las pruebas de aceptación del usuario pueden realizarse en entornos de almacenamiento separados. Y luego, el código de la aplicación y la infraestructura se pueden implementar en producción en un solo movimiento.
“IaC permite a una empresa utilizar técnicas de integración continua y despliegue continuo al tiempo que minimiza la introducción de errores humanos después de la etapa de desarrollo.”
También se pueden incluir en los scripts de IaC la reducción de los entornos cuando no están en uso. Esto eliminará todos los recursos sin uso, evitando componentes huérfanos en la nube que todos temen eliminar. Esto aumentará aún más la productividad del personal al tener una cuenta en la nube limpia y organizada.
Ahorro de costes
La automatización del proceso de implementación de la infraestructura permite a los ingenieros de
dicar menos tiempo a realizar trabajos manuales y más tiempo a ejecutar tareas de mayor valor. Debido a este aumento de la productividad, la empresa puede ahorrar costes.
También, como hemos indicado, los script IaC pueden reducir automáticamente los entornos cuando no están en uso, lo que ahorrará aún más en los costos de computación en la nube.
Ansible
Ansible es un motor de automatización de infraestructura tremendamente simple que automatiza el aprovisionamiento de la nube, la administración de la configuración, el despliegue de aplicaciones, la orquestación dentro del servicio y muchas otras necesidades del contexto TI.
Ansible modela la infraestructura al describir cómo se relacionan todos los sistemas, en lugar de solo administrar un sistema a la vez.
No utiliza agentes ni infraestructura de seguridad personalizada adicional, por lo que es fácil de implementar y, lo que es más importante, utiliza un lenguaje muy simple: YAML, en forma de Ansible Playbooks, que permiten describir los trabajos de automatización de una manera que se acerca inglés simple.
Algunas de sus características son:
- Sin agente: No hay software o agente que instalar en el cliente que se comunica de nuevo con el servidor.
- Idempotente: No importa cuántas veces llame a la operación, el resultado será siempre el mismo.
- Simple y extensible: Ansible está escrito en Python y usa YAML com lenguaje de los playbooks, los cuales son relativamente fáciles de entender y aprender.
Arquitectura Ansible
Ansible está compuesto de los siguientes elementos:
Módulos
Pequeños programas que hacen alguna tarea en el servidor, por ejemplo, en lugar de ejecutar este comando.
sudo apt-get install htop
Podemos usar el modulo apt e instalar htop.
– name: instalar htop
apt: name = htop
El uso del módulo permite saber si está instalado o no.
Plugins
Son piezas de código que aumentan la funcionalidad principal de Ansible. Ansible ya viene con una serie de plugins prácticos. También se puede escribir plugins personalizados.
Inventario de hosts
Para proporcionar una lista de hosts, necesitamos proporcionar un inventario de estos. Este tendrá la forma de un archivo de hosts. En su forma más simple, nuestro archivo hosts podría contener una sola línea:
35.178.45.231 ansible_ssh_user = ubuntu
Playbooks
Es el mecanismo de enviar comandos a sistemas remotos de forma programada.
En lugar de usar comandos, puede configurar entornos complejos completos pasando un script a uno o más sistemas.
Group_vars
Un archivo que contiene un conjunto de variables, por ejemplo, db nombre de usuario y contraseña.
Roles
Los roles son una forma de agrupar múltiples tareas en un contenedor para hacer una automatización de manera más efectiva con estructuras de directorios limpias.
Handlers
Son listas de tareas diferentes de las tareas normales, a las que se hace referencia con un nombre único global, y son notificadas por notificadores. Si nada notifica a un hanlder, no se ejecutará.
Independientemente de cuántas tareas notifiquen a un hanlder, se ejecutará solo una vez, después de completar todas las tareas en un playbook.
Etiquetas
Puede ser útil poder ejecutar una parte específica de la configuración sin ejecutar todo el playbook, cuando este es grande.
Una estructura de directorio Ansible típica tendrá la siguiente forma.
Jugando con Ansible
Vamos a hacer una pequeña prueba usando Ansible y AWS para dar de alta un toda una pequeña infraestructura en en AWS.
Para ello será necesario primero crear una cuenta gratuita AWS (si no la tienes).
Ahora necesitaremos instalar Ansible en nuestro sistema:
- Para linux usar: sudo apt-get install ansible
- Para windows, seguir las instrucciones de este artículo.
Una vez instalado, clona el siguiente respositorio:
- Examina los scripts del repositorio
- Edita vars/aws-creds.yml para incluir tus credenciales de AWS
- Edita vars/dev-environment.yml para definir los grupos de seguridad, los conjuntos de instancias, etc, que se utilizarán.
- Modifica el id de AMI para usar la que necesites.
- Abre una consola, muévete al directorio ansible-aws-example
- Ejecutar: ansible-playbook -i hosts provision.yml
Reflexiones finales
Tal como hemos visto en este artículo, IaC es un poderosa arquitectura con muchísimos beneficios. En una herramienta que puede complementar nuestra madurez como equipo DevOps, aumentando la calidad de nuestra entrega de valor y la eficiencia en el proceso.
Los scripts se pueden integrar fácilmente dentro del proceso DevOps de nuestro equipo. Asimismo facilitan el control de versiones, repetitiviadad, previsibilidad y el testing.
También hemos visto de manera muy sucinta el caso de Ansible como ejemplo de herramienta IaC. Como se ha hecho evidente es muy sencillo de entender. La configuración es clara y se adapta al grado de complejidad de los proyectos, permitiéndonos una gestión completa del aprovisionamiento.