Работает с версии 20150922:
parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf'
Я использую Ansible для настройки некоторой конфигурации на нескольких узлах, и в рамках этой настройки мне нужно разделить один большой файл на n строк и скопировать каждую часть в удаленный файл без создания локальной копии каждого чанка (например, команда bash split). делает). Ansible не может сделать это по умолчанию (или я просто еще не выяснил, как это сделать), поэтому я решил использовать GNU Parallel. Я обнаружил здесь, что копирование со стандартного ввода может быть легко сделано следующим образом:
~$ echo "Lots of data" | ssh user@example.com 'cat > big.txt'
Но я хочу сделать это одновременно нескольким хозяевам! Итак, вот пример ввода:
~$ cat hosts.txt 1.1.1.1 2.2.2.2 3.3.3.3 ~$ cat data.txt lots of ... lines
Я вычисляю количество строк на узел, выполняя "wc -l" и деля второе число на первое. Так что, в принципе, следующим шагом будет что-то вроде этого:
~$ cat data.txt | parallel -S `cat hosts.txt | tr "\n" ","` -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'"
но как я могу запустить одну команду для каждого хоста, чем я должен заменить $ HOST? Я думал о комбинировании двух входов (один из них является хостом), но все еще не знал, как это сделать.
Буду очень признателен за любые мысли.
Работает с версии 20150922:
parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf'