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 mis servidores para realizar las mismas tareas.

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

Bueno, usted siempre puedecrear 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 escribir esos scripts: SSH en su servidor para arreglar las cosas manualmente.

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

Conoce a Ansible. De 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ódigo personalizado para implementar y actualizar sus aplicaciones: automatice en un idioma que se aproxime al inglés simple, utilizando SSH, sin agentes para instalar en sistemas remotos.

Uno de los conceptos más importantes en Ansible es la idempotencia. Del 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.

LEER
Fastlane: Lanzamientos automáticos para aplicaciones móviles

Ok, ok, entiendo. ¿Cómo inicio con Ansible? ¿Va a tomar mucho trabajo configurarlo?

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.

Para comenzar a trabajar con Ansible, primero debemos instalarlo. Es un módulo de Python, y la forma recomendada de instalarlo es con pip / virtualenv porque los paquetes del sistema pueden estar desactualizados:

pip install 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:

[my-servers]
192.168.0.1

[my-servers:vars]
server_name='server_name.xyz'
ansible_ssh_user=ubuntu
ansible_ssh_private_key_file=some/path/to/a/key/file.pem

Describe grupos y otras cosas relacionadas con 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 my-servers -i my-inventory-file -m ping

192.168.0.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Si no es un éxito, verifique que su configuración es correcta. 

Puedo hacer un ping con bash, con incluso menos líneas. ¿Es eso todo lo que Ansible puede hacer? 

Por supuesto que no. El módulo ping es una forma de verificar que Ansible pueda comunicarse con sus instancias, no solo un ping simple como el de bash.

Una vez que todo esté en su lugar, podemos comenzar a hacer cosas más complejas. Por ejemplo, instalemos redis-server  en algún servidor ubuntu:

$ ansible my-servers -i my-inventory-file -m apt -a "update-cache=yes name=redis-server state=present" -b
192.168.0.1 | SUCCESS => {
 "cache_update_time": 1453490171, 
 "cache_updated": true, 
 "changed": true, 
 "stderr": "", 
 "stdout": "..."

Usé el módulo apt (-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 becomes. 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 decimos que necesitamos actualizar la memoria caché y que necesitamos un paquete llamado redis-server instalado (presente). También podemos usar absent o latest para el argumento de estado.

LEER
Puppeteer: Una API para controlar Chrome programáticamente

Observe la tecla “cambiada” en la respuesta. Le permite saber si el comando realmente modificó 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 “ansible scripts”. Encambio, se usa el competo de playbooks, un archivo con varias reproducciones que podemos unir para organizar todo lo que necesitamos en nuestros servidores. Los playbooks Ansible usan sintaxis yml  y plantillas jinja2, así que puede leer acerca de ellas 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é cubrirlo aquí, sino que dejaré un ejemplo simple que instala algunos paquetes del sistema y copia archivos de mi computadora al servidor.

Cree un archivo llamado playbook.yml y ponlo dentro:

---
- hosts: all

  pre_tasks:
    - name: Update apt cache if needed
      become: yes
      apt: update_cache=yes cache_valid_time=86400
  tasks:
    - name: Install redis.
      become: yes
      apt: name=redis-server state=present
    - name: Install system packages.
      become: yes
      apt: name=mysql-server state=present
    - name: Copy some file to server
      copy: 
        src: ~/local/path/to/file
        dest: /some/path/on/server

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

ansible-playbook playbook.yml

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

Creo que puedo intentarlo, pero ¿Ansible puede hacer algo más?

Ansible tiene cientos de módulos y muchas características. Puede que le interese ansible-vault, que le permite cifrar archivos que pueden contener variables confidenciales que desea usar en sus playbooks, lo que le permite guardar esos archivos en sus repositorios de forma segura.

LEER
El costo de no automatizar sus procesos de software

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.


Comentarios