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).