# Ansible (software)

Ansible es una plataforma de software libre para configurar y administrar ordenadores. Combina instalación multi-nodo (es decir: permite desplegar configuraciones de servidores y servicios por lotes), ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como una herramienta de orquestación. Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior) para instalarlo. 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.
La plataforma fue creada por Michael DeHaan, también autor de la aplicación de aprovisionamiento Cobbler y coautor del framework para administración remota Func. Está incluido como parte de la distribución de Linux Fedora, heredada de Red Hat Inc., 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. Ansible tiene soporte comercial de Ansible, Inc.
El nombre lo puso DeHaan por el sistema de comunicación instantáneo del hiperespacio imaginado por Orson Scott Card en la novela El juego de Ender, y originalmente inventado por Ursula K. Le Guin en su novela de 1966 El mundo de Rocannon.

## Principales características

Generalmente Ansible es agrupado con otras herramientas de Gestión de la Configuración como Puppet, Chef, etc. Ansible no puede encasillarse solo a Gestión de la Configuración ya que puede ser usada en otros tipos de escenarios.

### Aprovisionamiento

Con Ansible se pueden aprovisionar las últimas plataformas en la nube, host virtualizados e hipervisores, dispositivos de red y servidores físicos.

### Gestión de la configuración

Establece y mantiene el rendimiento del producto, al registrar y actualizar la información que describe el software y hardware de una empresa. Esta información generalmente incluye las versiones y actualizaciones que se han aplicado a los paquetes de software instalados y las ubicaciones y direcciones de red de los dispositivos de hardware.

### Despliegue de aplicaciones

Cuando se define la aplicación con Ansible y se maneja su despliegue con Ansible Tower es posible llevar un control de todo el ciclo de vida de una aplicación. Desde desarrollo hasta producción.

### Seguridad y Cumplimiento

Ansible permite definir la seguridad en los sistemas de forma sencilla. Utilizando la sintaxis de un Playbook es posible definir reglas de firewall, gestión de usuarios y grupos y políticas de seguridad personalizadas en los sistemas que se estén gestionando y además posees un gran número de módulos que ayudan en la labor.

### Orquestación

Ansible se usa para orquestar los despliegues de OpenStack por ejemplo. Compañías como Rackspace, CSC, HP, Cisco e IBM confían en Ansible para mantener sus nubes OpenStack disponibles de manera simple y segura.

## Arquitectura

Como la mayoría del software para administrar configuración, Ansible distingue dos tipos de servidores: controladores y nodos. Primero, está una única máquina de control donde la orquestación comienza. Los nodos son manejados desde esa máquina de control por SSH. La máquina de control conoce a los nodos a través de un inventario.
Para organizar los nodos, Ansible despliega módulos a los nodos el protocolo SSH. Los módulos son guardados temporalmente en los nodos y se comunican con la máquina de control a través del protocolo JSON sobre una salida estándar. Como Ansible no controla los módulos ya que estos se ejecutan en la máquina remota, no consumen recursos locales porque no existen procesos o programas ejecutándose en segundo plano.
En contraste con otros programas de control de configuración como Chef y Puppet, Ansible usa una arquitectura sin agentes Con la arquitectura basada en agentes, los nodos deben instalar localmente un proceso de comunicaciones con la máquina de control. Con la arquitectura sin agentes los nodos no necesitan instalar ni ejecutar en segundo plano ningún proceso que se comunique con la máquina de control. Este tipo de arquitectura reduce la sobrecarga de la red y previene el uso de estrategias de control más agresivas por parte del servidor (como puede ser la realización de sondeos, con sus constantes operaciones de consulta).

### Propósito

El diseño de Ansible incluye:
* Mínimo por naturaleza. Los sistemas de administración no deben imponer dependencias adicionales.
* Consistente.
* Seguro. Ansible no instala agentes vulnerables en los nodos. Solamente se requiere OpenSSH que es considerado crítico y altamente comprobado.
* Alta confiabilidad. El modelo de idempotencia es aplicado para las instalaciones y configuraciones, para prevenir efectos secundarios en la ejecución repetitiva de guiones (scripts).
* Suave curva de aprendizaje. Los playbooks o libretos usan un lenguaje descriptivo simple, basado en YAML.

### Módulos

Los módulos son considerados las unidades de trabajo en Ansible. Cada módulo es autosuficiente y puede ser escrito en lenguajes estándar de guionado, como Python, Perl, Ruby, Bash, etc. Una de las propiedades principales de los módulos es la idempotencia la cual asegura que ninguna operación se realizará una vez que el sistema ha alcanzado el estado deseado.

### Configuración de inventario

