Otimizando as Playbooks Ansible para rodar contra muitos hosts

4

Estou rodando o Ansible 2.0 no SLES 11 SP4 contra cerca de 430 máquinas e é muito lento, não sei dizer por que ele é tão lento, mas vai muito mais rápido se limitar o número de máquinas no inventário . Levou cerca de 7 horas para executar um manual de 3 tarefas (incluindo a coleta de fatos) e a 3ª tarefa foi uma ação local. Demora o mesmo tempo para reunir 2 arquivos de fatos de máquinas quando estou executando o inventário de todos os 430 como faz para processar totalmente 6 máquinas.

E ele usa 99,9% da CPU logo de cara:

root     11646 99.8  0.4 220188 61016 pts/1    Rl+  07:24   6:41                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11651  0.1  0.4 187396 58828 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11652  0.1  0.4 187812 59216 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11653  0.1  0.4 188052 59428 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11654  0.1  0.4 186148 57496 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11655  0.1  0.4 186552 57924 pts/1    Sl+  07:24   0:00                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...
root     11656  0.4  0.2 154948 25828 pts/1    Sl+  07:24   0:01                          \_ /usr/bin/python /usr/bin/ansible-playbook /etc/ansible/playbooks/checkhostnames.yml ...

O que é assustador, já que eu realmente esperava que isso otimizasse nossos processos ssh serializados, parece que vai sugar todos os recursos.

quando eu strace o pid principal, ele parece estar executando stat no arquivo de inventário repetidas vezes.

Estou mantendo todos os meus host vars em um arquivo de inventário que eu gero de um banco de dados. Eu tentei usar um inventário dinâmico, mas isso levou muito tempo para ser inicializado (acho que ele está acertando a consulta sql várias vezes)

Então, há um truque para executá-lo contra muitas máquinas?

Já experimentei todos os truques no link

Eu também tentei dividi-lo colocando host_vars para cada host em seu próprio arquivo - percebi que a Strace estava me dizendo que estava analisando meu arquivo de inventário 500k constantemente. Mas isso não ajudou muito.

Eu troquei meu manual para apenas fazer um olá, sem coletar fatos

quando executo um arquivo de inventário com apenas 3 hosts nele, obtenho

real    0m1.996s
user    0m0.400s
sys     0m0.112s

quando eu executo um arquivo de inventário com todos os 430 hosts e limito apenas aos 3 primeiros, eu o faço em , esses são hosts diferentes - mas a mesma marca de máquina :

real    0m11.989s
user    0m13.693s
sys     0m0.552s

e quando eu executo um arquivo de inventário com todos os 430 hosts sem limite (e ctrl-c após o terceiro, eu recebo:

real    2m50.961s
user    2m56.495s
sys     0m0.764s

Então, isso me faz pensar que não está acontecendo muita coisa nos bastidores e algo está intensamente bloqueando.

    
por Peter Turner 28.07.2016 / 14:42

1 resposta

2

Em primeiro lugar, você precisa considerar o armazenamento em cache dos fatos.

Veja aqui como:

link

Você verá um desempenho incrível em gather-facts, mesmo com o armazenamento em cache em um arquivo.

Então você pode considerar melhorar o nível de paralelismo com -f

man ansible-playbook

   -f NUM, --forks=NUM
       Level of parallelism.  NUM is specified as an integer, the default is 5.

para algo maior que 5

    
por 01.08.2016 / 20:03

Tags