parallel-ssh を使って複数サーバを同時に操作する
tl; dr
- 2台〜100台程度のサーバに対して、同じオペレーションを同時に実行したい
- parallel-ssh (pssh) の各種コマンドを使うと便利
- ただし、リモートサーバで sudo が必要な場合は Ansible 等の他ツールが必要
parallel-ssh のセットアップ
インストール
parallel-ssh - PSSH: Parallel SSH Tools - Google Project Hosting
- Mac
$ brew install pssh
- RHEL系
# yum install pssh
ホストリストの準備
- 任意のパスにテキストファイルを作成
server-1 server-2 server-3 root
- 1行ずつ、接続先サーバのホスト名またはIPアドレスを記述
- ログインユーザの指定も可能
目的別コマンド実行例
SSH 認証のための設定
parallel-ssh を使うには、各サーバに SSH で接続できることが前提となる。
ssh-copy-id コマンドを利用して、~/.ssh/id_rsa の内容を登録する場合は以下。
$ for h in $(cat ~/hosts); do ssh-copy-id $h; done
pssh の使い方
- 基本形
$ pssh -h ~/hosts -i 'hostname' [1] 04:09:13 [SUCCESS] server-1 server-1 [2] 04:09:13 [SUCCESS] server-2 server-2
- ホスト名を直接指定
$ pssh -H server-1 -H server-2 -i 'hostname' [1] 04:09:13 [SUCCESS] server-1 server-1 [2] 04:09:13 [SUCCESS] server-2 server-2
- タイムアウトを無制限に
$ pssh -h ~/hosts -t 0 -i 'hostname' [1] 04:09:13 [SUCCESS] server-1 server-1 [2] 04:09:13 [SUCCESS] server-2 server-2
- アウトプットをすぐに表示
$ pssh -h ~/hosts -P 'hostname' server-1: server-1 [1] 04:13:28 [SUCCESS] server-1 server-2: server-2 [2] 04:13:28 [SUCCESS] server-2
- リモートでバックグラウンド実行
$ pssh -h ~/hosts -i 'nohup your_command > /path/to/output 2>&1 </dev/null &' [1] 04:13:28 [SUCCESS] server-1 [2] 04:13:28 [SUCCESS] server-2
バッファの影響で、標準出力の出力先ファイルがリアルタイムに更新されない場合がある。
対応にはハックが必要: linux - redirect nohup stdout and flush - Stack Overflow
ファイル転送
- ローカルからリモートに転送
$ prsync -h ~/hosts -av /data/input/ /data/input/
- パスの末尾にスラッシュを付けると、ディレクトリ間の同期となる。(rsync の仕様)
- -z (圧縮オプション) は付けると CPU がボトルネックになって大幅に性能が劣化する場合がある。ナローバンドでなければ、付けないほうが良さそうだ。
- リモートからローカルに転送
$ pssh -h ~/hosts -p 4 -i 'rsync -e "ssh -o StrictHostKeyChecking=no" -av \ /data/output/ server-1:/data/output/'
- 全サーバから server-1 に集約する例
- -p オプションを指定して、並列度を制限している。
こうしないと、コネクションが多すぎて接続できない場合がある。 - rsync -e "ssh -o ..." という書式で SSH オプションを指定。
ここではホストキーのチェックを回避している。
リモートサーバで sudo が必要な場合
- Ansible で代用
$ ansible -i ~/hosts all --sudo -K \ -a 'bash -c "cd /path/to/your/app && make install"'
0 件のコメント:
コメントを投稿