さまざまなサーバーに接続してそれらのサーバーでコマンドを実行するスクリプトをローカルで実行できる必要があります。これを達成するための最良の方法は何ですか?
個人的には Capistrano を使用します。それは友好的でRubyで書かれていて、彼らはすでにあなたのためにすべての面倒な作業をしました。
ウィキペディアから:
Capistranoは、SSHを介して複数のリモートマシンでコマンドを並行して実行するためのユーティリティおよびフレームワークです。
ssh hostname command
を使用してコマンドを実行できます。実行する必要のあるスクリプト全体がある場合は、最初にscpを使用してリモートホストに転送し、次にsshを使用して実行します。
scp script.sh Host:script.sh
ssh Host ./script.sh
キー認証でsshを使用しますが、sshには、特定のアカウントが特定のIPからのみログインできるようにする方法があると思います。そのため、キーにパスフレーズを設定したくない場合があるため、これに制限します(それを回避するためのキーマネージャーですが、制限もあります)
ssh
を利用して多くのマシンと同時に通信するdssh.sh
というシェルスクリプトにかなり満足しています。多数のマシンで同じコマンドを同時に実行し、それらがすべて終了するのを待ってから戻ることができます。ダウンロードして詳細を知るために、私が見つけた最良のリファレンスは BASH Cures Cancerブログ です。
クイックバッシュの「for」ループが最も簡単な場合があります。おそらく次のようなものです。
for h in Host1 Host2 Host3
do
echo $h
ssh user@$h "ps -ef"
done
もちろん、cfengine/puppet/chef/capistranoはより優れた構成管理オプションです。さまざまなシェルにインタラクティブにコマンドを送信したい場合は、clusterm(http://sourceforge.net/projects/clusterm/)も確実な選択肢です。
PuppetとChefは「プル」システムであり、Capistrano、Fabric、またはssh
- loopでfor
(1)を使用して実装された補完的な「プッシュ」システムが必要であることがわかりました。もちろん、これは認証用の公開鍵も意味します。幸いなことに、それらはPuppetまたはChefによって管理できます。
私は1年前にまったく同じ質問をしていました、そして何人かの人々に尋ねた後、私はFabricから始めました。シンプルさのために、PuppetやChefよりも私に勧められました。
同じ機能でローカルコマンドとリモートコマンドを簡単に組み合わせることができます。また、Bashの代わりにPythonを使用できることは、ローカル/リモートコマンド以外に多くのヘルパーコードを実行する必要がある場合に役立つ注目すべきアップグレードです。簡単なことを機能させるために、私はまだファブリックをお勧めします。
これがFabricの素晴らしい紹介です: http://www.slideshare.net/panopticdev/fabric-a-capistrano-alternative 著者は、単純なシステムでは、FabricがCapistranoよりも優れていると主張しています。
ここでは、実際の小さな例を示します。最新のgitリポジトリコード(code_dirに格納されている)をリモートマシンに転送してコンパイルします。
# Use: fab -H <username>@<test_computer_ip> compile_on_test_computer
@task
def compile_on_test_computer():
# create a remote dir for incoming updates
run("mkdir -p %s/update" % env.remoteDir)
# create a local dir for outgoing updates
lrun("mkdir -p %s/update" % env.localDir)
# archive latest code, be it committed or not
with lcd("%s/code_dir" % env.localDir):
lrun("uploadStash=`git stash create` && git archive -o ../update/code_outgoing.Zip $uploadStash || git archive -o ../update/code_outgoing.Zip HEAD")
# transfer source code to test computer, unzip and compile
put("%s/update/code_outgoing.Zip" % (env.localDir),
"%s/update/code_incoming.Zip" % (env.remoteDir),
mirror_local_mode=True)
with cd("%s" % env.remoteDir):
run("unzip -uo update/code_incoming.Zip -d code_dir")
run("cd code_dir && ./compile_and_install_all.sh")