Ansible

Posted on lun 17 agosto 2015 in DevOps

Ansible es una herramienta de configuration management, que es parte de lo que se denomina "Infraestructura como Código". Esta herramienta permite definir una plantilla de configuración deseada, o playbook, y aplicarla en todos los servidores que queramos.

La gracia principal que tienen los Playbooks de Ansible es que están escritos en YAML, es decir, un archivo de texto plano, que es muy fácil de versionar. Estos archivos se ven así:

- hosts: all
  remote_user: root
  tasks:
  - name: Instala dependencias
    apt: name=python-pip state=present
    apt: name=python-virtualenv state=present
    apt: name=python-dev state=presenit
    apt: name=postgresql state=present
    apt: name=nginx state=present
    apt: name=git state=present

  - name: Crea usuario de aplicación
    user:
      name: "{{flask_user}}"
      groups: users,www-data

  - name: Crea virtualenv e instala paquetes
    pip:
      virtualenv: /home/{{flask_user}}/.virtualenvs/{{flask_app_name}}
      requirements: "{{flask_requirement_file}}"

La sintaxis de estos archivos es bastante simple de entender y seguir, por lo que se simplifica bastante su mantención y modificación futura.

Los módulos que trae por defecto Ansible, permiten provisionar ambientes en AWS, DigitalOcean, Docker o en cualquier servidor Debian o RHEL. Además, trae incorporadas utilidades como checkouts de código desde un repositorio Git, manejar servicios systemd, descarga de archivos, y un largo etc.

Usos prácticos

En estos momentos estoy utilizando esta herramienta para crear los ambientes de las aplicaciones que hago, desde el inicio. Cada nuevo paquete que instalo en mi ambiente de desarrollo y cada cambio en la configuración, lo agrego a un playbook de ansible y lo ejecuto con esta herramienta.

Esto permite que mis ambientes sean repetibles y me evito estar haciendo un manual de deploy.

Otro uso que hago de esta herramienta es el de hardening de servidores. Con el tiempo he ido mejorando algunas prácticas de securitización de ambientes, las que he vaciado a playbooks de ansible.

Lo que últimamente me ha llamado la atención es poder crear los servidores desde cero, dado un cambio de versión de sistema operativo o nuevos parches de seguridad que vayan apareciendo.

Esto último me permite revisar la compatibilidad de mis aplicaciones con los nuevos sistemas operativos y versiones de librerías que vayan apareciendo.

Finalmente, los experimentos que he estado haciendo se han basado en tratar de integrar ansible con herramientas como Jenkins o Bamboo, las que permiten generar releases de aplicaciones, con pruebas automáticas de código.

No me ha ido muy bien en esta parte, dado que estas herramientas están más orientadas a la integración continua, más que a la entrega de artefactos de código a ambientes productivos cambiantes (como es el caso de generación de ambientes dinámicos en la nube).