オープンソースなシステム管理フレームワーク Func

第4回 Pythonプログラムからのモジュール実行

この記事を読むのに必要な時間:およそ 2 分

前回はfuncコマンドで各minion上のモジュールを実行する方法について解説しましたが,今回はPythonプログラムからモジュールを実行する方法について解説します。

funcコマンドの場合は,単純にモジュールを実行して結果を表示するだけでしたが,Pythonプログラムからモジュールを実行すると,実行結果に基づいて更に何らかの処理を行う,といったことが可能となります。

基本的なコード

Pythonからのモジュール実行コードは,基本的には以下のようになります。

#!/usr/bin/python
# func.overlord.clientのインポート
import func.overlord.client as fc

# 全てのminionに対して,引数を指定してモジュールメソッドを実行
# 実行結果がresultsに格納される
results = fc.Client("*").module.method(args)

# resultsから,minionとそれに対応する実行結果をひとつひとつ取り出して処理
for ( host, result ) in results.iteritems():
    # resultの内容に応じて何らかの処理をする
    # resultはモジュールによって,数字,文字列,リスト,ディクショナリなど
    # 形式が異なります

例えば,httpdの状態を確認して,起動していない場合には起動する,という処理を行うためのコードは以下のようになります。

#!/usr/bin/python
import func.overlord.client as fc

# 全てのminion上のhttpdが起動しているかどうか確認する
results = fc.Client("*").service.status("httpd")

# httpdが起動していないminionがあれば起動する
for ( host, result ) in results.iteritems():
   if result != 0:
       fc.Client(host).service.start("httpd")

モジュールの実行対象となるminionは,fc.Client()で指定します。上でのコード例のように,*が指定されている場合には,管理しているminionすべてが対象となります。単一のminionを指定する場合には,以下のように記述します。

fc.Client("host.example.com")

複数のminionを指定する場合には,;(セミコロン)で区切って指定します。

fc.Client("www.example.com;mail.example.com")

利用例

Pythonプログラムからのモジュール実行の具体的なサンプルを2つご紹介します。

smartモジュールを利用したディスクのチェック

smartモジュールにより全minionのディスクの状態をチェックし,問題があれば表示を行うというサンプルです。Func オフィシャルサイトにあるサンプルから引用しています。解説はコード中にコメントとして記述しています。

#!/usr/bin/python
# report on any drives with SMART issues
# these are likely going to kick the bucket
# (C) Michael DeHaan, 2007 <mdehaan@redhat.com>
# ===============================================

import func.overlord.client as fc

# smartモジュールのinfoメソッドを実行
info = fc.Client("*").smart.info()
failures = 0

# infoからminionとそれに対応する実行結果をひとつひとつ取り出して処理
for (host,details) in info.iteritems():

    # detailsがリストではない場合はエラー表示
    if type(details) != list:
        print "%s had an error : %s" % (host,str(details))
        break

    # detailsをリザルトコードと出力リストに分離
    (rc, list_of_output) = details

    # リザルトコードが0以外の場合,エラー表示
    if rc != 0:
        print "============================================"
        print "Host %s may have problems" % host
        print "\n".join(list_of_output[3:])
        failures = failures + 1

# いくつのminionでエラーが発生したかを表示
print "\n%s systems reported problems" % failures

virtモジュールを利用した管理対象仮想マシンの全起動

virtモジュールにより全minion上に存在する仮想マシンの状態をチェックし,起動していないものがあれば起動する,というサンプルです。解説はコード中にコメントとして記述しています。

#!/usr/bin/python

import func.overlord.client as fc

# virtモジュールのstateメソッドを実行
results = fc.Client("*").virt.state()

# resultsからminionとそれに対応する実行結果をひとつひとつ取り出して処理
for ( host, vms ) in results.iteritems():
    # vms[0]がREMOTE_ERRORの場合はスキップ
    if vms[0] == 'REMOTE_ERROR':
        continue

    for vm in vms:
        ( domain, state ) = vm.split(' ')
        # 仮想マシンの状態がshutdownの場合にはvirtモジュールの
        # createメソッドを実行して起動する
        if state == 'shutdown':
            fc.Client(host).virt.create(domain)

Pythonプログラムからのモジュール実行についての解説は以上です。上のサンプルを,Funcを使わずに実現する場合にはどのようなコードになるかを考えてみると,Funcの便利さがより実感できると思います。

次回はFuncモジュールの作り方について解説予定です。

著者プロフィール

宮下剛輔(みやしたごうすけ)

(株)paperboy&co.技術責任者。 社内ではサーバ周りからアプリケーション開発まで幅広く関わる一方,個人的にはPerlプログラミングを趣味として,サーバ管理用ユニットテストスイート Assurer(アシュラ)をオープンソースで公開したり,CPAN AuthorPlaggerコミッタとして活動している。また,YAPC::Asia 2007 Tokyo等の技術系カンファレンスでスピーカを務めるのも最近の楽しみのひとつ。共著書に『MASHUP++』がある。

URLhttp://mizzy.org/

コメント

コメントの記入