複数ホストにコマンドを撒けるpdshをUbuntuでビルドする手順
Page content
複数のホストに対してコマンドを撒いて並列実行できるpdsh
(参考サイト [1] に詳しい) は便利なので、手元のUbuntu 20.04の環境で使いたくなった。ちなみにpdsh自体は公式リポジトリに用意されていてaptで即導入可能。
しかし、~/.dsh/group/
でのpdshのホストのグループ定義を行いたくてそのためのモジュールpdsh-mod-dshgroup
もaptで探すと、Ubuntu環境にはパッケージが無いとわかった。えっ、そうなの?
ということで以下は、Ubuntu環境で、pdsh-mod-dshgroupモジュールによるグループ定義を利用できるpdshを自力ビルドする手順のメモです。
Ubuntuでのpdshビルド手順
- GitHubからソースを取得する
cd ~/tmp
git clone https://github.com/chaos/pdsh
cd pdsh
- ここではたと気づく。よくある実行形式の
configure
が入っていない。このソースはどうやってbuildするのだ? - それは落ち着いてINSTALLを読めば自明だった。
bootstrap
を実行せよとある。(autoreconfというものを使っているらしい)
$ ./bootstrap
Running libtoolize --automake --copy ...
Running autoreconf --verbose --install -I config
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal -I config -I config
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy
autoreconf: running: /usr/bin/autoconf --include=config
autoreconf: running: /usr/bin/autoheader --include=config
autoreconf: running: automake --add-missing --copy --no-force
configure.ac:36: installing 'config/compile'
configure.ac:16: installing 'config/config.guess'
configure.ac:16: installing 'config/config.sub'
configure.ac:27: installing 'config/install-sh'
configure.ac:27: installing 'config/missing'
autoreconf: Leaving directory `.'
Cleaning up ...
Now run ./configure.
- 実行形式の
configure
が生成されたので、参考サイト [2] のように以下を実施。
./configure --with-ssh --with-dshgroups --prefix=/usr/local/pdsh
make
./src/pdsh/pdsh --help # pdshが出来ている
sudo make install
- 指定のpathへ、
pdsh
とともにdshbak
など一式がインストールされた。
$ ls -al /usr/local/pdsh/bin/
total 452
drwxr-xr-x 2 root root 4096 Jun 11 01:15 .
drwxr-xr-x 5 root root 4096 Jun 11 00:52 ..
-rwxr-xr-x 1 root root 8663 Jun 11 01:15 dshbak
-rwxr-xr-x 1 root root 145824 Jun 11 01:15 pdcp
-rwxr-xr-x 1 root root 145824 Jun 11 01:15 pdsh
-rwxr-xr-x 1 root root 145824 Jun 11 01:15 rpdcp
pdshの利用例
- 参考サイト [2] に習って、次の環境変数をシェルに設定しておく。
PATH=$PATH:/usr/local/pdsh/bin
MANPATH=$MANPATH:/opt/local/pdsh/man
PDSH_RCMD_TYPE=ssh
export PATH MANPATH PDSH_RCMD_TYPE
- 次のディレクトリに任意の名前のファイルを作成して、ホストのグループを定義する。
$ cat ~/.dsh/group/server
gce-1
ocaf-1
ocaf-2
ocaf-3
webarena-1
pdsh
を用いて、たとえば上記server
に定義した複数ホストの「Kernelリリース番号」を調べるためにuname -r
を並列実行し、標準出力をdshbak -c
でまとめると次のようになる。
$ pdsh -g server 'uname -r' | dshbak -c
----------------
webarena-1
----------------
5.4.0-117-generic
----------------
gce-1
----------------
5.13.0-1031-gcp
----------------
ocaf-[1-3]
----------------
5.13.0-1034-oracle
上記の例ではたったの5台ですが、1台毎の対応では不可能なほどの大量のホストに対して調べ物を一斉に行いたいときなどに、pdsh
はものすごく威力を発揮するのでおすすめ。
おまけ) Slurm’s hostlistについて
上記のdshbak -c
の出力結果に現れているocaf-[1-3]
は、Slurm’s hostlistという表記法である (言い切っているが正式名かどうかは自信ありません)。ホスト名・計算ノード名のような、パターンに連番を含む文字列をコンパクトに表現することができる。
この表記法の文字列を扱うにはhostlist
というコマンドが便利で、次のPythonモジュールで導入可能。以下のように、hostlists形式の文字列の生成や展開などの処理が行える。pdsh
と併せてこれもおすすめ。
$ hostlist -c a001,a002,a003
a[001-003]
$ hostlist -e b[001-003] # 集合を展開する
b001
b002
b003
$ hostlist -d c[001-100] c[012,034,056,078] # 集合の差を求める
c[001-011,013-033,035-055,057-077,079-100]