Desde el momento en que comencé a usar SSH para configurar manualmente mis servidores, noté los problemas con este enfoque. Iba una y otra vez a estos para realizar las mismas tareas. Entonces me pregunté: 

¿Si estoy haciendo lo mismo cada vez, por qué no puedo simplemente escribir un script para automatizar el proceso?

Bueno, usted siempre puede crear scripts bash, sin embargo, escribir scripts estables con bash no es trivial, ya que pueden surgir muchas situaciones y debe tener en cuenta, para evitar hacer lo que pretendía evitar al inicio, lo siguiente: SSH en su servidor para arreglar las cosas manualmente.

Pero, si bash no es una buena opción, ¿qué se puede hacer? 

A posibilidad le presento a continuación Ansible como una para automatizar de manera sencilla. Conozcamos más. 

Conoce a Ansible

Según su documentación:

Ansible es una plataforma de automatización de TI radicalmente simple que hace que sus aplicaciones y sistemas sean más fáciles de implementar. Evite escribir scripts o códigos personalizados para implementar y actualizar sus aplicaciones: automatice en un idioma que se aproxima al inglés simple, usando SSH, sin agentes para instalar en sistemas remotos.

Uno de los conceptos más importantes en Ansible es la idempotencia. El cual significa según el glosario Ansible:

El concepto de que los comandos de cambio solo deben aplicarse cuando necesitan aplicarse, y que es mejor describir el estado deseado de un sistema que el proceso de cómo llegar a ese estado. Como analogía, el camino desde Carolina del Norte en los Estados Unidos hasta California implica conducir un largo camino hacia el oeste, pero si estuviera en Anchorage, Alaska, conducir un largo camino hacia el oeste ya no es el camino correcto para llegar a California. Recursos de Ansible como usted decir «ponerme en California» y luego decidir cómo llegar allí. Si ya estabas en California, no es necesario que suceda nada, y te informará que no fue necesario cambiar nada.

La mayoría de los módulos centrales de Ansible son idempotentes, por lo que podemos describir el estado que queremos para el sistema, alimentarlo a un sistema en cualquier estado y Ansible lo cambiará para satisfacer nuestras demandas.

En este orden de ideas, presentaré un camino a seguir en caso de querer navegar por Ansible.  

¿Cómo iniciar con Ansible?

A diferencia de otras herramientas de automatización como chef y puppet, Ansible no requiere un agente instalado en las máquinas de destino, por lo que para comenzar todo lo que necesitamos es poder conectarnos mediante SSH, lo que no tomará mucho tiempo. 

Para iniciar, debemos instalarlo y como e s un módulo de Python la forma recomendada es con pip/virtualenv, porque los paquetes del sistema pueden estar desactualizados:

pip instalar ansible

Ansible requiere un archivo de inventario para funcionar. De forma predeterminada, se almacena en /etc/ansible/hosts , pero podemos colocarlo en cualquier lugar y usar la bandera -i para decirle a Ansible dónde encontrarlo.

La sintaxis para el archivo de inventario es bastante sencilla:

[mis-servidores] 
192.168.0.1 

[mis-servidores:vars] 
nombre_servidor='nombre_servidor.xyz' 
ansible_ssh_user=ubuntu 
ansible_ssh_private_key_file=alguna/ruta/a/una/clave/archivo.pem

Describir grupos, como variables (vars). Puede cambiar la IP de un nombre de dominio o enumerar varios servidores allí.

Se puede cargar dinámicamente cuando utiliza proveedores en la nube como AWS.

Podemos verificar si todo está bien, usando el módulo ping:

$ ansible mis-servidores -i mi-archivo-de-inventario -m ping 

192.168.0.1 | ÉXITO => { 
    "cambiado": falso, 
    "ping pong" 
}

Si hasta aquí el proceso no es un éxito, verifique que su configuración esté correcta. 

 ¿Es eso todo lo que Ansible puede hacer? 

Sé que debe estar pensando que podemos  hacer un ping con bash, incluso con líneas menos, pero el asunto es que podemos hacer más procesos con Ansible.

Hasta aquí, el módulo ping es una forma de verificar que Ansible puede comunicarse con sus instancias, no solo un ping simple como el de bash.

Una vez que todo esté en su lugar, podemos aumentar la complejidad. 

Por ejemplo, instalamos redis-server   en algún servidor ubuntu:

$ mis-servidores ansible -i mi-archivo-de-inventario -m apt -a "update-cache=yes name=redis-server state=present" -b 
192.168.0.1 | ÉXITO => { 
 "cache_update_time": 1453490171, 
 "cache_updated": verdadero, 
 "cambiado": cierto, 
 "stderr": "", 
 "salida estándar": "..."

Utilice el módulo apto (-m ) para realizar la instalación. Hay otros módulos para otras distribuciones (yum, pacman, etc.).

La bandera – b le dice a Ansible que use sudo para esa operación porque requiere más privilegios que el usuario normal. Es una abreviatura de conversiones. Verifique los documentos de Ansible si necesita una contraseña para eso.

Finalmente, la bandera – a se usa para pasar argumentos al módulo. En este caso, le décimos que necesitamos actualizar la memoria caché y que necesitamos un paquete llamado redis-server instalado (presente). También podemos usar ausente o último para el argumento  de estado.

Observe la tecla «cambiada» en la respuesta. Le permite saber si el comando realmente modifica algo. Si ejecuta el comando por segunda vez, el cambio será igual a falso, porque Ansible no instalará nada.

Si algo está en el estado requerido, ¡no hay necesidad de hacerlo!

Bueno, se ve más fácil y rápido que bash, pero, ¿cómo puedo crear «ansible scripts»?

No existe algo como «scripts ansible». En cambio, se usa el competo de playbooks , un archivo con varias reproducciones que podemos unir para organizar todo lo que necesitamos en nuestros servidores.

En otras palabras, los playbooks Ansible usan sintaxis yml  y plantillas jinja2 , así que puede leer acerca de ellos para hacer su vida más fácil.

Los playbooks son un tema que podría cubrir fácilmente un libro de tamaño mediano, por lo que ni siquiera intentaría cubrirlo aquí, sino que dejaré un ejemplo simple que instala algunos paquetes del sistema y copia archivos de mi computadora al servidor.

Para lo anterior, cree un archivo llamado playbook.yml y ponlo dentro:

--- 
- anfitriones: todos 

  pre_tareas: 
    - nombre: actualice el caché de apt si es necesario 
      convertirse en: si 
      apto: update_cache=sí cache_valid_time=86400 
  Tareas: 
    - nombre: Instalar redis. 
      convertirse en: si 
      apto: nombre = estado del servidor redis = presente 
    - nombre: Instalar paquetes del sistema. 
      convertirse en: si 
      apt: nombre=mysql-server state=presente 
    - nombre: Copiar algún archivo al servidor 
      Copiar: 
        src: ~/local/ruta/al/archivo 
        destino: /alguna/ruta/en/servidor

Para ejecutar el playbook solo se necesita usar el comando ansible-playbook :

libro de jugadas ansible playbook.yml

Ese playbook puede no ser muy útil, pero debería servirle de base si ya está interesado en Ansible.

 ¿Qué más puedo lograr con Ansible?

Ansible tiene cientos de módulos y muchas características. Puede que le interese ansible-vault , que le permita cifrar archivos que contengan variables confidenciales que deseen usar en sus playbooks y guardar en sus repositorios de manera segura. 

Además, puede explorar la gran colección de módulos de Ansible. Puede usar git, crear archivos de configuración sobre la marcha, usar controladores para sus tareas, etc.