yourlabs.remember

yourlabs.remember

`````````````````

Meta-Rol para Arquitectos de Automatización Ansible.

Este rol proporciona la magia para hacer más inteligentes los flujos de trabajo de roles de Ansible:

  • gran aceleración: requiere un rol de dependencia solo una vez
  • sin inventario seco: recuerda las variables inyectadas desde la línea de comandos en el host
  • pregunta de variable de CLI: cuestionamiento interactivo del usuario para obtener datos

.. nota:: Este rol no descarga automáticamente los roles de dependencia: eso es trabajo del comando bigsudo <https://pypi.org/project/bigsudo/>_.

Demostración

La forma más fácil de probarlo::

pip install --user bigsudo ~/.local/bin/bigsudo yourlabs.fqdn user@somehost

O si te sientes valiente (omite el nombre de host para aplicar en localhost)

~/.local/bin/bigsudo yourlabs.traefik

Por supuesto, también podrías usar comandos ansible, pero entonces serían más comandos y opciones. Nos inspiramos en la práctica de kubectl, para pequeños servidores, servicios no-HA y equipos que hacen pizzas. Aún así, yo personalmente seguiría usando bigsudo yourlabs.k8s para configurar instancias de k8s si fuera necesario...

Uso

Este rol te permite definir qué variables son necesarias en tu propio rol, junto con cosas como la descripción que se mostrará al usuario, valores por defecto, validación de expresiones regulares, etc.

Inyección de dependencia de rol OAOO

Tomaré el ejemplo de lo que sucede con yourlabs.traefik (un balanceador de carga basado en docker) que requiere yourlabs.docker que a su vez solo instala docker.

Sin embargo, para el propósito del ejemplo, usaré your.parent y your.child para representar el caso de uso de yourlabs.docker y yourlabs.traefik respectivamente.

En your.child/requirements.yml::

  • your.parent

En your.parent/requirements.yml::

  • yourlabs.remember

Así, your.child depende de your.parent, y your.parent depende de yourlabs.remember.

.. nota:: bigsudo asegura de manera transparente que los requisitos se instalen recursivamente cuando ejecutas bigsudo your.child.

Sin el rol remember, normalmente incluirías el rol your.parent de esta manera en la parte superior de your.child/tasks/main.yml::

  • name: Instalar your.parent antes de ejecutar nuestras tareas include_role: name=your.parent

Sin embargo, esto ejecutará el rol cada vez, haciendo que la ejecución sea más larga. Si no quieres esperar a que your.parent se ejecute completamente cada vez que ejecutas your.child, puedes transformar la tarea anterior de esta manera en la parte superior de your.child/tasks/main.yml:

.. código-yaml::

  • name: Instalar your.parent si nunca se ha hecho en este host include_role: name=your.parent when: ansible_facts['ansible_local']['your_parent']['state']|default('') != 'success'

Para que esto funcione, necesitarás agregar lo siguiente al final de your.parent/tasks/main.yml:

.. código-yaml::

  • include_role: name=yourlabs.remember tasks_from=success

Así, ejecutar bigsudo your.parent (también funciona con ansible) creará /etc/ansible/facts.d/your_parent.fact con el siguiente contenido::

#!/bin/sh echo '{ "state": "success" }'

Así es como puedes omitir la inclusión del rol la próxima vez.

Sigue leyendo para añadir tus variables de rol persistentes personalizadas con configuración interactiva.

Configuración de rol interactiva

En your.parent/vars/main.yml, define remember_fact que es el espacio de nombres para esta variable de despliegue del rol, así como las variables de las que depende tu rol::


remember_fact: your_parent remember:

  • name: email_enable question: ¿Activar un correo electrónico personalizado? default: false type: bool
  • name: email question: ¿Qué correo electrónico usar? type: email default: '{{ lookup("env", "USER") }}@{{ inventory_hostname }}' when: email_enable

Luego, en your.parent/tasks/main.yml, puedes incluir yourlabs.remember y cargará las variables y preguntará al usuario por nuevas variables de forma interactiva, bastante rápido gracias al Action Plugin::

  • include_role: name=yourlabs.remember

Puedes hacer más, consulta el test.yml que ejecuto con ansible-playbook -c local -i localhost, test.yml -v --become:

.. include:: test.yml

Implementaciones múltiples: espacio de nombres para variables

Para permitir múltiples implementaciones de un rol en el mismo host, es decir, para habilitar eXtreme DevOps necesitarás que tu remember_fact dependa de una variable.

Por ejemplo, quieres implementar un docker-compose en diferentes directorios en tu host. Así, necesitarás una variable home:

.. código-yaml::

remember:
- name: home
  question: ¿Qué directorio de inicio desplegar? (debe comenzar con /home para el ejemplo de regexp)
  default: /home/test
  type: path
  regexp: /home.*

Esto significa que si el usuario no pasa una variable home en la línea de comandos (es decir, con -e home=/home/bar) se pedirá el directorio de inicio. Ahora, todo lo que tenemos que hacer es reutilizar esa variable home en remember_fact para que se puedan espaciar las variables por directorio de inicio:

.. código-yaml::

remember_fact: your_role_j2((home))

Como puedes ver, usamos j2(( )) en lugar de {{ }}, esto es para evitar que Ansible lo renderice antes de obtener un valor para la variable hogar. De hecho, el plugin de acción remember hará:

  • intentar renderizar remember_fact para cargar variables existentes si las hay,
  • capturar excepciones AnsibleUndefinedVariable,
  • encontrar las definiciones para las variables indefinidas que necesita en remember,
  • preguntar por ellas sin guardar
  • cargar las variables existentes
  • y preguntar por cualquier nueva variable

Conclusión

Finalmente llegamos al punto donde tenemos una forma clara y relativamente fácil de:

  • inyectar dinámicamente roles de dependencia para acelerar ejecuciones posteriores de un rol, evitando efectivamente la ejecución doble innecesaria de roles de dependencia (como docker, balanceadores de carga, automatización de nivel inferior...)
  • suprimir el inventario porque cada servidor mantiene sus variables, también es DRY por cierto, ¡así que ese es un repositorio menos por el que tendrás que preocuparte!
  • pregunta interactiva de hechos ya no es necesario leer la documentación antes de ejecutar un rol que encontraste en internet como root.

Créditos

Gracias a totakoko de beta.gouv.fr por las largas discusiones y por demostrar que mi inventario era excesivo y que era posible sin ello ;)

Gracias a #ansible@irc.freenode.net, uno de los mejores canales de IRC, a saber:

  • agaffney
  • mackerman
  • jborean93

Y gracias a ti por leer mi pequeña aventura.

Acerca del proyecto

Ansible role to inject dependencies OAOO (once and only once).

Instalar
ansible-galaxy install yourlabs.remember
Licencia
Unknown
Descargas
4k
Propietario
OSS Hack'n'Dev, we provide all kind of paid services on OSS and sponsor OSS