オープンソースなシステム管理フレームワーク 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で詳しくお話しする予定です。

