APIs Development Sin categoría

Te presentamos PoC Ansible, la herramienta de automatización de código abierto gratuita de RedHat, que automatiza infraestructuras.

La herramienta de automatización gratuita PoC Ansible

Casos de uso

Aprovisionamiento

Si disponemos de un entorno virtualizado podemos utilizar Ansible para aprovisionar máquinas virtuales que cumplan con las especificaciones que nosotros hayamos indicado. Si hablamos de entornos cloud (AWS, Google Cloud, Azure) entonces el concepto de aprovisionamiento se expande y podemos referirnos principalmente a casi cualquier servicio o conjunto de servicios que nos ofrecen.

Automatización

Dependiendo de cómo esté montada nuestra infraestructura es posible que tengamos que realizar tareas periódicas como actualización de servidores, reinicios o tener un plan de acción para recuperar ciertos componentes a partir de sus copias de seguridad. Además de necesitar la posibilidad de realizar otros procedimientos. Para definir y gestionar todo ello Ansible puede ser una herramienta de utilidad.

Gestión de configuración

Ansible se puede utilizar para gestionar la configuración de componentes muy variados. Su uso va desde la configuración de componentes de más bajo nivel, como por ejemplo switches, hasta la configuración y actualización de hosts. Además también se puede utilizar para mantener y gestionar la configuración de Kubernetes.

Despliegue de aplicaciones

Como mínimo el hecho de desplegar una aplicación va a implicar copiar los archivos empaquetados de nuestra aplicación. Además puede ser necesario parar o reiniciar algún servicio y realizar otros pasos adicionales. Para automatizar todos estos pasos se puede utilizar Ansible.

Seguridad

Uno de los usos más comunes de Ansible en el campo de la seguridad es recopilar información de cada uno de los hosts. Desde lanzar análisis en cada uno de ellos con herramientas estándar hasta lanzar scripts propios.

Orquestación

Dependiendo de la naturaleza de nuestro entorno y nuestra infraestructura puede que necesitemos realizar múltiples acciones al mismo tiempo o si detectamos una condición en concreto tengamos que realizar una tarea de compensación. En esta situación Ansible nos puede servir de ayuda.

Integración continua

Cuando se diseña un circuito de CI/CD primero se detectan los pasos a realizar, los más comunes son análisis de código, testing, compilación, empaquetado y despliegue. Cada uno de estos pasos podemos implementarlo mediante las opciones y extensiones que nos ofrece nuestra herramienta de CI/CD (Jenkins, Gitlab-CI) o bien podemos definirla mediante Ansible y hacer que nuestra herramienta de CI/CD lo único que haga sea llamar a dicho componente. La ventaja principal en esta situación es que podemos cambiar de herramienta de CI/CD sin esfuerzo alguno. En cambio como desventaja obtenemos que el mantenimiento y gestión de dicha configuración puede ser más complicada.

Content Marketing

Mediante distintas tareas podemos obtener y componer un resumen de datos respecto a nuestra infraestructura gestionada por Ansible. Esta puede contener información muy diversa (desde puertos abiertos por host, lista de ips, si tiene o no un paquete instalado, tamaño de disco, etc.). Cuando disponemos de unos cuantos hosts o necesitamos recopilar dicha información de forma periódica es recomendable invertir un poco de tiempo en automatizarlo con Ansible.

Arquitectura

A nivel arquitectónico solo está formada por 2 componentes.

El controlador es cualquier máquina donde tengamos Ansible instalado.  Desde este nodo es desde donde se lanzarán las operaciones pertinentes. Actualmente solo podemos realizar la instalación en máquinas Linux y MacOS. 

Los nodos son los hosts a los cuales Ansible se conectará para realizar las operaciones oportunas.

Componentes

Se recomienda que todos los proyectos Ansible tengan la siguiente estructura estándar para facilitar su desarrollo y mantenimiento:

  1. Inventarios 

El Archivo INI que contiene los datos de los hosts que vamos a poder gestionar desde nuestros playbooks.

  1. Playbooks

Archivo YAML que contiene una lista de tareas a realizar en un subconjunto de hosts donde además podemos aplicar una serie de roles. Además desde un playbook podemos importar otro playbook por lo que generalmente tendremos un playbook raíz (p.ej: main.yaml) desde el que importamos los otros playbooks.

  1. Variables 

