Werke ab Version 20150922:
parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf'
Ich verwende Ansible, um einige Konfigurationen auf mehreren Knoten einzurichten, und als Teil dieses Setups muss ich eine große Datei in n Zeilen aufteilen und jeden Teil in eine Remote-Datei kopieren, ohne eine lokale Kopie jedes Blocks zu erstellen (wie der Befehl bash split) tut). Ansible kann dies nicht standardmäßig tun (oder ich habe gerade nicht herausgefunden, wie es geht), also entschied ich mich für GNU Parallel. Ich habe hier herausgefunden, dass das Kopieren von stdin leicht wie folgt erfolgen kann:
~$ echo "Lots of data" | ssh user@example.com 'cat > big.txt'
Aber ich möchte dies gleichzeitig mit mehreren Gastgebern machen! Hier ist ein Beispiel:
~$ cat hosts.txt 1.1.1.1 2.2.2.2 3.3.3.3 ~$ cat data.txt lots of ... lines
Ich berechne die Anzahl der Zeilen pro Knoten, indem ich "wc -l" mache und die zweite Anzahl durch die erste dividiere. Im Grunde würde der nächste Schritt also so aussehen:
~$ cat data.txt | parallel -S `cat hosts.txt | tr "\n" ","` -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'"
Aber wie kann ich einen Befehl für jeden Host starten, womit sollte ich $ HOST ersetzen? Ich dachte darüber nach, zwei Eingänge zu kombinieren (einer als Hosts), aber immer noch keine Ahnung, wie das geht.
Würde mich wirklich über irgendwelche Gedanken freuen.
Werke ab Version 20150922:
parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf'