Background team.png

Aventuras con Ansible: lecciones aprendidas gracias a las implementaciones en la práctica

@digitalteam

Autor: John Wadleigh

Ansible es una herramienta potente de automatización de TI. Como con la mayoría de las herramientas potentes, se necesita tiempo para dominarla y se debe aprender a usar de forma correcta y segura en el entorno.

Luego de utilizar Ansible para automatizar la implementación y la gestión de las aplicaciones empresariales, aprendí algunas lecciones que considero prácticas recomendadas para la automatización con Ansible y que me gustaría compartir para ayudar a los demás. Después de todo, de eso se trata el enfoque open source. Eche un vistazo a esta Guía para principiantes de Ansible si recién comienza a utilizar la herramienta.

Hace mucho tiempo que me dedico a los sistemas de software empresariales, mucho antes de que Ansible siquiera existiera. Recuerdo aquellos días de implementación de producción trimestral en los que trabajaba durante la noche con un equipo de personas de turno para lanzar una versión. Las implementaciones eran costosas y complejas, carecían de uniformidad y eran muy estresantes.

Alejarse de esa realidad y aprender a automatizar la implementación de software con mayor rapidez y frecuencia requiere mucho trabajo cultural y técnico. Abordaré los aspectos culturales en otra publicación y ahora me centraré en algunas de las prácticas que aprendí con Ansible para aprovechar al máximo sus características y su comunidad.

Estándares

Hay tres aspectos importantes cuando hablamos de la automatización:

  1. Estándares
  2. Estándares
  3. Más estándares

Quizá sea más fácil y divertido escribir un playbook pequeño para realizar una tarea administrativa específica, pero cuando se desarrollan cientos de playbooks o funciones para la implementación automatizada de toda una pila de software en muchos entornos, esta tendrá una gran cantidad de elementos de configuración y se volverá bastante complicada. Además, los playbooks y las funciones solo evolucionarán si no reutiliza las funciones y desarrolla estándares. Este tutorial de playbooks de Ansible lo ayudará a comenzar a transitar el camino hacia el éxito.

Desde el primer día, busque formas de estandarizar los playbooks, las funciones y demás prácticas con Ansible para que el equipo pueda reutilizarlas lo más posible y comprender cómo se organizan los elementos.

Una galaxia muy, muy lejana

Aproveche Ansible Galaxy, el repositorio centralizado de funciones de la comunidad Ansible que se diseñó para que otros usuarios de Ansible lo reutilizaran. Debe consultar Ansible Galaxy para verificar si alguien ya solucionó un problema que usted deba abordar.

Sin embargo, sea cauteloso. El contenido de Galaxy puede reutilizarse, pero debe revisarlo y comprenderlo antes de aplicarlo en su entorno, ya que puede causar un gran daño con facilidad y en muy poco tiempo si utiliza una función que haga algo inesperado.

Cree un inventario sólido

Ansible puede trabajar con los equipos de su infraestructura de forma simultánea basándose en su inventario para enumerar diferentes grupos de sistemas y definirlos según la carga de trabajo u otras características. Incluso puede trabajar con un sistema de inventario dinámico para entornos donde la cantidad de hosts varía en función de la demanda.

El inventario de Ansible puede tornarse muy complejo rápidamente cuando trabaja con aplicaciones empresariales con una gran cantidad de información de configuración.

Por ejemplo, debido a que teníamos una gran cantidad de archivos XML que contenían información de configuración para nuestro software middleware, creamos plantillas de Jinja y trasladamos los elementos de configuración de los archivos XML a nuestro inventario de Ansible. De esta forma, los archivos XML se generaban con mayor facilidad y se enviaban a los servidores de destino. Además, teníamos muchos entornos, por lo que terminamos usando un complemento Vars personalizado y escrito en Python para cargar solo los datos de configuración específicos en nuestra estructura de carpetas de inventario personalizada.

Aproveche los controladores

Los controladores son un conjunto de tareas que se ejecutan únicamente en las notificaciones y solo una vez por playbook. Por ejemplo, puede configurar un playbook con controladores que se activen a partir de eventos específicos, como el reinicio de un servicio o una aplicación. Usar controladores en una función de Ansible que gestione un servicio determinado es ideal para crear tareas comprensibles y claras en el archivo "handlers/main.yml" que se activen por los cambios en el servicio.

Cuando comencé a trabajar con Ansible, no tenía controladores, por eso puedo contarle cómo era la vida antes y después de ellos; así que no los desperdicie.

Idempotencia: conózcala, aplíquela y valórela

