0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pdshによる分散シェル

Last updated at Posted at 2024-11-21

複数のノードに同時にコマンドを実行したい。

ホスト毎に一々sshしてコマンドを叩くのが面倒くさい....
Ansibleに手を出すほど大きな規模ではない
高々十数台程度に対して、サクッと実行させたい...

そんなニーズに答えるのがpdshである。
pdshのインストールから、簡単な利用法について本記事で纏める。

[注意] pdshは標準でユーザー入力を求めるような処理には対応していない。

pdshとは何か?

リモートシェル(rsh,ssh等)を利用して、リモートの複数ノードに対して非対話的にコマンドを並列実行出来るラッパープログラムである。

ソースコード・Ubuntuリポジトリ・EPELリポジトリにて提供されている。環境に応じてお好きな手法でインストールするべし。

インストール

apt

apt install pdsh

yum

yum --enablerepo=epel install pdsh

使用方法

基本的なコマンド構文は以下の通り。

pdsh {-オプション} {コマンド}

より細かい使用方法は、helpで確認出来る。

$ pdsh -help

-S                return largest of remote command return values
-h                output usage menu and quit
-V                output version information and quit
-q                list the option settings and quit
-b                disable ^C status feature (batch mode)
-d                enable extra debug information from ^C status
-l user           execute remote commands as user
-t seconds        set connect timeout (default is 10 sec)
-u seconds        set command timeout (no default)
-f n              use fanout of n nodes
-w host,host,...  set target node list on command line
-x host,host,...  set node exclusion list on command line
-R name           set rcmd module to name
-M name,...       select one or more misc modules to initialize first
-N                disable hostname: labels on output lines
-L                list info on all loaded modules and exit
-g query,...      target nodes using genders query
-X query,...      exclude nodes using genders query
-F file           use alternate genders file"file"
-i                request alternate or canonical hostnames if applicable
-a                target all nodes except those with "pdsh_all_skip" attribute
-A                target all nodes listed in genders database
available rcmd modules: ssh,rsh,exec (default: rsh)

使用例

pdshはバックエンドでrshやsshを利用する。その為、予めそちらの設定は済ませておく必要がある。
例として、今回はsshを利用する。~/.ssh/configにホストの設定をしておく。

以下の様に設定されているものとして以後の解説を行う。

~/.ssh/config
Host node1
    HostName 192.168.0.2
    User node1
    Port 22
    IdentityFile ~/.ssh/node1

Host node2
    HostName 192.168.0.3
    User node2
    Port 22
    IdentityFile ~/.ssh/node2

例として、各nodeのNIC(eth0)に設定されているIPアドレスを表示させるコマンドを並列実行してみる。

$ pdsh -R ssh -w node1,node2 "ip a | grep eth0"

node1: 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
node1:     inet 192.168.0.2/24 brd 192.168.1.255 scope global noprefixroute eth0
node2: 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
node2:     inet 192.168.0.3/24 brd 192.168.1.255 scope global noprefixroute eth0

コマンドの実行結果がnode* : hogehogeと言ったフォーマットで、各ノードからレスポンスが返ってくる。

pdshは対話形式に非対応

基本的にpdshは非対話形式でのコマンド実行を目的として設計されている為、コマンドの実行結果にユーザー入力が必要な操作には対応できない。

その為、入力が必要な処理に対しては、パイプ処理|expectを使用して、無理矢理対話形式に丸め込む様な工夫が必要である。

例えば、node1・node2のパスワードがpasswordだったとして、それらに対しsudoコマンドを実行する例を考えると、echo|を応用して以下の様にする。

pdsh -R ssh -w node1,node2 "echo 'password' | sudo -S apt update -y

上記のコマンドの解説する。
sudo -S apt update -yを実行後にパスワードを求められるが、echo 'password'にてパスワードをリダイレクトする事で、対話形式の処理に対応している。なお、aptコマンドに-yオプションをつける理由は、を実行した際の全ての質問に対して自動的にYesを選択する為である。

また、このコマンドはセキュリティ的にリスクがある為、実環境での実行は推奨されない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?