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

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

前回は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モジュールの作り方について解説予定です。

おすすめ記事

記事・ニュース一覧