Estrategia de ejecución y optimización
Objetivo del capítulo y requisitos
El capítulo anterior versó sobre la instalación de MediaWiki y la reducción al máximo de la no disponibilidad de los servidores. Otro método sería hacer que los playbooks se lanzaran de la manera más rápida posible.
Para ello, estudiará la noción de estrategia de ejecución (paralelismo, serialización, depurado). La última parte tratará de la implementación de la extensión Mitogen.
Estrategia de ejecución
1. Contexto
Cuando se ejecuta un playbook, algunas máquinas serán más lentas que otras a la hora de ejecutar las tareas. Una manera de ganar tiempo sería aumentando el número de operaciones en paralelo.
2. Gestión del número de tareas ejecutadas en paralelo
Ansible impone una limitación en el número de tareas ejecutadas de manera simultánea. Este valor es, por defecto, 5. Se puede cambiar este valor de la manera siguiente:
-
exportando la variable ANSIBLE_FORKS;
-
modificando el valor del campo forks en el archivo de configuración de Ansible, en la sección defaults.
He aquí un ejemplo de declaración para pasar a 10 ejecuciones en paralelo desde el archivo de configuración:
[defaults]
# Dont use cowsay please
nocows=1
# 10 tasks at a time
forks=10
También se puede especificar este valor desde la línea de comandos, usando la opción --fork <FORK_COUNT> (o -f para la versión abreviada).
3. Estrategia de ejecución: free
Ya ha visto la ejecución en paralelo de una tarea. Sin embargo, las operaciones se ejecutan siempre de la misma manera: lo hacen en serie y cada una tiene que esperar a que todas las máquinas terminen su actualización para ejecutar la tarea siguiente.
En el vocabulario de Ansible, se habla de estrategia de ejecución. Por defecto, usamos la estrategia linear. El problema de esta estrategia es que si algunas máquinas tardan más en realizar sus operaciones penalizarán a las demás.
Es posible cambiar esta estrategia gracias a los siguientes mecanismos:...
Depurado con Ansible
1. Contexto
Ya sabe cómo reducir el tiempo de ejecución de un playbook con la estrategia free. En realidad, el mecanismo de estrategias en Ansible es muy genérico. Hay otra estrategia muy práctica que se puede utilizar para la preparación de un playbook: debug. En las líneas siguientes verá como detectar y solucionar un problema en el momento de la ejecución de un playbook que contendrá un error.
La activación de esta estrategia se hace de la misma forma que la estrategia anterior:
-
ya sea a través de la configuración de Ansible (campo strategy=debug);
-
o por la variable de entorno ANSIBLE_STRATEGY=debug;
-
o, finalmente, por el campo strategy en el playbook.
Esta última manera solo debe utilizarse en el contexto de la puesta a punto. No olvide eliminarla una vez que la puesta a punto se termine.
Para tomar algunos ejemplos de uso del depurador, use un playbook que realice dos operaciones que muestren un error:
-
una ejecución del módulo shell con un comando que muestre un error (ls /does/not/exist);
-
una ejecución del módulo shell con una variable no definida undefined.
He aquí el playbook correspondiente. Guárdelo bajo el nombre de simple-error.yml:
- hosts: localhost
tasks:
- shell: ls /does/not/exist
- shell: echo {{undefined}}
2. Activar el depurador
Para activar el depurador, use la variable de entorno ANSIBLE_STRATEGY.
He aquí el comando que tiene que ejecutar para realizar esta operación:
$ export ANSIBLE_STRATEGY=debug
Ejecute ahora el playbook simple-error.yml para ver cómo se comporta Ansible en caso de error:
$ ansible-playbook...
Estudio del funcionamiento de Ansible
1. Contexto
La cualidad principal de Ansible es la de no necesitar ningún agente en las máquinas que administrará, aparte de la presencia del intérprete de Python. Pero en el caso en que una máquina no tuviera intérprete, aun así sería posible copiar los archivos o ejecutar comandos simples. De esta manera, se puede ejecutar la instalación de un intérprete de Python antes de iniciar el uso de módulos que permitan la ejecución de operaciones más complejas.
Pero esta ventaja puede convertirse en un defecto, sobre todo, cuando los playbooks que se quieran ejecutar lleven un gran número de operaciones.
2. Playbook de test
Para entenderlo mejor, creará un playbook de test. Este tendrá como objetivo la creación de directorios en la máquina actual con la ayuda de un bucle.
El bucle se hará gracias a la instrucción loop seguida de la ejecución de la función range. Esta última tomará como parámetro el número de iteraciones que se realizarán (50 por ejemplo). Esta ejecución se enviará al filtro list para permitir que Ansible haga las iteraciones. He aquí la instrucción correspondiente: {{ range(50) | list }}.
La creación del directorio se hará gracias al módulo file seguido de las opciones siguientes:
-
El campo path seguido de la ubicación que se va a crear (/tmp/test/{{ item }}).
-
El campo state seguido del estado esperado (directory).
En el encabezado del playbook, este último se ejecutará en la máquina localhost (hosts: localhost) y la obtención...
Presentación de Mitogen
1. Contexto
En el capítulo anterior, se ha presentado el funcionamiento de bajo nivel de Ansible. De estas observaciones podemos deducir que cada operación necesita de muchas acciones:
-
Creación de directorios.
-
Creación de archivos temporales.
-
Ejecución de comandos antes, durante y después de la realización de acciones.
En los playbooks simples, estas observaciones no tienen mucha importancia. Sin embargo, cuando las cosas se complican, estos lapsus de tiempo pueden ser muy importantes. Es común observar tiempos de ejecución de unas cuantas decenas de minutos.
Pero puede haber otro problema: si el disco está lleno (o en el caso de saturación de los inodos de un disco), Ansible no podrá intervenir en la máquina que presente este tipo de avería.
2. Presentación de Mitogen
Mitogen es una librería Python desarrollada y mantenida por David Wilson. Esta permite escribir programas Python que se replican a sí mismos y que son distribuidos.
Las máquinas remotas que usarán Mitogen solamente necesitan cumplir los requisitos de Ansible, es decir, una conexión que funcione correctamente (SSH u otro tipo de conexión) y un intérprete de Python. El objetivo de esta librería no es el de ofrecer un mecanismo genérico de ejecución del tipo RPC (Remote Procedure Call), sino de ser un dispositivo...