El inventario es una descripción de los nodos que pueden ser accedidos por Ansible. El inventario está descrito por un archivo de configuración, en formato INI, cuya ubicación por defecto es /etc/ansible/hosts. En el archivo de configuración se listan las direcciones IP o hostname de cada nodo que es accesible por Ansible.
Además, los nodos pueden ser asignados a grupos. Un ejemplo de archivo de configuración:
Este archivo de configuración especifica 3 nodos. El primer nodo está especificado a través de su dirección IP y los siguientes 2 por su nombre de host. Además, los últimos 2 nodos fueron agrupados bajo el nombre de grupo webservers.

### Manual de tácticas o 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 con múltiples "jugadas", es posible orquestar despliegues de múltiples máquinas, ejecutando ciertos pasos en todas las máquinas del grupo de servidores web, otros pasos en el grupo de servidores de base de datos, y luego más comandos en los servidores web, etc.
Un Playbook que contiene una sola jugada:

#### Lista de tareas

Cada jugada contiene una lista de tareas. 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 una jugada, todos los host van a obtener las mismas directivas de la tarea. Es el objetivo de un Playbook el mapear un grupo de host a tareas.
Al correr una jugada, que corre de arriba hacia abajo, los host donde fallen las tareas son sacados de la rotación de las jugadas restantes. Si las cosas fallan, simplemente hay que corregir el Playbook y ejecutar nuevamente.
El objetivo de cada tarea es ejecutar un módulo, con parámetros muy específicos. Variables, como ya se mencionó, pueden ser usadas como argumentos de los módulos.
Los módulos son idempotentes, lo que significa que si se les 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. No va a cambiar nada salvo que sea necesario hacerlo.
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.
Las tareas pueden declararse usando el formato antiguo action : module options, pero es recomendable usar el formato más convencional module : options. Este es el formato recomendando en la documentación, pero se pueden encontrar Playbook con el formato antiguo.

## Plataformas soportadas
### Controladoras (servidores)

Las máquinas orquestadoras deben tener Python 2.6. Los sistemas operativos soportados en las máquinas controladoras incluyen la mayoría de las distribuciones de Linux y Unix, tales como Red Hat, Debian, CentOS, OSX, y BSD, entre otros. También está disponible para Mac. Los nodos orquestados deben tener Python 2.4 o posteriores. La plataforma Windows no está soportada para albergar una controladora (servidor). Sin embargo es posible utilizarlo mediante las siguientes configuraciones: máquina virtual con Linux, Bash de Ubuntu en Windows, Cygwin y Vagrant.

### Nodos (clientes)

Además en los nodos orquestados que tengan Python 2.5 o anteriores, se debe contar con el paquete python-simplejson ya que es requerido. La instalación en plataforma Windows está supeditada a la instalación de WinRM.

### Integración con la nube

La biblioteca de módulos de soporte en la nube de Ansible facilita el aprovisionamiento de instancias, redes e infraestructura de nube completa donde sea necesario. El simple lenguaje de Playbook, que se usa para implementar las aplicaciones y la automatización de virtualización local, también permite aprovisionar la infraestructura, así como aplicar la configuración correcta. Ansible garantiza que las implementaciones en la nube funcionen sin problemas en la nube pública, privada o híbrida de una manera muy sencilla y robusta, como si fuera un solo sistema.
Las nubes son más que simples servidores, independientemente de si el entorno de aplicación solo consiste en servidores, configuraciones específicas del sistema operativo, redes privadas virtuales, subredes o hasta balanceadores de carga, Ansible se asegurará de que la infraestructura satisfaga todas las necesidades de la aplicación cada vez.
La modularidad es la base de código que le permite administrar la infraestructura de hoy, pero también se adapta rápidamente a las nuevas necesidades y requisitos de TI de las nubes que van apareciendo. Incluye más de 300 módulos que abarcan cientos de puntos finales de API en diversas tecnologías de nube públicas y privadas y proveedores. De esta manera Ansible tiene las capacidades necesarias para implementar y administrar infraestructura, desde OpenStack hasta AWS, incluyendo:
* Servidores y funcionamiento.
* Enrutamiento y redes nativas de la nube
* Redes privadas virtuales
* Política de acceso y permisos
* Balanceadores de carga
* Política de autoescala
Ansible puede instalarse en ambientes virtualizados, nubes públicas y privadas, incluyendo VMWare, OpenStack, AWS, Eucalyptus, KVM y CloudStack.

### Integración con Big Data

Ansible se puede instalar en entornos para analizar y archivar big data, incluyendo Hadoop, Riak, y Aerospike.
El problema sobre el cual se apoya Ansible es que estos entornos incluyen la administración de recursos que se consumen en cada nodo. En particular, big data, archivo y análisis buscan hacer un uso eficiente de los recursos mediante el consumo de pequeñas tiempos de CPU y cantidad de memoria como sea posible. Adicionalmente, Ansible permite tener un monitor de cantidades de los recursos de CPU disponibles, que pueden ayudar a la vigilancia de los nodos.

## Usuarios

Ansible es utilizado por Atlassian, Twitter, OneKingsLane, EverNote, TrunkClub, edX, hootsuite, GoPro y Care.com, además de muchos otros.