2 votes

Utilisation de GNU Parallel pour scp un énorme fichier en le divisant par morceau par hôte

J'utilise Ansible pour mettre en place une configuration sur plusieurs nœuds, et dans le cadre de cette configuration, j'ai besoin de diviser un gros fichier en deux parties. n et copier chaque partie dans un fichier distant sans créer de copie locale de chaque morceau (comme bash divisé le fait). Ansible ne peut pas le faire par défaut (ou je n'ai pas encore trouvé comment le faire), alors j'ai décidé d'utiliser GNU Parallel. J'ai trouvé aquí que la copie à partir de stdin peut être facilement faite comme ceci :

~$ echo "Lots of data" | ssh user@example.com 'cat > big.txt'

Mais je veux faire cela simultanément sur plusieurs hôtes ! Voici donc un exemple d'entrée :

~$ cat hosts.txt
1.1.1.1
2.2.2.2
3.3.3.3

~$ cat data.txt
lots
of
...
lines

Je calcule le nombre de lignes par noeud en faisant "wc -l" et en divisant le second nombre par le premier. Donc, en gros, la prochaine étape serait quelque chose comme ça :

~$ cat data.txt | parallel -S `cat hosts.txt | tr "\n" ","` -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'"

mais comment puis-je lancer une commande pour chaque hôte, par quoi dois-je remplacer $HOST ? J'ai pensé à combiner deux entrées (l'une étant les hôtes), mais je ne sais toujours pas comment faire.

J'apprécierais vraiment toute réflexion.

1voto

Ole Tange Points 4059

Fonctionne à partir de la version 20150922 :

parallel-20150922 -a bigfile --roundrobin  --pipepart --slf hosts.txt -j1 'cat > giraf'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X