Pythonからpingで他のマシンの死活監視をするライブラリ

More than 1 year has passed since last update.


Pythonコードで他のマシンへの疎通確認する方法について

 システム管理をしていると、他のマシンの死活監視をpingコマンドによって行いたいケースに出くわすことがあります。

 このような場合、Pythonで作られたシステムからpingコマンドを使う場合に、subprocessを使ってOSのpingコマンドを呼び出す方法が一般的かと思います。

 しかし、この場合、外部のコマンドを使うことになるため、外部の環境に依存したり、細かい制御が難しいという問題がありました。

 そのため、今回はPythonの中で完結するようにsocketによる死活監視のためのライブラリを作成したので紹介します。


Pingsを使った死活監視

 pingsはPythonでpingを送信するためのライブラリです。

 上記の通り、pingに使われるICMPパケットをsubprocessコマンドを使わずに、socketを使って送る事ができます。

注意: pingsはroot/adminユーザーで実行する必要があります。


インストール

pip経由でインストールすることができます。

pip install pings


使い方

 対象の死活の状態を監視したい場合は、以下のようにします。※実行時は必ずrootユーザ/adminユーザで動かすようにしてください。



  • Pingオブジェクトを初期化


  • ping()メソッドの引数に監視対象を指定


    • このメソッドは、対象にpingを飛ばし、戻り値として response オブジェクトを返す

    • このオブジェクトのis_reached()に疎通状態の結果が格納



具体的には、以下のようなコードになります。

import pings

p = pings.Ping() # Pingオブジェクト作成
res = p.ping("google.com") # googleを監視

if res.is_reached():
# 監視対象への接続ができた
do_something()
else:
# 監視対象への接続ができなかった
do_something()

 pingメソッドの返り値として得られるresponse オブジェクトを使うことでネットワークの状態などの監視に役立てることができます。

res = p.ping("google.com")

res.print_messages() # メッセージが表示される

実行結果の例:

PING google.com (172.217.27.174): 55 data bytes

47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms


より細かい設定


複数の対象の死活監視をしたい

 複数台のマシンを死活監視する場合は以下のようにします。

import pings

# 死活監視のマシンのIPアドレス
hosts = ["192.168.0.1", "192.168.0.2", "192.168.0.3"]

p = pings.Ping()

# マシンのIPアドレスを一つずつ取り出してpingコマンドを実行
for h in hosts:
res = p.ping(h)
if not res.is_reached():
# 接続ができなかった場合の処理
do_something()


pingを複数回飛ばしたい

 デフォルトの設定の場合、pingを飛ばす回数が1回のみとなるため、複数回送信したい場合は times オプションを使用します。

import pings

p = pings.Ping()
res = p.ping("google.com", times=3) # googleを監視, 3回pingを飛ばす
res.print_messages()

実行結果の例:

PING google.com (172.217.27.174): 55 data bytes

47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms


標準出力に結果を出力したい

 Pingクラスの初期化時にquietオプションをFalseに指定することで、実行中に標準出力にpingの結果が表示されます。

import pings

p = pings.Ping(quiet=False)
res = p.ping("google.com") # googleを監視

実行結果の例:

PING google.com (172.217.27.174): 55 data bytes

47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms


おわりに

 まだテストが不十分のため、環境によっては動かなかったり、うまく処理されないなどの問題がある可能性があります。

 使われる場合は、そのことを認識していただいてから使用するようにしてください。

 問題やコメントがありましたら、コメント欄やGithubのissueに書いていただけたらと思います。


参考

http://edo.blog.jp/archives/1790336.html