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

第5回 Funcモジュールの作り方

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

第3回ではfuncコマンドから,第4回ではPythonプログラムから既存のFuncモジュールを呼び出す方法について解説しました。今回はFuncモジュールそのものを作成する方法について解説します。

モジュールのパスレイアウト

モジュールファイルは,/usr/lib/python2.4/site-packagesなどの,Pythonモジュール探索パスの下に,以下のように配置します。

$PYTHONPATH/func/minion/modules/mymodule.py

このように配置されたモジュールは,funcコマンドからは func "*" call mymodule mymethod で呼び出せます。

また,以下のようにモジュールのディレクトリを階層化することもできます。

$PYTHONPATH/func/minion/modules/
  foo/
    __init__.py
    bar.py

このように配置されたモジュールは,funcコマンドからは func "*" call foo.bar mymethod で呼び出せます。

Funcモジュールファイルの内容

Funcモジュールの基本的なコードは以下のようになります。簡単な説明をコード中にコメントとして記述していますので,ご参照ください。

# func_moduleをインポート
import func_module

# func_module.FuncModuleを継承したクラスを定義
class Test(func_module.FuncModule):

  # version, api_version, descriptionを定義
  version = "11.11.11"
  api_version = "0.0.1"

  description = "Just a very simple example module"

  # モジュールメソッドを定義
  def add(self, num1, num2):
    return num1 + num2

  # モジュールメソッドを定義
  def exception(self):
    # 例外を発生

    raise exceptions.Exception("khhhhhhaaaaaan!!!!!!")

Funcにはモジュールの雛形を生成するための,func-create-moduleというコマンドが付属しています。func-create-moduleを実行し,モジュール名や説明などを入力していくと,モジュールの雛形が生成されます。

$ func-create-module
Module Name: example
Description: An example module.

Author: Gosuke Miyashita
Email: gosukenator@gmail.com

Leave blank to finish.
Method: mymethod
Method:
Your module is ready to be hacked on. Wrote out to example.py.

雛形ファイルは以下のような内容で生成されます。

#
# Copyright 2008

# Gosuke Miyashita <gosukenator@gmail.com>
#
# This software may be freely redistributed under the terms of the GNU
# general public license.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

import func_module

class Example(func_module.FuncModule):

    # Update these if need be.

    version = "0.0.1"
    api_version = "0.0.1"
    description = "An example module."

    def mymethod(self):
        """
        TODO: Document me ...
        """

        pass

この雛形をベースにして,モジュールで実行したい処理を記述していきます。

モジュールの配布

モジュールは各minionに配布する必要がありますが,今のところFuncには,モジュールを配布する仕組みは実装されていないようです。そこで,copyfileモジュールを利用して,各minionにモジュールを配布する簡単なサンプルスクリプトを作成してみました。

#!/usr/bin/python

import sys

import func.overlord.client as fc
import xmlrpclib

module = sys.argv[1]

client = fc.Client("*")

fb   = file(module, "r").read()
data = xmlrpclib.Binary(fb)

print client.copyfile.copyfile(
    "/usr/lib/python2.4/site-packages/func/minion/modules/" + module,
    data
)

以下のように実行することで,管理対象のminionすべてにmymodule.pyを配布します。

$ sudo ./copymodule.py mymodule.py

Funcの今後

Funcの連載は今回が最後となります。短い間でしたが,おつきあいいただきありがとうございました。

Funcはまだまだ発展途上のツールであり,今後広く使われるようになるためには,以下のような課題を解決する必要があると考えています。

様々なOSへの対応
現在はRed Hat系Linuxでしかまともに動作しません。
モジュールの充実
モジュールの充実とともに,様々なOSに対応しやすいモジュールメカニズムも必要でしょう。
Func上で動作するアプリケーションの充実
Funcに付属のfunc-inventoryぐらいしか現在は存在しません。
ホスト情報の外部からの取り込み
PuppetのようにLDAPやYAMLでのホスト情報管理が可能になると,様々なツールで利用するホスト情報を一元管理しやすくなります。

まだまだ課題はありますが,素性はとても良いツールだと思いますので,今後の発展に期待しています。

また,上記に挙げたような問題の解決のため,そしてモジュールを私が好きな言語であるPerlで書きたいという思いから,Punc(Perl Unified Network Controller)というFuncクローンなシステム管理フレームワーク実装の開発をはじめました。まだプロトタイプとも呼べない状態ですが,CodeReposでソースコードを管理していますので,どなたでも開発にご参加いただけます。PuncについてはYAPC::Asia 2008で詳しくお話しする予定です。

著者プロフィール

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

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

URLhttp://mizzy.org/

コメント

コメントの記入