La idempotencia es un estilo de vida para la automatización de TI. Primero, debe comprender de qué se trata y, luego, aplicarla cuando escriba códigos de automatización; lo que nos lleva a preguntarnos qué es la idempotencia. Para citar la definición del glosario de Ansible, una operación "es idempotente cuando produce los mismos resultados si se ejecuta una sola vez o reiteradas veces sin que intervenga ninguna acción".

Por consiguiente, puede ejecutar los playbooks varias veces y obtener el mismo resultado final, y los servidores de destino estarán en el "estado deseado". En el caso de que su playbook falle en un grupo pequeño de servidores, puede solucionar el problema y luego ejecutarlo nuevamente. Dado que el playbook es idempotente, los servidores de destino deberían estar en el "estado deseado" y no se producirá ningún otro cambio.

La importancia del nombre

Siempre debe asignar un nombre a las tareas. Esto parece absurdo y casi como si le pidiera que agregue comentarios al código, pero es importante que asigne un nombre legible a la tarea para que los demás puedan comprender de qué se trata. Siga estas reglas simples:

  1. No escriba comentarios de programación tradicionales, como "# es un comentario", en los playbooks de Ansible. Recuerde que Ansible no es un lenguaje de programación, sino una herramienta de automatización.
  2. En su lugar, use el "Nombre" para describir la estrategia o la tarea con explicaciones legibles. Describa sus intenciones sin ser muy técnico.

El mayor beneficio de utilizar la propiedad "Nombre" en todas las estrategias o tareas es que la información aparece cuando se ejecutan los playbooks, lo cual ayuda a realizar un diagnóstico de ellos. Sin embargo, los comentarios no aparecen en la pantalla de ejecución.

Según mi experiencia, muchas personas en la empresa (por empezar, los equipos de desarrollo y operaciones) escriben los playbooks, las estrategias y las tareas; y generalmente debemos saber cuáles son las intenciones para cada una.

Denominación y precedencia de las variables

Sea cauteloso al denominar las variables en el inventario, los playbooks y las funciones de Ansible. Recuerde que Ansible asigna cada variable a un host específico (conocidas como Variables de host), por eso debe evitar el uso de nombres genéricos para las variables como "java_path: /my/path". Es probable que otra aplicación en el mismo host utilice Java y tenga una ruta diferente. Muchas veces, habrá varias aplicaciones en el mismo host que utilizarán versiones de Java diferentes ubicadas en rutas distintas.

Elija nombres diferentes para las variables, anteponga el nombre de su empresa para personalizarlas y asegúrese de que sean legibles. Por ejemplo, la empresa ABC creó variables de inventario personalizadas para una aplicación denominada AppOne que utiliza la versión Java 1.8.

abc_appone_java_path: "/opt/appone/java" abc_appone_java_version: "1.1"

No sea uno de los que copian y pegan el contenido

Permítame aclarar este punto. Debe hacer lo correcto y crear funciones que se puedan volver a usar, en lugar de copiar los elementos de un playbook y pegarlos en otro. De esta manera, edite la función una sola vez y las dependencias utilizarán la última versión automáticamente, sin tener que buscar instrucciones obsoletas o encontrarse con un comportamiento inesperado al momento de ejecutar un playbook meses después.

Valore su entorno

Utilice el IDE que desee con Ansible. Después de todo, solo se trata de sintaxis YAML. Sin embargo, debe tener un IDE que facilite su trabajo. Estas son algunas características que considero fundamentales para un IDE al momento de crear funciones y playbooks de Ansible:

  • Compatibilidad con la detección de errores y el resaltado de sintaxis de YAML
  • Compatibilidad con la detección de errores y el resaltado de sintaxis de Python: Ansible está escrita en Python, y créame que deberá revisar el código fuente algunas veces
  • Sistema de control de versiones integrado
  • Integración de JIRA: puede gestionar los cambios de varios incidentes al mismo tiempo
  • Función sólida de "Buscar y reemplazar": a menudo deberá cambiar, eliminar o trasladar esa variable de Ansible de varias fuentes y buscar y encontrar todas las referencias
  • Compatibilidad con el lenguaje Ruby, si también desea editar archivos de Vagrant
  • Compatibilidad con el lenguaje Groovy, si desea programar sus trabajos de Jenkins

Si adopta estas prácticas, estará a la vanguardia y evitará cometer los mismos errores que yo cometí al utilizar Ansible en la implementación y automatización de sistemas de software empresariales. Podrá cometer sus propios errores nuevos e interesantes. Para obtener más información sobre las prácticas recomendadas de Ansible, consulte la sección de prácticas recomendadas de la documentación de Ansible, descargue la lista de verificación de la automatización empresarial y eche un vistazo al blog de Red Hat y al blog de Ansible.

Más de blogs