Bash: Como copiar um arquivo para vários servidores SSH, todos especificados em um arquivo de texto de lista?

1

Eu tenho um arquivo (digamos "thisfile.sh", por exemplo) que eu gostaria de copiar para vários servidores (dos quais alguns podem exigir autenticação de senha) ao iniciar meu arquivo bash, presumidamente com SCP. Todos os endereços do servidor são escritos uma linha por vez em um documento de texto, digamos que o arquivo é chamado "ServerList", por exemplo:

[email protected]
[email protected]
[email protected]
[...]

Como posso conseguir isso?

Editar: Pensei um pouco mais sobre isso, e ainda gostaria de terminar com o bash como uma novidade, vou usar uma alternativa um pouco mais tarde. Como eu poderia fazer isso usando o comando de cópia do SCP e uma variável no lugar do meu destino, algo como scp myfile $ Server: ~ / myfile . Dessa forma, eu tenho certeza que precisarei usar um loop de algum tipo, então ele passaria por todas as linhas quando eu copiasse.

    
por user3125996 06.08.2015 / 17:03

3 respostas

3

Se você quiser ficar no domínio somente bash:

while read server
    scp thisfile.sh $server:/some/location
    ssh $server /some/location/thisfile.sh
done < servers.txt

Isso solicitará a execução de um trabalho por vez e solicitará autenticação quando necessário

    
por 06.08.2015 / 18:15
0

Existem algumas maneiras de fazer isso. Você pode usar algo como ansible ou fabric para escrever um script que se conectará a todos os seus computadores e copiar o arquivo para eles e executar o script. ou você pode escrever um script bash / shell para copiar os arquivos e então rodar o script.

O Fabric e o Ansible têm uma curva de aprendizado ligeiramente superior, mas podem ser mais úteis e facilmente adicionar mais computadores ou alterar o script.

O bash ou shell script será mais fácil de escrever, mas um pouco mais difícil de adaptar se você precisar dele no futuro.

link - Tecido

link - Ansible

Aqui as guias para ansible e tecido

    
por 06.08.2015 / 17:25
0

Embora o Felipe tenha a melhor resposta para uma solução apenas para o bash, acho que o Ansible é muito superior para essa tarefa.

Você simplesmente precisa colocar todos os seus servidores em um arquivo de inventário como este:

[default]
firstserver.com     ansible_ssh_user=firstuser
secondserver.com    ansible_ssh_user=seconduser
thirdserver.com     ansible_ssh_user=thirduser

E um manual semelhante a este:

--- #copyfiles.yml
hosts: all
tasks:
- name: copy file to servers
  copy:
    src: /path/to/local/file
    dest: /path/to/remote/file

E, em seguida, execute:

ansible-playbook -i /path/to/inventory copyfiles.yml --ask-pass
    
por 23.08.2015 / 18:29