第3回ではfuncコマンドから、
モジュールのパスレイアウト
モジュールファイルは、
$PYTHONPATH/func/minion/modules/mymodule.py
このように配置されたモジュールは、
また、
$PYTHONPATH/func/minion/modules/
  foo/
    __init__.py
    bar.py
このように配置されたモジュールは、
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 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に配布する必要がありますが、
#!/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
)
以下のように実行することで、
$ sudo ./copymodule.py mymodule.py
Funcの今後
Funcの連載は今回が最後となります。短い間でしたが、
Funcはまだまだ発展途上のツールであり、
- 様々なOSへの対応
 - 現在はRed Hat系Linuxでしかまともに動作しません。
 - モジュールの充実
 - モジュールの充実とともに、
様々なOSに対応しやすいモジュールメカニズムも必要でしょう。  - Func上で動作するアプリケーションの充実
 - Funcに付属のfunc-inventoryぐらいしか現在は存在しません。
 - ホスト情報の外部からの取り込み
 - PuppetのようにLDAPやYAMLでのホスト情報管理が可能になると、
様々なツールで利用するホスト情報を一元管理しやすくなります。  
まだまだ課題はありますが、
また、
