前回はfuncコマンドで各minion上のモジュールを実行する方法について解説しましたが、
funcコマンドの場合は、
基本的なコード
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はモジュールによって、数字、文字列、リスト、ディクショナリなど
# 形式が異なります
例えば、
#!/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("host.example.com")
複数のminionを指定する場合には、
fc.Client("www.example.com;mail.example.com")
利用例
Pythonプログラムからのモジュール実行の具体的なサンプルを2つご紹介します。
smartモジュールを利用したディスクのチェック
smartモジュールにより全minionのディスクの状態をチェックし、
#!/usr/bin/python
# report on any drives with SMART issues
# these are likely going to kick the bucket
# (C) Michael DeHaan, 2007 <[email protected]>
# ===============================================
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モジュールの作り方について解説予定です。