web-dev-qa-db-ja.com

リモート管理スクリプトを作成する

さまざまなサーバーに接続してそれらのサーバーでコマンドを実行するスクリプトをローカルで実行できる必要があります。これを達成するための最良の方法は何ですか?

6
Josh K

個人的には Capistrano を使用します。それは友好的でRubyで書かれていて、彼らはすでにあなたのためにすべての面倒な作業をしました。

ウィキペディアから:

Capistranoは、SSHを介して複数のリモートマシンでコマンドを並行して実行するためのユーティリティおよびフレームワークです。

5
Eli Frey

ssh hostname commandを使用してコマンドを実行できます。実行する必要のあるスクリプト全体がある場合は、最初にscpを使用してリモートホストに転送し、次にsshを使用して実行します。

scp script.sh Host:script.sh
ssh Host ./script.sh
4
KeithB

puppetchef のような構成管理を使用するのはどうですか?これは、たった1つのスクリプトでは少し上回っているかもしれませんが、そのようなスクリプトが複数必要な場合は、検討する価値があるかもしれません。

3
txwikinger

キー認証でsshを使用しますが、sshには、特定のアカウントが特定のIPからのみログインできるようにする方法があると思います。そのため、キーにパスフレーズを設定したくない場合があるため、これに制限します(それを回避するためのキーマネージャーですが、制限もあります)

2
xenoterracide

sshを利用して多くのマシンと同時に通信するdssh.shというシェルスクリプトにかなり満足しています。多数のマシンで同じコマンドを同時に実行し、それらがすべて終了するのを待ってから戻ることができます。ダウンロードして詳細を知るために、私が見つけた最良のリファレンスは BASH Cures Cancerブログ です。

0
Mike Gray

クイックバッシュの「for」ループが最も簡単な場合があります。おそらく次のようなものです。

for h in Host1 Host2 Host3
do 
   echo $h
   ssh [email protected]$h "ps -ef"
done

もちろん、cfengine/puppet/chef/capistranoはより優れた構成管理オプションです。さまざまなシェルにインタラクティブにコマンドを送信したい場合は、clusterm(http://sourceforge.net/projects/clusterm/)も確実な選択肢です。

0
Mike

PuppetとChefは「プル」システムであり、Capistrano、Fabric、またはssh- loopでfor(1)を使用して実装された補完的な「プッシュ」システムが必要であることがわかりました。もちろん、これは認証用の公開鍵も意味します。幸いなことに、それらはPuppetまたはChefによって管理できます。

0
rcrowley

私は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")
0
lahjaton_j