Según la encuesta del informe Accelerate State of DevOps 2019, el 80% de los encuestados dijo que la aplicación o el servicio principal que admitían estaba alojado en algún tipo de plataforma en la nube. El 50% de los encuestados dijo que su aplicación principal estaba alojada en la nube pública.
Why Infrastructure as Code?
Tradicionalmente, si miramos hacia atrás cuando deseaba un servidor, levantaría un ticket y alguien del equipo de operaciones crearía una instancia de VM u ordenaría un servidor físico. Esto podría ser mediante scripts, apuntar y hacer clic o incluso instalar manualmente.
Y luego, con cada solicitud, habría más máquinas virtuales, para DNS, correo, bases de datos, etc. Y luego, hubo actualizaciones continuas de los sistemas operativos, servidores web, JVM y todo lo demás. Con el tiempo, tuvieron configuraciones ligeramente diferentes entre sí (deriva de la configuración), lo que resultó en servidores de copos de nieve. Y cuando algo se rompió, fue un desafío realizar un seguimiento de los cambios realizados.
Esto seguía siendo aceptable siempre que los servidores fueran pocos y de larga duración.
Se produjo un gran cambio con la llegada de servicio de almacenamiento en la nube empresas como AWS. Muchas empresas, en lugar de invertir en hardware y centros de datos, comenzaron a trasladar sus aplicaciones a la nube. Y en la nube, podría implementar un servidor en minutos, lo que antes llevaría horas o incluso días.
Para mantener un rendimiento y una disponibilidad óptimos, es posible que deba implementar más instancias para satisfacer la demanda. Y luego, es posible que deba cancelarlos para ahorrar costos. Como paga por hora, es posible que deba aumentar o disminuir todos los días. Hacer esto manualmente, muchas veces al día, es claramente un desafío.
La captura de los pasos necesarios para implementar o finalizar instancias y otros componentes de infraestructura en el código permite la automatización. La automatización en el aprovisionamiento de infraestructura y nube puede ayudar a generar valor de manera más rápida y confiable.
What is Infrastructure as Code?
La infraestructura como código (IaC) es la automatización de la infraestructura que utiliza principios y prácticas de desarrollo de software.
La idea es que trate su infraestructura como software y luego escriba, pruebe y ejecute código para definir, implementar, actualizar y destruir su infraestructura. Escribe código para administrar sus servidores, bases de datos, redes, registros, implementación y configuración de aplicaciones. Cuando desee realizar cambios en su infraestructura, realice cambios en el código, lo pruebe y luego lo aplique a sus sistemas.
Benefits
La infraestructura como código ofrece importantes beneficios sobre el aprovisionamiento manual:
Autoservicio
Como la infraestructura se define como código, todo el proceso y la implementación se pueden automatizar y cualquier persona en el DevOps equipo. Los usuarios de la infraestructura obtienen los recursos que necesitan cuando los necesitan.
Idempotencia
Ser idempotente significa que define el estado deseado, y no importa cuántas veces ejecute el script, el resultado es el mismo. Comprueba el estado actual y el estado deseado y solo aplica los cambios necesarios. Esto puede ser extremadamente difícil de lograr con scripts bash.
Herramientas como Ansible y Terraform tienen funciones integradas para que su código sea idempotente.
Costes reducidos
Reduce el tiempo y el esfuerzo necesarios para el aprovisionamiento, mucho menos que el aprovisionamiento manual.
Entrega de software más rápida
El aprovisionamiento rápido de infraestructura para desarrollo, pruebas y producción da como resultado su capacidad para entregar software mucho más rápido. Dado que el proceso de implementación está automatizado, también es coherente y repetible.
Autodocumentado
El estado de la infraestructura se define en un código que cualquiera puede leer fácilmente.
Versión controlada
Tradicionalmente, los cambios en los sistemas de producción se consideran riesgosos. Pero entonces, el cambio es inevitable. Es posible que deba agregar una nueva base de datos cuando agregue una nueva función. Es posible que deba agregar nuevos servidores o almacenamiento al clúster. La infraestructura como código reduce el esfuerzo y el riesgo de realizar cambios en la infraestructura.
Puede registrar sus archivos de origen en el control de versiones, lo que significa que puede realizar un seguimiento de todos los cambios realizados en la infraestructura y volver rápidamente a la versión anterior si algo se rompe.
Validación y prueba
La infraestructura como código permite probar y aplicar pequeños cambios de forma continua. Como todo es código, puede buscar errores mediante análisis estático y pruebas automatizadas.
Mejora la seguridad
El cambio a la infraestructura como código le permite integrar la seguridad desde el principio, y luego puede aplicar los cambios de manera confiable y segura.
Infrastructure as Code tools
Si bien hay muchas herramientas disponibles, elegir una con la que trabajar puede no ser fácil. Las siguientes son algunas de las consideraciones que pueden resultarle útiles:
Gestión de la configuración frente a herramientas de aprovisionamiento
En términos generales, las herramientas disponibles se dividen en dos categorías:
- Herramientas de gestión de la configuración.
- Herramientas de aprovisionamiento
Herramientas de gestión de la configuración
Las herramientas de gestión de la configuración están diseñadas para gestionar usuarios, instalar y gestionar software y herramientas en servidores existentes. Cocinero, Marioneta, Ansibley SaltStack son principalmente herramientas de configuración.
Puede utilizar herramientas de gestión de la configuración para instalar y actualizar el software en los servidores.
Herramientas de aprovisionamiento
terraformar, Formación de nubes, OpenStack Heat, por otro lado, son herramientas de aprovisionamiento, es decir, se utilizan para crear servidores, servidores de bases de datos, balanceadores de carga, colas, subredes, cortafuegos y todos los demás componentes de su infraestructura. Estas herramientas realizan llamadas API a los proveedores para crear la infraestructura necesaria.
Infraestructura mutable versus inmutable
La infraestructura mutable es aquella que se puede modificar después de haber sido aprovisionada. Chef, Ansible, Puppet y SaltStack están diseñados para instalar o actualizar el software en servidores existentes. Esto puede suceder muchas veces durante la vida útil de un servidor. Después de muchas actualizaciones, es probable que cada servidor sea un poco diferente de los demás, lo que lleva a cambios en la configuración. Por ejemplo, algunos cambios que funcionan bien en servidores de prueba pueden no funcionar en servidores de producción.
Herramientas como Terraform y Formación de nubes están diseñados para crear un nuevo servidor a partir de una imagen de máquina o una imagen de contenedor cada vez. Si es necesario actualizar los servidores, reemplácelos por servidores nuevos. Cuando los nuevos servidores estén activos, puede cancelar los antiguos. Cada implementación utiliza una imagen inmutable para crear un servidor, evitando así la desviación de la configuración. Sin embargo, esto puede ser un poco lento.
Herramientas imperativas frente a declarativas
Las herramientas imperativas son similares a las secuencias de comandos. Enumera los pasos a seguir para llegar al estado deseado. Las herramientas declarativas le permiten especificar el estado final, y la herramienta elabora los pasos para lograr ese estado.
Si bien Chef es principalmente una herramienta imperativa, Ansible utiliza un enfoque híbrido y admite técnicas tanto imperativas como declarativas.
Terraform, CloudFormation, Puppet, OpenStack Heat y SaltStack pertenecen a la categoría de herramientas declarativas donde declara el estado final deseado.
Usando múltiples herramientas juntas
Aunque cada una de estas herramientas se puede usar por sí sola, un enfoque común es usarlas juntas. Por ejemplo, puede utilizar Terraform para crear VPC, subredes, puertas de enlace de Internet, balanceadores de carga y máquinas virtuales y luego usar Ansible para configurar e implementar servicios en estas instancias.
Conclusión
La infraestructura definida como código ofrece muchas ventajas sobre el aprovisionamiento manual: puede controlarse la versión, probarse, conduce a un aprovisionamiento y entrega de software más rápidos. Muchas organizaciones ya han comenzado a adoptar el enfoque de IaC para construir y administrar su infraestructura.