Funciona a partir da versão 20150922:
parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf'
Estou usando o Ansible para configurar algumas configurações em vários nós e, como parte dessa configuração, preciso dividir um arquivo grande por linhas n e copiar cada parte em um arquivo remoto sem criar cópia local de cada pedaço (como o comando bash split ). O Ansible não pode fazer isso por padrão (ou eu simplesmente não descobri como fazer isso ainda), então eu decidi usar o GNU Parallel. Eu descobri aqui que copiar de stdin pode ser feito facilmente assim:
~$ echo "Lots of data" | ssh [email protected] 'cat > big.txt'
Mas eu quero fazer isso simultaneamente para vários hosts! Então, aqui está um exemplo de entrada:
~$ cat hosts.txt
1.1.1.1
2.2.2.2
3.3.3.3
~$ cat data.txt
lots
of
...
lines
Eu calculo o número de linhas por nó fazendo "wc -l" e dividindo o segundo número pelo primeiro. Então, basicamente, o próximo passo seria algo assim:
~$ cat data.txt | parallel -S 'cat hosts.txt | tr "\n" ","' -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'"
mas como posso iniciar um comando para cada host, com o que devo substituir o $ HOST? Pensei em combinar duas entradas (uma sendo hosts), mas ainda não tenho ideia de como fazer isso.
Eu realmente aprecio todos os pensamentos.
Tags ssh scp linux ansible gnu-parallel