Pourquoi copier un répertoire avec Ansible-elle si lente?
Je suis en utilisant Ansible pour copier un répertoire (900 fichiers, 136MBytes) à partir d'un hôte à un autre:
---
- name: copy a directory
copy: src={{some_directory}} dest={{remote_directory}}
Cette opération a un incroyable 17 minutes, alors qu'un simple scp -r <src> <dest>
prend seulement 7 secondes.
J'ai essayé le mode Accéléré, qui, selon le ansible docs "peut être n'importe où à partir de 2-6x plus rapide que SSH avec ControlPersist activé, et 10x plus rapide que paramiko.", mais en vain.
- Je suis conscient que ce n'est un hachage MD5 et le valide, mais que le temps vous voyez permettrait de voir très grand.
- fonctionne sha1, en fait, et qui n'est pas responsable (même si c'était ma première estimation).
Vous devez vous connecter pour publier un commentaire.
TLDR: utilisation
synchronize
au lieu decopy
.Voici la
copy
de commande que j'utilise:Comme une supposition, je suppose que les opérations de synchronisation sont lents. Le les fichiers de documentation du module implique cette trop:
Creuser dans le code source montre chaque dossier est traité avec SHA1. C'est mis en œuvre à l'aide de hashlib.sha1. Un test local implique que ne prend que 10 secondes pour 900 fichiers (qui arrive de prendre de 400 mo d'espace).
Donc, la prochaine avenue. La copie est traitée avec module_utils/basic.py's atomic_move méthode. Je ne suis pas sûr si elle est accélérée permet de mode (c'est un la plupart fonctionnalité obsolète), mais j'ai essayé le pipelining, mettre ceci dans un local
ansible.cfg
:Il n'a pas apparaissent à l'aide; mon échantillon a 24 minutes . Il y a évidemment une boucle qui vérifie un fichier, télécharge, fixe les autorisations, puis se met sur le fichier suivant. C'est beaucoup de commandes, même si la connexion ssh est laissé ouvert. En lisant entre les lignes, il fait un peu de sens - le "transfert de fichiers" ne peut pas être fait dans le pipelining, je pense.
Donc, à la suite de l'astuce pour utiliser le
synchronize
commande:Qui a eu 18 secondes, même avec
pipeline=False
. Clairement, lesynchronize
de commande est le chemin à parcourir dans ce cas.Garder à l'esprit
synchronize
utilise rsync, qui, par défaut, le mod-le temps et la taille du fichier. Si vous voulez ou avez besoin de somme de contrôle, ajouterchecksum=True
à la commande. Même avec la somme de contrôle est activé, le temps n'a pas vraiment changer encore de 15 à 18 secondes. J'ai vérifié l'option de contrôle était en cours d'exécutionansible-playbook
avec-vvvv
, qui peut être vu ici:synchronize
surcopy
, vous aurez besoin de spécifierrsync_opts
si vous utiliser rsync/ssh avec les différents ports/utilisateurs/configs: hairycode.org/2016/02/22/...copy
module de réglageremote_src: yes
? Il est probable quesynchronize
ne peut pas être utilisé dans cette situation.synchronize
configuration peut être difficile dans des environnements avecbecome_user
. Pour les déploiements vous pouvez archiver le répertoire source et le copier avecunarchive
module:archive
semble appuyer uniquement à distance des dossiers.tar -cvpzf
, puis mettre de l'archive résultante dansfiles/
sous-dossier d'un playbook et ensuite utiliserunarchive
module pour un déploiement plus rapide, plus rapide quescp
dans la question.archive
en utilisantdelegate_to
.Meilleure solution que j'ai trouvé est juste zip le dossier et utiliser la
unarchive
module.450 MO dossier terminé en 1 minute.
Tout
synchronize
est plus préférable dans ce cas quecopy
, il est cuit par rsync. Cela signifie que les inconvénients de rsync (architecture client-serveur) sont restés ainsi: le CPU et le disque limites, lent à la file delta calculs pour les gros fichiers, etc. Sons, comme pour vous, la vitesse est critique, alors je vous suggère de regarder pour une solution basée sur les réseaux peer-to-peer, de l'architecture, qui est rapide et adaptable à de nombreuses machines. Quelque chose comme BitTorrent basé sur, Resilio Connecter.