Acelerando Ansible

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

Aquí y a continuación analizamos Ansible 2.9.x, que se instaló en un entorno virtual recién creado en su forma favorita.

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

Tubería

Es posible que algunos ya hayan oído hablar de la necesidad de utilizar canalización, es decir, no copiar módulos al sistema de archivos del sistema de destino, sino transferir un archivo zip envuelto en Base64 directamente a la entrada estándar del intérprete de Python, pero otros pueden no, pero el hecho sigue siendo un hecho: esta configuración sigue estando subestimado. Desafortunadamente, algunas de las distribuciones populares de Linux utilizadas para configurar sudo no muy bien de forma predeterminada, por lo que este comando requería un tty (terminal), por lo que Ansible dejó esta configuración tan útil deshabilitada de forma predeterminada.

pipelining = True

Recopilando hechos

¿Sabías que con la configuración predeterminada, Ansible para cada jugada inicia la recopilación de datos para todos los hosts que participan en ella? En general, si no lo sabías, ahora lo sabes. Para evitar que esto suceda, debe habilitar el modo de solicitud explícita para recopilar datos (explícito) o el modo inteligente. En él, se recopilarán datos solo de aquellos anfitriones que no se encontraron en jugadas anteriores.
UPD. Al copiar, deberá seleccionar una de estas configuraciones.

gathering = smart|explicit

Reutilizar conexiones ssh

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

Puede evitar el paso de restablecer una conexión ssh en dos niveles a la vez: tanto directamente en el cliente ssh como al transferir archivos al host administrado desde el administrador.
Para reutilizar una conexión ssh abierta, simplemente pase las claves necesarias al cliente ssh. Luego comenzará a hacer lo siguiente: al establecer una conexión ssh por primera vez, creará adicionalmente un llamado socket de control, en instalaciones posteriores verificará la existencia de este mismo socket y, si tiene éxito, reutilizará el conexión ssh existente. Y para que todo esto tenga sentido, establezcamos el tiempo para mantener la conexión cuando esté inactiva. Puedes leer más en documentación ssh, y en el contexto de Ansible simplemente usamos "reenviar" 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, simplemente especifique otra configuración desconocida ssh_tranfer_method. La documentación sobre este tema es extremadamente tacaño y engañoso, ¡porque esta opción funciona bastante bien! pero leyendo código fuente le permite comprender qué sucederá exactamente: el comando dd se ejecutará en el host administrado y trabajará directamente con el archivo deseado.

transfer_method = piped

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

No tengas miedo al cuchillo, ten miedo al tenedor.

Otra configuración ú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 lenguaje, se utilizan procesos, no subprocesos, porque Ansible todavía admite Python 2.7; no hay asincio para usted, ¡no tiene sentido introducir un comportamiento asincrónico aquí! De forma predeterminada, Ansible se ejecuta cinco trabajadores, pero si se le pregunta correctamente, lanzará más:

forks = 20

Solo les advierto de inmediato que aquí pueden surgir algunas dificultades relacionadas con la cantidad de memoria disponible en la máquina de control. En otras palabras, puedes, por supuesto, establecer forks=100500, pero ¿quién dijo que funcionaría?

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 un inventario YaML normal de una persona sana, entonces puede 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 “gathering = smart/explicit” y “forks = 20”: sus equivalentes de YaML no existen. O los configuramos en ansible.cfg o los pasamos a través de las variables de entorno ANSIBLE_GATHERING y ANSIBLE_FORKS.

Acerca del mitógeno
- ¿Dónde está eso de Mitogen? - tienes derecho a preguntar, querido lector. En ninguna parte de este artículo. Pero si realmente está listo para leer su código y descubrir por qué su libro de estrategias falla con Mitogen, pero funciona bien con Ansible básico, o por qué el mismo libro de estrategias funcionaba bien antes, pero después de una actualización comenzó a hacer cosas extrañas, bueno, Mitogen. potencialmente podría ser su herramienta. Aplíquelo, compréndalo, escriba artículos: lo leeré con interés.

¿Por qué no uso personalmente Mitogen? Porque gladiolo funciona sólo mientras las tareas sean realmente sencillas y todo esté bien. Sin embargo, si gira un poco hacia la izquierda o hacia la derecha, ya está, hemos llegado: en respuesta, un puñado de excepciones confusas vuelan hacia usted y, para completar el cuadro, solo falta la frase común "gracias a todos". , todos son libres”. En general, no quiero perder el tiempo descubriendo las razones del próximo "golpe subterráneo".

Algunas de estas configuraciones fueron descubiertas durante el proceso de lectura. código fuente complemento de conexión con el nombre autoexplicativo “ssh.py”. Comparto los resultados de la lectura con la esperanza de que inspire a alguien más a mirar las fuentes, leerlas, verificar la implementación, compararlas con la documentación; después de todo, tarde o temprano todo esto le traerá resultados positivos. ¡Buena suerte!

Solo los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Cuál de las siguientes configuraciones de Ansible utiliza para acelerar sus proyectos?

  • 69,6%canalización = true32

  • 34,8%reunión = inteligente/explícito16

  • 52,2%ssh_args = "-o ControlMaster=auto -o ControlPersist=..."24

  • 17,4%método_transferencia = canalizado8

  • 63,0%tenedores = XXX29

  • 6,5%Nada de esto, solo Mitogen3

  • 8,7%Mitogen + anotaré cuál de estas configuraciones4

46 usuarios votaron. 21 usuario se abstuvo.

¿Quieres más cosas sobre Ansible?

  • 78,3%si, por supuesto54

  • 21,7%¡Sí, sólo quiero más cosas duras!15

  • 0,0%no, y no es necesario para nada0

  • 0,0%no, es complicado!!!0

69 usuarios votaron. 7 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario