大抵の現場ではホストの情報はIPアドレスとともにエクセルで管理してると思いますが、もっとシステマチックに管理できたらいいなあなんて思ってました。
愚直にやるとすると片っ端からpingを投げたりsnmpを投げたりすればいいんですけど、管理するホストが100台〜とかになると、一個ずつシーケンシャルにやっていくと時間がかかります。そこで並列処理ができたら、ということでGNU Parallelを試してみました。

インストールは↑からソースを落としてきてconfigure&&make&&make installでOKです。
使い方は少しクセがあって、

 
  • 並列化するコマンドに渡す引数は{1}{2}{3}・・・などと書く
  • 引数は:::で区切る
  • -jで並列ジョブ数指定
  • -kは入力順と出力順を合わせる
  • ・・・etc

って感じですが、かなり高機能でもっともっといろいろできます。
使い方については↓のページが良くまとめられていると思いました。

 
とりあえず使ってみようということで、GNU Parallelを利用して192.168.1.2〜250にpingを投げて生きているIPのみを表示するワンライナーを書いてみました。-j 40としていますが、下の処理は大してCPUパワーを使わないのでわざと大きめにしてあります。典型的にはCPUコア数分程度にしておくべきだと思いますが。

1
parallel -j 40 -k "ping -w 1 -c 1 {1} | tr -d '¥n' | sed -e 's/$/¥n/' | grep -v '100% packet loss'" ::: $(seq 2 250 | sed -e "s/^/192.168.1./") | awk '{print $2}'

結果

1
2
3
4
192.168.1.11
192.168.1.12

192.168.1.249

結構早いです。↓のようにすると何分かかかったりしますが、GNU Parallelを使うと数秒で結果が返ってきます。

1
for ip in `seq 2 250 | sed -e "s/^/192.168.1./"`; do ping -c 1 -w 1 ${ip};done

今度は少し色をつけて、192.168.1.2〜250の生きてるホストのホスト名、メモリ、CPU種、OS、カーネルバージョンを抜いてくるスクリプトを書いてみした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

cmd_gnu_parallel="/usr/local/parallel/bin/parallel"

ping_ok_list=`${cmd_gnu_parallel} -j 40 -k "ping -w 1 -c 1 {1} | tr -d '\n' | sed -e 's/$/\n/' | grep -v '100% packet loss'" ::: $(seq 2 250 | sed -e "s/^/192.168.1./") | awk '{print $2}'`

for ip in ${ping_ok_list} ; do
echo "-------------------------------------------"
echo "${ip}" `ssh -1 hogeuser@${ip} hostname`
echo "Memory:" `ssh -1 hogeuser@${ip} cat /proc/meminfo | grep MemTotal`
echo "Cpu:" `ssh -1 hogeuser@${ip} cat /proc/cpuinfo | grep "model name" | uniq`
echo "OS:" `ssh -1 hogeuser@${ip} cat /etc/issue`
echo "Kernel:" `ssh -1 hogeuser@${ip} uname -r`
done

結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-------------------------------------------
192.168.1.11 server01
Memory: MemTotal: 8165192 kB
Cpu: model name : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
OS: CentOS release 5.4 (Final) Kernel \r on an \m
Kernel: 2.6.18-164.el5
-------------------------------------------
192.168.1.12 server02
Memory: MemTotal: 8165192 kB
Cpu: model name : Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
OS: CentOS release 5.4 (Final) Kernel \r on an \m
Kernel: 2.6.18-164.el5

・・・・

上の例は、前提として上記のスクリプトを実行するマシン(管理サーバなど)から管理対象のホストのhogeuserにノンパスsshが通るようにしておく必要があります。
このようなスクリプトをcronに仕込んで定期的にhtmlに書き出すようにしておけば、新しいマシンをラッキングして管理サーバの公開鍵をインスコさえしてしまえば自動的に情報を採取してwebで閲覧できるようになるんじゃないかと思います。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Set your Twitter account name in your settings to use the TwitterBar Section.