Introducción a Ansible

Escrito por el , actualizado el .
gnu-linux planeta-codigo
Enlace permanente Comentarios

Ansible

Siempre que nos sea posible deberíamos automatizar las tareas que realizamos. Automatizar tareas hará sencillo realizarlas permitiéndonos hacer todos los despliegues de una aplicación que queramos con menos posibilidades de cometer errores manuales o nos permitirá disponer de una nueva máquina aprovisionada exactamente como pueda estar la máquina de producción en mucho menos tiempo. En el ámbito del aprovisionamiento de máquinas y administración de la infraestructura IT hay varias opciones, entre ellas están Chef, Puppet y Ansible.

En este artículo haré una breve introducción de Ansible que principalmente se emplea en servidores pero también podríamos emplearlo para nuestra propia máquina. Con Ansible podremos:

  • Automatizar el aprovisionamiento de máquinas.
  • Gestionar la configuración de los servicios de esas máquinas.
  • Realizar despliegues y orquestar los servicios.

Hay que destacar que Ansible no necesita instalar un agente (al contrario de Chef o Puppet) en cada una de las máquinas del inventario que queramos administrar lo que lo hace fácil de emplear, usa un modelo «push» en el que la máquina donde se ejecuta Ansible envía por ssh los comandos necesarios a aplicar en vez de ser cada una de las máquinas las que obtienen de un repositorio las recetas a usar. En los artículos Application Deployment, Configuration Management y Continous Delivery nos describen algunos casos de uso y sus ventajas empleando Ansible.

Para trabajar con Ansible necesitaremos inventariar las máquinas y probablemente definir algunas variables. Podría ser de la siguiente forma en el caso de una máquina para desarrollar.

1
2
3
4
5
6
7
8
9
devbox ansible_connection=local ansible_python_interpreter=python2

[devbox]
devbox

[devbox:vars]
path = "projects"
subversion_user = "picodotdev"
subversion_password = "***"
hosts

En el inventario descrito como un archivo en formato INI se asignan los nombres del host o sus direcciones IP, también se pueden hacer agrupaciones de máquinas por ejemplo en base al rol (base de datos, servidor web, …). Una vez que disponemos del inventario podemos empezar a usar Ansible, por ejemplo haciendo un ping a todas las máquinas o instalando un determinado paquete:

1
2
$ ansible devbox -i hosts -m ping
$ ansible devbox -i hosts -m pacman -a "name=docker state=installed"
ansible.sh

Ansible

El parámetro -m indica el módulo de Ansible que usamos y a continuación indicamos los parámetros. Ansible dispone de una amplia colección de módulos que nos permiten hacer cantidad de tareas.

Pero en vez de usar Ansible mediante comandos podemos emplear recetas contenidas en playbooks descritos en formato YAML en las que definimos varias tareas y podemos usar las variables del inventario. Con el siguiente playbook instalamos varios paquetes en una máquina Arch Linux y hacemos un checkout de dos proyectos de subversion, para ello usamos en la primera tarea el módulo para gestionar paquetes con pacman, hay módulos para los gestores de paquetes de otras distribuciones (apt, yum, …) y en la segunda tarea hacemos un checkout de dos proyectos usando el módulo del sistema de control de versiones subversion. Los módulos son idempotentes de forma que una vez que el sistema está en el estado deseado no se realiza la operación, esto hace que el mismo playbook pueda ser ejecutado tantas veces como se desee evitando efectos colaterales por reejecuciones, lo importante es el estado que se quiere conseguir, Ansible se encarga de realizar las acciones necesarias para llegar a él desde el estado actual del sistema.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- hosts: devbox
  tasks:
    - name: install packages (Arch Linux)
      pacman: name={{ item }} state=present
      sudo: true
      when: ansible_distribution == "Archlinux"
      with_items:
      - vim
      - subversion
      - mariadb
      - redis
      - docker
      - ansible
      - python2-pip
      - python2-virtualenv

    - name: checkout projects
      environment:
          LANG: es_ES.UTF-8
          LC_CTYPE: es_ES.UTF-8
      subversion: repo={{ item.url }} dest={{ projects }}/{{ item.path }} username={{ subversion_user }} password={{ subversion_password }}
      with_items:
      - { url: "http://server.com/svn/repos/project1/trunk", path: "project1" }
      - { url: "http://server.com/svn/repos/project2/trunk", path: "project2" }
install.yml

Para ejecutar un playbook usamos el comando ansible-playbook en vez de simplemente el comando ansible.

1
2
$ ansible-playbook ansible/install.yml -i hosts

ansible-playbook-install.sh

En los playbooks podemos usar tareas, grupos de máquinas, variables, variables de grupos, asignar valores a variables, usar condicionales, bucles, hechos (facts, información obtenida por ansible), notificaciones y realizar acciones en base a ellas, aplicar etiquetas a tareas, hacer includes, plantillas (para los archivos de configuración de los servicios, por ejemplo de apache o mysql), esperar a condiciones, cifrar archivos que contengan información sensible y que podamos incluir en una herramienta de control de versiones sin riesgo a comprometer la información, usar roles que aplican todas estas cosas según la función que queramos que tenga una máquina.

El libro Ansible Up & Running es un buen punto de partida que explica los aspectos básicos ya en su versión de vista previa, por supuesto la propia documentación del proyecto y los recursos de evangelización están bastante bien. En la siguiente buena y completa presentación se explican con un poco más detalle más cosas:

También, en el siguiente repositorio de GitHub hay varios ejemplos que podemos revisar para ver como se organizan los archivos y carpetas y las convenciones en su estructura que se usan implícitamente.

Como me ha ocurrido con la herramienta Elasticsearch la documentación de Ansible no me ha resultado que esté escrita de forma didáctica para dominarla empezando desde ningún conocimiento, por ello un libro como Ansible: Up and Running es una opción interesante para aprender.

Habiendo hecho una introducción a Docker y esta a Ansible en el siguiente artículo comentaré como usar Docker con Ansible.


Comparte el artículo: