おそらくSCPを使用してbashファイルを起動したときに、一度に複数のサーバー(パスワード認証が必要なサーバーもあります)にコピーしたいファイル(たとえば「thisfile.sh」など)があります。すべてのサーバーアドレスは、テキストドキュメントに一度に1行ずつ書き込まれます。たとえば、ファイルの名前が「ServerList」であるとします。例:
[email protected]
[email protected]
[email protected]
[...]
どうすればこれを達成できますか?
編集:これについてもう少し考えましたが、bashをスターターとしてこれを実行したいので、少し後で別の方法を使用します。 SCP copyコマンドと、宛先の代わりに、次のような変数を使用することで、どのように実行できると思いますかscp myfile $ Server:〜/ myfile。このように、私はある種のループを使用する必要があると確信しているので、それをコピーするときにすべての行を通過します。
Bashのみのドメインにとどまりたい場合:
while read server
scp thisfile.sh $server:/some/location
ssh $server /some/location/thisfile.sh
done < servers.txt
これにより、一度に1つの作業が実行され、必要に応じて認証を求められます。
これを達成する方法はいくつかあります。 ansibleやfabricなどを使用して、すべてのコンピューターに接続し、ファイルをコンピューターにコピーしてスクリプトを実行するスクリプトを作成できます。または、bash/Shellスクリプトを記述してファイルをそこにコピーしてから、スクリプトを実行することもできます。
FabricとAnsibleの学習曲線はわずかに高くなりますが、より便利で、コンピューターを追加したり、スクリプトを簡単に変更したりできます。
BashまたはShellスクリプトは記述が簡単ですが、将来必要になった場合に適応させるのは少し難しくなります。
http://docs.ansible.com/ansible/intro_getting_started.html -Ansible
ここにansibleとファブリックのガイドがあります
Felipeはbashのみのソリューションに対する最良の答えを持っていますが、Ansibleはこのタスクにははるかに優れていると思います。
すべてのサーバーを次のようなインベントリファイルに入れる必要があります。
[default]
firstserver.com ansible_ssh_user=firstuser
secondserver.com ansible_ssh_user=seconduser
thirdserver.com ansible_ssh_user=thirduser
そして、次のようなプレイブック:
--- #copyfiles.yml
hosts: all
tasks:
- name: copy file to servers
copy:
src: /path/to/local/file
dest: /path/to/remote/file
そして、実行します:
ansible-playbook -i /path/to/inventory copyfiles.yml --ask-pass