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

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

第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で詳しくお話しする予定です。

おすすめ記事

記事・ニュース一覧