Hola comunidad hacía tiempo que no publicaba por cuestiones de trabajo, pero ya estoy de vuelta presentando una herramienta útil y fácil de utilizar la cual nos ayudará en la instalación y despliegue de servicios y aplicaciones tanto en entornos de producción como en una infraestructura con gran cantidad de servidores.

Ansible es una herramienta que nos permite gestionar configuraciones, aprovisionamiento de recursos, despliegue automático de aplicaciones y muchas otras tareas de TI de una forma limpia y sencilla. Ansible es categorizado como una herramienta de orquestación la cual maneja nodos a través de SSH y no requiere ningún software remoto adicional (agente cliente). Dispone de módulos que trabajan sobre JSON y la salida estándar puede ser escrita en cualquier lenguaje. Nativamente utiliza YAML para describir configuraciones reusables de los sistemas. Es incluido como parte de la distribución de Linux Fedora, heredada de Red Hat y también está disponible para Red Hat Enterprise Linux, CentOS y Scientific Linux a través de los Paquetes Extras para Enterprise Linux (EPEL) como también para otros sistemas operativos.

¿En qué se diferencia de otras herramientas similares?

  • No necesita agentes
  • No requiere de configuraciones engorrosas y complicadas
  • Flexibilidad (API, Módulos, Plugins)
  • Facilidad de uso

Para empezar, debemos asegurarnos de disponer una autenticación por llave SSH con los nodos. Para esto abrimos una consola en la máquina central y ejecutamos el comando:

ssh-keygen

Una vez finalizado el proceso de generación disponemos de 2 ficheros: ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub
Copiamos la llave pública a cada nodo

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.6

Ahora podemos iniciar una sesión SSH con el usuario root al nodo sin necesidad de una contraseña. En la imagen a continuación se observará la arquitectura que presenta Ansible.

Instalación

yum install ansible

Ejecutando el comando ansible –version nos dirá la versión que se encuentra instalada y la ruta de los ficheros de instalación y configuración.

Hosts

Por defecto en el fichero de configuración /etc/ansible/hosts se listan las direcciones IP o hostname de cada nodo que es accesible por Ansible los cuales pueden ser asignados por grupos. Un ejemplo de configuración:

[webservers]
192.168.1.2
192.168.1.3

[databases]
192.168.1.4
192.168.1.5

Con esto tenemos todo lo necesario para ejecutar nuestro primer comando desde la máquina central.

ansible webservers –m ping

Como salida del comando saldrá lo siguiente:

192.168.1.2 | success >> {  
    "changed": false, 
    "ping": "pong"
}
192.168.1.3 | success >> {  
    "changed": false, 
    "ping": "pong"
}

Sentencia del comando ansible

ansible [host-pattern] -m [module] -a [arguments] -i inventory [options]

Tasks
Las tareas son ejecutadas en orden, de una en una contra cada máquina que encaja con el patrón del host para luego seguir con la próxima tarea. Es importante entender que dentro de un playbook todos los hosts van a obtener las mismas directivas de tarea. Al correr el playbook, que corre de arriba hacia abajo, los hosts donde fallen las tareas son sacados de la rotación de las restantes. Si las cosas fallan, simplemente hay que corregir el playbook y ejecutarlo de nuevo.
El objetivo de cada tarea es ejecutar un módulo con parámetros muy específicos. Los módulos son idempotente, lo que significa que si se los ejecuta de vuelta, solo van a generar los cambios en el sistema que sean necesarios para llegar al estado deseado. Esto da seguridad para ejecutar el mismo playbook varias veces. Cada tarea debe tener un nombre, que está incluido en la salida de la ejecución del playbook. Esta es una salida para humanos, por lo cual es deseable tener una buena descripción de cada paso de la tarea.

Playbooks
Los playbooks describen configuraciones, despliegue y orquestación en Ansible. El formato del Playbook es YAML. Cada Playbook asocia un grupo de hosts a un conjunto de roles. Cada rol está representado por llamadas a lo que Ansible define como Tareas. Básicamente una tarea no es más que una llamada a un módulo de Ansible.
Al componer un Playbook es posible orquestar despliegues de múltiples máquinas ejecutando ciertas tareas en todas las máquinas del grupo de servidores web, servidores de base de datos y demás servidores.

A continuación un ejemplo:

 - hosts: webservers
  vars:
    http_port: 80    
  remote_user: root
  tasks:
  - name: Asegurarse que Nginx esté en la última versión
    yum: pkg=nginx state=latest
  - name: Asegurarse que Nginx se está ejecutando (y habilitarlo al iniciar el sistema)
    service: name=nginx state=started enabled=yes
  handlers:
    - name: Reiniciar Nginx
      service: name=nginx state=restarted

Supongamos que guardamos ese ejemplo en /etc/ansible/playbooks/playbook_nginx.yml, para ejecutar el mismo basta con escribir en la consola

ansible-playbook /etc/ansible/playbooks/playbook_nginx.yml

Espero que les sea útil 🙂