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:
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
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
transfer_method = piped
Por cierto, en la rama "desarrollar" esta configuración también existe
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
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.
Solo los usuarios registrados pueden participar en la encuesta.
¿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