Es una de las partes más importantes a la hora de parametrizar nuestros playbooks. Estas pueden llegar a nuestro playbook desde distintos lugares:cargaándolas desde una herramienta de configuración externa, definiéndolas manualmente, pidiéndolas por consola o importándolas de archivos de propiedades en formato YAML.

  1. Roles 

Configuraciones genéricas que nos permiten instalar o generar ciertos ciertos componentes. Además podemos definirlos nosotros o utilizar roles de terceros que hayan publicado en un repositorio de roles.

Inventarios

Playbooks

Variables

Comandos comunes

ANSIBLE-CONFIG

ANSIBLE-GALAXY

Se utiliza principalmente para crear nuevos roles e importar roles de repositorios externos.

Por defecto podemos importar cualquier rol de Galaxy.

ANSIBLE-INVENTORY

ANSIBLE-VAULT

ANSIBLE-PLAYBOOK

ANSIBLE-ALL

Buenas prácticas

Aunque en la documentación oficial hay una lista detallada de buenas prácticas, vamos a resaltar aquellas que consideramos más importantes.

  • Utilizar algún sistema de control de versiones sobre nuestros archivos
  • Emplear nombres descriptivos y claros en las tareas.
  • Usar inventarios dinámicos cuando trabajemos sobre plataformas cloud.
  • Proteger las variables sensibles mediante vault.

Encriptar un archivo de variables hará que su contenido esté securizado pero eso también causará que el nombre de la variable no sea visible. Esto puede ser un problema si queremos saber qué variables hay definidas mediante grep.

Para que ello no sea un problema, la metodología a seguir es la siguiente:

  1. Creamos un directorio en groups_vars con el nombre del grupo al que pertenecen las variables.
  2. Dentro de dicho directorio creamos dos archivos: vars.yaml y vault.yaml.
  3. En vars.yaml declaramos todas las variables, incluidas las sensibles.
  4. Copiamos todas las variables sensibles de vars.yaml a vault.yaml pero modificando su nombre añadiendo el prefijo vault_ delante del nombre.
  5. Modificamos el archivo vars.yaml cambiando el valor de las variables sensibles por su referencia a las variables de vault.yaml. Por ejemplo: db_password: “{{ vault_db_password }}”
  6. Encriptamos el archivo vault.yaml
  7. En nuestros playbooks utilizamos las variables del archivo vars.yaml

Testing

Si vamos a desarrollar roles propios para mantener nuestra infraestructura, es de vital importancia poder validar su correcto funcionamiento. Para poder validarlos siempre podemos hacerlo de forma manual o automatizarlo.

Molecule es un framework de desarrollo de roles de Ansible hecho en Python y desarrollado por Metacloud.

Mediante Molecule podemos crear un rol y luego debemos de implementar la lógica que necesitemos.

Los tests de Molecule nos permiten verificar el resultado final de nuestro rol. Por ejemplo si un servicio debería estar funcionando o apagado, si existe un archivo, etc. Además podemos crear nuestros propios verificadores en python si tenemos la necesidad de validar algo que resulte muy complejo mediante tasks.

Para validar un rol molecule utiliza la plataforma indicada en el driver para lanzar múltiples veces el rol. Actualmente soporta drivers muy diversos como Docker, Podman, EC2, etc.

Conclusiones

Ansible ofrece soporte, bien de forma directa o mediante plugins, para interactuar con una gran variedad de componentes. Esto la convierte en una herramienta muy versátil que hay que tener en cuenta a la hora de gestionar nuestra infraestructura.

Actualmente cuenta con una comunidad muy activa y cada día parece estar ganando más relevancia.

Como principales ventajas podemos destacar que no es necesario instalar nada en los hosts en los que vamos a automatizar acciones y su sintaxis es relativamente sencilla.

En cuanto a los inconvenientes cabe decir que no está recomendada para gestionar un gran volumen de componentes y puede que algunos módulos no sean compatibles con alguna de las funcionalidades más recientes que permitan nuestros componentes.

Blog realizado por Adrián Palanqués.

// ¿Te gustaría saber más sobre Ansible?

¡Nosotros te ayudamos!

Author

CloudAPPi

Leave a comment

Tu dirección de correo electrónico no será publicada.