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.
ansible-galaxy install yourlabs.remember