Acelera Ansible

Turbocompresor seccional


No es ningún secreto que con la configuración predeterminada, es posible que Ansible no haga su trabajo muy rápido. En el artículo señalaré varias razones para esto y ofreceré un mínimo útil de configuraciones que, muy posiblemente, realmente aumentarán la velocidad de su proyecto.



Hablamos aquí y más de Ansible 2.9.x, que se instaló en el virtualenv recién creado de su manera favorita.



Después de la instalación, creamos un archivo "ansible.cfg" junto a su libro de jugadas; esta ubicación le permitirá transferir estas configuraciones junto con el proyecto, además de que se cargarán de forma bastante automática.



Canalización



Alguien ya pudo escuchar sobre la necesidad de usar canalización, es decir, no copiar módulos al FS del sistema de destino, sino transferir el archivo zip empaquetado en Base64 directamente al stdin del intérprete de Python, pero el hecho permanece : Esta configuración todavía se subestima. Desafortunadamente, algunas de las distribuciones populares de Linux utilizadas para configurar sudo de forma predeterminada no muy bien, por lo que este comando requería un tty (terminal), por lo que en Ansible esta configuración muy útil se dejó deshabilitada de forma predeterminada.



pipelining = True


Recolectando hechos



¿Sabías que con la configuración predeterminada, Ansible para cada jugada iniciará una recopilación de datos de todos los anfitriones que participan en ella? En general, si no lo sabía, ahora lo sabe. Para evitar que esto suceda, debe habilitar el modo de solicitud explícita para recopilar hechos (explícito) o el modo inteligente. En él, se recopilarán datos solo de aquellos anfitriones que no se hayan encontrado en jugadas anteriores.

UPD. Al copiar, deberá elegir una de estas configuraciones.



gathering = smart|explicit


Reutilización de conexiones ssh



Si alguna vez ha ejecutado Ansible en modo de depuración (la opción "v" se repite de una a nueve veces), es posible que haya notado que las conexiones ssh se establecen y caen constantemente. Entonces, también hay un par de sutilezas aquí.



Puede evitar la etapa de restablecer una conexión ssh en dos niveles a la vez: ambos directamente en el cliente ssh y al transferir archivos a un host administrado desde un administrador.

Para reutilizar una conexión ssh abierta, simplemente pase las claves necesarias al cliente ssh. Luego, comenzará a hacer lo siguiente: cuando establezca por primera vez una conexión ssh, cree adicionalmente un llamado socket de control, en los siguientes: verifique la existencia de este mismo socket y, si tiene éxito, reutilice la conexión ssh existente. Y para que todo esto tenga sentido, estableceremos el tiempo para guardar la conexión cuando esté inactiva. Se pueden encontrar más detalles en la documentación de ssh , y en el contexto de Ansible, simplemente usamos el "reenvío" de las opciones necesarias al cliente ssh.



ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"


Para reutilizar una conexión ssh ya abierta al transferir archivos a un host administrado, solo necesita especificar una configuración desconocida más ssh_tranfer_method. La documentación sobre este tema es extremadamente escasa y engañosa, ¡porque esta opción funciona por sí sola! Pero leer el código fuente le permite comprender qué sucederá exactamente: el comando dd se lanzará en el host administrado, trabajando directamente con el archivo requerido.



transfer_method = piped


Por cierto, en la rama "desarrollar" esta configuración también existe y no ha ido a ninguna parte .



No le tengas miedo al cuchillo, tenle miedo al tenedor



Otro ajuste útil son las horquillas. Determina la cantidad de procesos de trabajo que se conectarán simultáneamente a los hosts y realizarán tareas. Debido a las peculiaridades de Python como PL, son los procesos, no los subprocesos, los que se utilizan, porque Ansible todavía es compatible con Python 2.7; no hay asincronía para usted, ¡no hay nada que genere asincronía aquí! De forma predeterminada, Ansible lanza cinco trabajadores, pero si se le pregunta correctamente, ejecutará más:



forks = 20


Solo le advierto de inmediato que puede haber algunas dificultades asociadas con la cantidad de memoria disponible en la máquina de control. En otras palabras, puede, por supuesto, poner horquillas = 100500, pero ¿quién dijo que funcionará?



Poniendolo todo junto



Como resultado, para ansible.cfg (formato ini), la configuración necesaria puede verse así:



[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped


Y si desea ocultar todo en el inventario YaML normal de una persona sana, entonces podría verse así:



---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m


Desafortunadamente, esto no funcionará con las configuraciones "reunir = inteligente / explícito" y "bifurcaciones = 20": no hay equivalentes de YaML. O los configuramos en ansible.cfg, o los pasamos a través de las variables de entorno ANSIBLE_GATHERING y ANSIBLE_FORKS.



Sobre mitógeno
— Mitogen? — , . — . , Mitogen, Ansible , , — , Mitogen . , , — .



Mitogen? , . — , : , « , ». , « ».



Algunas de estas configuraciones se descubrieron al leer el código fuente del complemento de conexión con el nombre autoexplicativo "ssh.py". Comparto los resultados de la lectura con la esperanza de que inspire a otra persona a mirar la fuente, leerlos, verificar la implementación, comparar con la documentación; después de todo, tarde o temprano, todo esto le traerá resultados positivos. ¡Buena suerte!



All Articles