Vaya más allá con la automatización: ansible-runner

Cover

En 2015 empezamos a usar Ansible en Swapps. Creé una pequeña aplicación Django que podría interactuar con Ansible directamente, y la usé para administrar nuestra infraestructura a un nivel superior.

En aquel entonces, Ansible estaba en la versión 1.9. Ansible está escrito en python, así que solo usé los módulos y comencé los playbooks directamente. Sin embargo, salió Ansible 2.0, y todas las API internas obtuvieron una renovación importante. Todo lo que teníamos estaba atascado en Ansible 1.9 hasta que refactorizamos el código para que se ejecutara en Ansible 2, lo cual fue un cambio importante.

Estaba pensando en crear algo que no dependiera de la estructura interna de la API, para poder evitar este problema en el futuro. Después de todo, si invertimos los recursos para actualizar a Ansible 2, no sería bueno tener que hacerlo también para la próxima versión. Finalmente encontré Ansible Runner, y todo tuvo sentido.

Ansible Runner es, como su nombre lo indica, una herramienta para ejecutar Ansible. No le importa su versión Ansible, solo ejecuta su proyecto si le pasa una carpeta estructurada correctamente. Y se pone mejor: puede usarlo desde el shell, pero también puede usarlo directamente en Python.

En aquel entonces, mientras aprendía sobre Ansible Runner, encontré la herramienta oficial para la que fue creado: AWX. Eso no existía cuando creé nuestro propio proyecto para darle a Ansible una interfaz web. Recibe mucho amor y se actualiza constantemente. Es un proyecto muy activo.

Intentamos usar AWX para nuestras necesidades, sin embargo, carece de algunas características que habíamos agregado a nuestra interfaz web, y aunque tenemos la intención de enviar algunas contribuciones al proyecto para habilitar dichas funcionalidades, puede llevar algún tiempo reemplazarlo en nuestra herramienta interna. No me malinterpreten, AWX es INCREÍBLE y está mejor diseñado que nuestra propia solución. Es solo una cuestión de que no se ajusta a nuestras necesidades en este momento.

Volviendo a Ansible Runner, decidimos actualizar nuestra herramienta interna para usarla, por lo que podríamos olvidarnos de las versiones de Ansible e impulsar nuevas funciones interesantes en las que estamos pensando.

¿Qué necesita para ejecutar Ansible Runner?

Como puede ver en la documentación, necesita estructurar todo su playbook en torno a cierta estructura, para que Ansible Runner pueda encontrar e iniciar el proyecto en consecuencia.

Estructura de Carpetas para Ansible Runner

Pone sus variables de entorno, sus ssh_keys e información de ese tipo en la carpeta env, dentro del proyecto donde coloca el playbook, etc. Esto puede parecer mucho al principio, pero es fácil configurarlo automáticamente si tiene la información en algún tipo de aplicación.

Ejecutando con Ansible Runner

Iniciar su playbook ahora es bastante fácil. Puede simplemente usar el siguiente comando:

ansible-runner -p my_playbook.yml run /path/to/my/project

Y eso es todo. Recibirá toda la salida en la consola, al igual que cuando ejecuta el playbook directamente con ansible-playbook. Pero también podemos ejecutar el mismo proyecto desde Python, que en nuestro caso fue ENORME:

import ansible_runner
r = ansible_runner.run(private_data_dir='/tmp/demo', playbook='test.yml')
print("{}: {}".format(r.status, r.rc))
# successful: 0
for each_host_event in r.events:
    print(each_host_event['event'])
print("Final status:")
print(r.stats)

Muy fácil, ¿verdad? Ansible Runner realiza todo el trabajo pesado por usted, y ya no tiene que preocuparse por lo interno. Además, puede conectar algunas devoluciones de llamada en caso de que desee hacer algunas cosas adicionales. En nuestro caso, nuestro módulo cambió de tener alrededor de 300 líneas (inicialización de todo, análisis y organización, ejecución y resultados) a solo esto:

ansible_runner.run(
        playbook="playbook.yml",
        private_data_dir=private_data_dir,
        event_handler=websocket_sender,
        finished_callback=build_saver,
    )

Enviamos el feed que obtenemos del runner a través de websockets y guardamos el proceso una vez que finaliza. Es bastante fácil de configurar.

Cuándo usar Ansible Runner

Si recién está comenzando en Ansible, y se pregunta si debería crear una interfaz web, Ansible Runner puede ayudarlo a hacerlo con bastante facilidad. Sin embargo, asegúrese de que sus necesidades lo requieran primero. AWX probablemente se ajuste bien a sus necesidades. O podría ir con la versión paga: Ansible Tower.

Hay otros casos en los que podría ser interesante usar Ansible Runner en lugar de ansible-playbook. Por ejemplo, si sus playbooks están en toda su máquina y tiene problemas para comprender de dónde se cargan las dependencias.

Cualquiera sea el caso, Ansible está aquí para quedarse, y saber qué herramientas están disponibles para usted puede ampliar su perspectiva al pensar en la automatización. Ese es, al final, el propósito final para todos nosotros, ¿verdad?