このエントリーをはてなブックマークに追加

4.1.6. pssh

4.1.6.1. 概要

pssh(Parallel ssh)とは、複数のホストに対して同じ処理が実行できる並行処理型のSSHツールです。
psshにはpscp、prsync、pslurp(複数サーバからファイルを収集)が含まれています。

4.1.6.2. インストール

4.1.6.2.1. setuptoolsのインストール

Pythonのパッケージンストールツールであるsetuptoolsが必要なのでインストールします
wgetもインストールされていなければインストールしておきます。
また、prsyncを利用するためにはrsyncコマンドも必要ですのでインストールします。
# yum install python-setuptools wget rsync -y

psshのバージョン確認は以下のURLで確認してください。

# cd /usr/local/src
# wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz
# tar zxvf pssh-2.3.1.tar.gz
# cd pssh-2.3.1
# python setup.py install

4.1.6.3. 使用方法

予め実行するホストに対してsshのパス無認証の設定を行っていることが前提になります。
またパス無認証時の一番最初のログイン時はyesかnoを質問されるのでyesで答えている必要もあります。

4.1.6.3.1. pssh

複数のホストに対して一斉に同じ処理をするコマンドです

4.1.6.3.1.1. 書式

pssh -h [リストファイル名] -l [マンドを実行するユーザ名] -i [コマンド]

4.1.6.3.1.2. オプション

オプションはpssh,pscp,plurpで共通です。

オプション 概要
-h ホストを記載したリストファイルを指定
-l リモートでコマンドを実行するユーザ
-p sshのポート番号を指定(指定しない場合はデフォルトの22番を利用)
–timeout コマンドのタイムアウト時間を指定(デフォルトは60秒)
–help helpを確認する
-i 結果をホスト毎に表示する
-o ログディレクトリを指定する、ホスト毎に結果が出力されます
-r 再帰的に処理を行います。ディレクトリを処理する場合は指定します
hオプションで指定するリストは以下のような感じです。ただサーバ名もしくはIPアドレスを並べただけのリストです。
$ cat server.lst
trust01
trust02

4.1.6.3.1.3. コマンド実行例

4.1.6.3.1.3.1. リストに記述されたホスト全てで実行

server.lstに記述されたサーバへrootでhostnameコマンドを実行しています。

# pssh -h server.lst -l root -i hostname
[1] 16:07:25 [SUCCESS] trust01
trust01
[2] 16:07:25 [SUCCESS] trust02
trust01
4.1.6.3.1.3.2. リストに記述されたホスト全てで実行しログも取得する
# pssh -o kekka -h server.lst -l root -i hostname
# cd kekka
kekkaディレクトリが自動的に作成されにホスト毎の結果が出力されています
ログは時刻とかが名前に含まれていないので上書きされるため注意してください。

4.1.6.3.2. pscp

複数のホストに対してscpを実行するコマンドです

4.1.6.3.2.1. 書式

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

4.1.6.3.2.2. コマンド実行例

pscpを利用してリストに記述されたホストに対してファイルをscpします。 oオプションを使用してもログは何も記述されていませんでした。

# pscp -h server.lst -l root -r /root/test.txt /tmp/test.txt

4.1.6.3.3. prsync

複数のホストとファイルを同期するコマンドです

4.1.6.3.3.1. 書式

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

4.1.6.3.3.2. コマンド実行例

注意点としてrsyncのオプションが全部使える訳ではありません。
なのでオーナーなどをそのまま同期できないので注意が必要です。
対処としてはprsyncを使用せずpsshとrsyncを組み合わせてリモート先でrsyncコマンドを実行するやり方がお勧めです。
その場合はリモート先からpsshを設定しているサーバへのsshノンパス設定が必要になるので少し面倒になります。
# prsync -h server.lst -r -l root /root/test/ /root/test/
4.1.6.3.3.2.1. psshとrsyncを組み合わせてファイルをローカルサーバから複数リモートサーバへ同期する
以下のrsyncのオプションにはnを利用しているため実際に同期する場合はnオプションを削除して実行してください。
stack01となっているところはpsshを利用するサーバのホスト名です。
# pssh -h server.lst -l root "rsync -navzHe ssh --delete 【pssh実行ホスト名もしくはIPアドレスを指定】:【同期するファイルパス】【 同期先のファイルパス】"

# pssh -h server.lst -l root "rsync -avzHe ssh --delete stack01:local_path remote_path"
リモートとローカルが逆になるので先にnオプションでドライランしてどうなるかを確認してからやるべきです。
実行例
# pssh -h server.lst -l root "rsync -avzHe ssh --delete 192.168.10.60:/root/test/ /root/test/"

またrsyncのオプションは気を付けてください。 deleteと-nオプションは確認しておいてください。

4.1.6.3.4. pslurp

複数のホストから一括でファイルを取得することができます。

4.1.6.3.4.1. 書式

pslurp -h [リストファイル名] -l [コマンド実行ユーザ名] -L [ファイルを保存するローカルパス] -r [リモートパス] [ローカルに保存するファイ名]

4.1.6.3.4.2. コマンド実行例

kekkaディレクトリにホスト名毎にファイルが保存されます。

# pslurp -h server.lst -l root -L /root/kekka -r /var/log/messages messages

4.1.6.3.5. pnuke

複数のホストで同時にプロセスをkillするコマンドです。
psshを使えばいいと思います。