DISCLAIMER
Hilo en proceso de creación. No soy un experto del tema ni mucho menos, mas bien todo lo contrario, así que no tomes nada de lo escrito debajo como algo correcto y definitivo hasta que no haya sido repasado por la gente experta en la materia. Se añadirán las correcciones que haga falta a #1 siempre y cuando se verifique que es información correcta y se haga de forma educada (acepto críticas pero no quiero que se me falte al respeto si me he equivocado en cosas porque esto lo hago con la mejor intención del mundo).
DevOps
Imagen 1: Ciclo de vida de la metodología DevOps.
Índice
- - ¿Qué es DevOps?
- - CI/CD
- - Automatizacion
- - Ansible
- - Terraform
- - Recursos útiles
- - Canales
- - Podcasts
- - Videos
- - Links
- - Certificaciones
1 - ¿Qué es DevOps?
DevOps (del ingés development -desarrollo- y operations -operaciones-) es un conjunto de prácticas, herramientas y una filosofía de trabajo que tiene por objetivo tratar de automatizar, integrar y unir a los equipos del proceso de desarrollo de software (dev) con los equipos de infraestructuras (ITOps) a través de una metodología similar a la "metodología ágil" así como acelerar el ciclo de vida del desarollo de software proporcionando una integración continua (CI) y una entrega continua (CD) (el denominado CI/CD).
La Imagen 1 muestra de manera más visual como es ciclo de vida del desarrollo del software usando la metodología DevOps así como algunas de las herramientas más populares de cada una de las fases.
2 - CI/CD
Imagen 2: Ciclo de vida de un pipeline CI/CD.
La integración continua (CI) consiste en unir ("merge") el trabajo de los desarrolladores en un "branch" único de un repositorio de código varias veces a lo largo del día para evitar que el código que tenga cada desarrollador difiera demasiado del "main branch" y que al hacer los "merges", o unión de código de todos los desarroladores, sea excesivamente complicado de hacer (el llamado merge hell).
Con la creación de "pipelines CI/CD" se consigue automatizar la ejecución de bancos de pruebas de código, la compilación del código, la realización de tests de integración, su despliegue y posterior monitorización (estos dos últimos pasos corresponderían con la fase de entrega continua o CD) cuando se hagan cambios en el main branch del código. De esta manera los desarrolladores pueden pushear el código al repositorio con una mayor frecuencia y evitar los posibles problemas asociados que se mencionan en el párrafo anterior.
3 - Automatizacion
La automatización es una parte fundamental del rol de DevOps. Se puede (y se debería) automatizar los pasos del ciclo de vida que hemos visto en la Imagen 1: tanto la configuración de las máquinas desplegadas a través de software como puede ser Ansible, Cheff o Puppet así como automatizar el despliegue de infraestructuras en la nube con software de "Infraestructura como código" (IaC por sus siglas en inglés "Infrastructure as Code") con, por ejemplo, Terraform.
En un escenario ideal donde una empresa ha implantado por completo la filosofía DevOps, un ciclo de vida del desarrollo software con todas las fases automatizadas tendría un aspecto similar al siguiente:
- - Desarrollador pushea código al repositorio.
- - Se realizan pruebas de código y se compila.
- - El código compilado se "dockeriza" y se sube a un registro de Docker (público o privado).
- - Se despliega el contenedor en una infraestructura que previamente ha sido levantada a través de IaC.
- - Se activa la monitorización del aplicativo desplegado.
GitOps aprovecha Git como la única fuente de verdad ("Source of Truth") para definir cada parte de un sistema de la nube. Una vez declarado en Git, un agente de GitOps (Flux o ArgoCD) aplica automáticamente todo el código, la configuración y las políticas en los entornos de desarrollo, testing, preproducción y producción. Con GitOps, cada vez que hay alguna divergencia entre Git y lo que se ejecuta en un clúster, se alerta a los desarrolladores. Según el caso, los operators de Kubernetes conocidos como "reconcilers" actualizan o revierten automáticamente el clúster. Con Git en el centro de los pipelines de entrega, los desarrolladores pueden usar herramientas familiares para realizar pull requests para acelerar y simplificar tanto las implementaciones de aplicaciones como las políticas que rigen la entrega de software de un extremo a otro.
3.1 - Ansible
Ansible es solo una de las alternativas que hay para la gestión del software, provisionamiento y despliegue de aplicaciones. Entraría dentro de la categoría de Infraestructura como código (IaC). Para funcionar sobre máquinas Linux sólo es necesario que Python esté instalado en dichas máquinas (está instalado por defecto en el 99% de las máquinas Linux).
Ansible funciona a través de archivos (manifestos) de lenguaje declarativo escritos en YAML.
Ejemplo básico de un playbook de Ansible en el que se asegura que se está ejecutando la última versión de Apache:
playbook.yml
---
- name: Playbook
hosts: webservers
become: yes
become_user: root
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: ensure apache is running
service:
name: httpd
state: started
Este código lo puedes ejecutar simultáneamente en cuantas máquinas haya definidas en el fichero de inventario asociado. Ejemplo de un fichero de inventario Ansible:
inventory.ini
[servidores]
servidor-1
servidor-2
...
servidor-n
La forma de ejecutar el código sería la siguiente:
$ ansible-playbook playbook.yml -i inventory.ini
3.1.1 - Instalación y uso más avanzado de Ansible
De manera introductoria yo recomendaría la serie de videos en Youtube de Jeff Geerling: Ansible 101 y su respectivo repositorio de GitHub para seguir el curso con ejemplos.
3.2 - Terraform
A diferencia de Ansible que se centra en la configuración de servidores una vez están desplegados a través de código (aunque puede ser usado también para desplegar infraestructuras en cloud o máquinas virtuales), Terraform se centra en el despliegue de infraestructuras, principalmente en la nube, en proveedores como Amazon Web Services (AWS), Google Cloud Platform (GCP), Microsoft Azure, etc... Puedes encontrar todos los providers soportados por Terraform en Terraform Registry.
Terraform, desarrollado por Hashicorp y escrito en GO, utiliza su propio lenguaje HashiCorp Configuration Language (HCL).
Ejemplo de un simple despliegue de una instancia EC2 't2.micro' en AWS con Terraform:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "4.35.0"
}
}
}
provider "aws" {
region = "eu-west-2"
access_key = "my-access-key"
secret_key = "my-secret-key"
}
resource "aws_instance" "example" {
ami = "<codigo-ami>"
instance_type = "t2.micro"
}
Un buen recurso para conocer y profundizar más sobre Terraform es el curso: "HashiCorp Terraform Associate Certification Course" - 13 horas de duración y completamente gratuito en Youtube.
4 Recursos útiles
4.1 - Canales:
- TechWorld with Nana: https://www.youtube.com/@TechWorldwithNana
- DevOps Toolkit: https://www.youtube.com/@DevOpsToolkit
- Jeff Geerling: https://www.youtube.com/@JeffGeerling (aunque últimamente se especializa en Raspberry Pi, tiene playlists de Ansible 101 y Kubernetes 101).
- Christian Lempa: https://www.youtube.com/@christianlempa
- Pelado Nerd: https://www.youtube.com/@PeladoNerd
4.2 - PodCasts
4.3 - Videos:
- What is DevOps?: https://www.youtube.com/watch?v=0yWAtQ6wYNM
- Roadmap to DevOps: https://www.youtube.com/watch?v=G_nVMUtaqCk
- SRE vs DevOps: https://www.youtube.com/watch?v=OnK4IKgLl24
4.4 - Links:
- DevOps Roadmap (La Biblia de DevOps): https://roadmap.sh/devops/ - Esta web marcadla a fuego, pues puede ser una de las webs más importantes de todo el internet si quieres seguir el camino del
SamuraiDevOps. - Google Cloud 101: https://www.freecodecamp.org/news/google-cloud-platform-from-zero-to-hero/
4.5 - Certificaciones
- Ansible: "Red Hat Linux Automation with Ansible (RH294)", "Advanced Automation: Ansible Best Practices (DO447)", "Red Hat Certified Specialist in Advanced Automation: Ansible Best Practices exam (EX447)".
- Kubernetes:
- Docker: Docker Certified Associate (DCA).
- Cloud (AWS/GCP/Microsoft Azure):
- AWS:
- Google Cloud Platform:
- Azure:
- Terraform: https://www.hashicorp.com/certification/terraform-associate - Terraform Associate
TODO
5 - Microservicios
Docker
k8s
GitOps (y NixOPS / NixOS?)
ArgoCD
Cloud (AWS, GCP, Azure)
Monitorizacion
Prometheus + Grafana
Site Reliability Engineering (SRE)
Keywords
devops, integración continua, entrega continua, CI/CD, automatización, git, github, gitlab, ansible, puppet, cheff, terraform, iac, infraestructura como código, aws, azure, gcp, microservicios, contenedor, contenedores, docker, kubernetes, k8s, monitorización, prometheus, grafana, gitops, argocd
Fuentes:
- [1] Wikipedia: https://en.wikipedia.org/wiki/DevOps
- [2] Wikipedia: https://en.wikipedia.org/wiki/CI/CD
- [3] Wikipedia: https://en.wikipedia.org/wiki/Continuous_integration
- [4] Wikipedia: https://en.wikipedia.org/wiki/Continuous_delivery
- [5] Atlassian: https://www.atlassian.com/devops
- [6] RedHat: https://www.redhat.com/en/topics/automation/what-is-devops-automation
- [7] Wikipedia: https://en.wikipedia.org/wiki/YAML
- [8] Middlewareinventory: https://www.middlewareinventory.com/blog/ansible-playbook-example/
- [9] Wikipedia: https://en.wikipedia.org/wiki/Terraform_(software)
- [10] Terraform.io: https://www.terraform.io/
- [11] Weaveworks: https://www.weave.works/technologies/gitops/
- [12] Red Hat Ansible Roadmap: https://www.devopsschool.com/blog/ansible-certification-roadmap-path-2021/