プレイヤーズ・ハイ

 雑多な日記

pssh で複数サーバーに ssh, scp, rsync

マカーなら csshx 使いましょう。

それか Rake タスク書くとか。

以上。

物好きな方は以下お読みください。

★ ★ ★ ★ ★

複数のサーバーに対して ssh, scp, rsync を実行できる pssh についてまとめてみました。

環境

  • Amazon Linux AMI 2014.03.2 (PV) - ami-25dd9324

pssh に関わる設定

未知のホストに対する接続の可否を聞かれたくない場合は ~/.ssh/config に以下を追記します。

host *  
    StrictHostKeyChecking no

pssh の使い方

並列に SSH

  • 1 台
sudo -u go pssh -H server001 -i uptime
[1] 12:26:37 [SUCCESS] server001
 12:26:37 up 41 days,  1:43,  0 users,  load average: 0.82, 1.08, 1.11
  • 2 台
sudo -u go pssh -H server001 -H server002 -i uptime
[1] 12:27:08 [SUCCESS] server001
 12:27:08 up 41 days,  1:44,  0 users,  load average: 0.92, 1.07, 1.10
[2] 12:27:09 [SUCCESS] server002
 12:27:09 up 63 days, 25 min,  0 users,  load average: 0.66, 1.15, 1.05
  • 複数台
sudo -u go pssh -h /var/pssh/server.list -i uptime
[sudo] password for go:
[1] 12:54:42 [SUCCESS] server011
 12:54:42 up 138 days, 16:10,  0 users,  load average: 14.40, 15.67, 15.12
[2] 12:54:42 [SUCCESS] server012
 12:54:42 up 138 days, 16:10,  0 users,  load average: 11.74, 13.49, 13.91
[3] 12:54:42 [SUCCESS] server013
 12:54:42 up 138 days, 16:10,  0 users,  load average: 17.12, 16.61, 15.69
[4] 12:54:42 [SUCCESS] server014
 12:54:42 up 138 days, 16:10,  0 users,  load average: 17.23, 15.45, 14.73
以下略 

pscp

parallel scp

$ pscp -h [リストファイル名] -l [コマンド実行ユーザ名] [ローカルのファイルパス] [リモートのファイルパス]

例) crontab 設定用のファイルを各サーバーに配り,crontab 更新

$ pscp -h /var/pssh/server/server.list -l go /home/go/server_go_cron /tmp/server_go_cron
$ pssh -h /var/pssh/server/server.list -l go crontab /tmp/server_go_cron

prsync

parallel rsync

$ prsync -h [リストファイル名] -l [コマンド実行ユーザ名] [ローカルパス] [リモートパス]

rsync のオプションがすべて使えるわけではなく,オーナーなどをそのまま同期できないため,pssh と rsync を組み合わせる方法の方がよいです。

$ pssh -h server.list -l root "rsync -navzHe ssh --delete 【pssh実行ホスト名もしくはIPアドレスを指定】:【同期するファイルパス】【 同期先のファイルパス】"

例) server001 の /tmp/pssh を server001 の /tmp/pssh と同期

$ pssh -H server001 -l dsp "rsync -avzHe --dry-run --delete -e ssh dsp@server001:/tmp/pssh /tmp"
最初は確認のために必ず dry-run を付けましょう。

注意) 対向のサーバーから server001 へ nopass で ssh できるようになっておくのが前提です。

ちなみに私が管理しているサーバー群は AWS 上に配置されているので、サーバーリストは自動更新するようにしてあります。

はじめてUNIXで仕事をする人が読む本 (アスキー書籍)

はじめてUNIXで仕事をする人が読む本 (アスキー書籍)

UNIXシェルスクリプト マスターピース132

UNIXシェルスクリプト マスターピース132