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

たくさんのサーバを管理している場合には、各サーバで同じコマンドを実行したいことが多々あります。

例えば各サーバのディスク容量を知りたいとか、ある設定が入っているかどうか確認したいという状況が考えられます。

ディスク容量の確認などは監視ツールなどが入っていればそういった監視画面を通じて見ることはできるかもしれませんが、設定の確認などになるとかなり手間がかかることが予想されます。

分散シェルというツールはこういった要望に応えるために作られています。今回はその中でも比較的簡単に使えるdshを紹介します。

dshはyumなどのリポジトリにはありませんので、別途rpmコマンドなどでインストールする必要があります。

インストール

dsh本体をダウンロードします。

$ wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/RHEL-5/x86_64/dsh-0.22.0-8.3.x86_64.rpm
--2013-11-27 11:11:13--  ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/RHEL-5/x86_64/dsh-0.22.0-8.3.x86_64.rpm
           => `dsh-0.22.0-8.3.x86_64.rpm'
ftp.pbone.net をDNSに問いあわせています... 85.14.85.4
ftp.pbone.net|85.14.85.4|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD (1) /mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/RHEL-5/x86_64 ... 完了しました。
==> SIZE dsh-0.22.0-8.3.x86_64.rpm ... 30566
==> PASV ... 完了しました。    ==> RETR dsh-0.22.0-8.3.x86_64.rpm ... 完了しました。
長さ: 30566 (30K) (確証はありません)

100%[=================================================================>] 30,566      20.5K/s 時間 1.5s

2013-11-27 11:11:20 (20.5 KB/s) - `dsh-0.22.0-8.3.x86_64.rpm' へ保存終了 [30566]

依存ライブラリをダウンロードします。

$ wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/CentOS_5/x86_64/libdshconfig-0.20.10-3.3.x86_64.rpm
--2013-11-27 11:14:32--  ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/CentOS_5/x86_64/libdshconfig-0.20.10-3.3.x86_64.rpm
           => `libdshconfig-0.20.10-3.3.x86_64.rpm'
ftp.pbone.net をDNSに問いあわせています... 85.14.85.4
ftp.pbone.net|85.14.85.4|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD (1) /mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/netmax/CentOS_5/x86_64 ... 完了しました。
==> SIZE libdshconfig-0.20.10-3.3.x86_64.rpm ... 22496
==> PASV ... 完了しました。    ==> RETR libdshconfig-0.20.10-3.3.x86_64.rpm ... 完了しました。
長さ: 22496 (22K) (確証はありません)

100%[=================================================================>] 22,496      15.6K/s 時間 1.4s

2013-11-27 11:14:40 (15.6 KB/s) - `libdshconfig-0.20.10-3.3.x86_64.rpm' へ保存終了 [22496]

それぞれ以下のページからダウンロードが可能です。

rpmコマンドでインストールをおこないます。

$ sudo rpm -ivh libdshconfig-0.20.10-3.3.x86_64.rpm
警告: libdshconfig-0.20.10-3.3.x86_64.rpm: ヘッダ V3 DSA/SHA1 Signature, key ID 92fbd4a7: NOKEY
準備中...                ########################################### [100%]
   1:libdshconfig           ########################################### [100%]

$ sudo rpm -ivh dsh-0.22.0-8.3.x86_64.rpm
警告: dsh-0.22.0-8.3.x86_64.rpm: ヘッダ V3 DSA/SHA1 Signature, key ID 92fbd4a7: NOKEY
準備中...                ########################################### [100%]
   1:dsh                    ########################################### [100%]

以上でインストールは完了です。

使い方

使い方です。dshではリモートの任意のマシンにログインしてコマンドを実行してくれます。実行するマシンは設定ファイルまたはオプションで指定が可能です。 実行する単位は以下のような設定が可能です。

  • オプション指定して、任意の複数台のマシンに対してコマンドを実行する。
  • 設定済みのすべてのサーバにコマンドを実行する。
  • グループごとのサーバにコマンドを実行する。

dshの基本的なコマンド形式は以下の通りです。

$ dsh [options] コマンド名

shellを実行するための接続プロトコルは-rオプションで指定します。 また、オプションでマシンを指定する場合は、-mオプションで指定します。 マシン指定に設定ファイルを使用する場合は、dsh関連のファイルは /etc/dsh/ にあります。 このディレクトリにmachines.listまたはgroupディレクトリを掘ってgroup名をそのままファイル名にしたファイルを作成し、この中に実行対象のサーバホストを記載していきます。

任意のマシンでコマンド実行

オプション指定で任意のマシンにログインしてコマンドを実行する場合は、-mオプションでマシンを指定します。

$ dsh -r ssh -m server1,server2 "hostname"
server2: server2.localdomain
server1: server1.localdomain

複数のマシンを指定する場合は、-mオプションの引数をカンマ区切りで指定します。

全マシンでコマンド実行

machines.listに登録した全サーバへの操作には-aオプションを指定します。 まず、/etc/dsh/machines.listにホスト名を登録します。

vi /etc/dsh/machines.list
server1
server2
server3
server4

$ dsh -r ssh -a "hostname"
server4: server4.localdomain
server3: server3.localdomain
server2: server2.localdomain
server1: server1.localdomain

グループ化したマシンでコマンド実行

group/group1に登録したサーバへの操作には-gオプションを指定します。 まず、/etc/dsh/group/group1にホスト名を登録します。

vi /etc/dsh/group/group1
server1
server2

$ dsh -r ssh -g group1 "hostname"
server2: server2.localdomain
server1: server1.localdomain

このように、dshを用いると簡単に大量のマシンに対してコマンド実行ができ、大量のサーバを管理するシステム管理者の負担を大幅に減らしてくれます。

補足

一応補足しておきますが、dshはファイル削除などの危険な操作も簡単にできてしまいます。(しかもすべてのサーバに対して。)

各サーバのステータスを確認するなどの参照などは安心して実行可能ですが、状態を戻すことが難しいような破壊的な操作をおこなう場合は、隔離された環境で動作確認を行ってから実施しましょう。

$ dsh -r ssh -a "chkconfig --list httpd"
$ dsh -r ssh -a "ps aux | grep httpd | grep -v httpd"

等といったコマンドはとても有用ですが、

$ dsh -r ssh -a "rm -rf ディレクトリ名"

のようなコマンドはディレクトリ名を間違えると致命的なダメージを与えることがあります。ご注意ください。




記事一覧へ