オープンソースなシステム管理フレームワーク Func
第1回 シンプルで拡張性の高いシステム管理フレームワークFuncの概要
この連載では,Python製のシステム管理フレームワークFunc(Fedora Unified Network Controller)について,その概要から具体的な利用方法,モジュールによる拡張方法といった,システム管理の現場でFuncを利用するために必要な情報をお届けします。
第1回目はFuncの概要について解説します。Funcはフレームワークという性質上,具体的に何ができるのか,といったことがわかりにくいため,まずはPuppetとの対比で解説してみます。
「ツール」と「フレームワーク」
Puppetはシステム管理「ツール」,Funcはシステム管理「フレームワーク」と便宜的に呼び分けていますが,まずはこの違いからFuncの特性について説明します。
非常に大雑把ですが,「ツール」はそれによって実現できることが明確で,誰にとっても同じもの,「フレームワーク」は枠組みだけを提供して,使う人が実現したいものをその上に実装するもの,とここでは区別します。
例えば,Puppetはマニフェストによってシステムの状態を記述し,それを適用することによってシステム管理を行いますが,実現できることはマニフェストで記述できる範囲内に限られます。
それに対してFuncは,安全な通信経路を通じて各システム上でタスクを実行し,結果を取得するための基本的な枠組みを提供します。システム管理者は,Funcフレームワーク上で必要なタスクを実行するプログラムを実装することに専念できます。
「静的なシステム管理」と「動的なシステム管理」
また,別の視点として,gihyo.jpの記事「2008年のオープンソースによるシステム管理」でも触れましたが,Puppetによるシステム管理は,「状態を記述してシステムに『適用』する」という「静的なシステム管理」であり,それに対してFuncによるシステム管理は,「タスクを記述してシステム上で『実行』する」という「動的なシステム管理」といった形で対比することもできます。
Funcの概要
では,Funcについてもう少し具体的に見てみましょう。
基本的な仕組み
Funcによるタスク実行の基本的な仕組みは,以下の図のようになっています。
minionは管理対象となるシステムを表しており,funcdというデーモンが動いています。certmasterはminionの管理や,通信で必要となるminionの証明書の発行や管理を行います。
タスクを実行するには,certmaster上でfuncコマンドを実行するか,Python APIを利用したプログラムを実行し,各minion上のfuncdを通じてモジュールを呼び出し,実行します。
モジュール
各minion上で具体的な処理を実行するのがモジュールです。任意のコマンドを実行するモジュール,yumでパッケージを管理するモジュール,サービスの起動/停止の実行や状態を確認するためのモジュール等が予め提供されていますが,モジュールは単なるPythonプログラムであり,独自のモジュールを開発して追加することも簡単にできます(これが拡張性が高いという所以のひとつです)。
funcコマンド
各minion上のモジュールを呼び出すには,funcコマンドを実行します。例えば,httpdの実行状態を確認する場合には,以下のようにfuncコマンドを実行します。
$ sudo func "*" call service status httpd on https://minion0.example.org:51234 running service status (httpd) 0
funcコマンドの詳細な利用方法については,回をあらためて解説します。
Python APIを利用したプログラム
funcコマンドでは単にモジュールの実行結果を表示するだけですが,Python APIを利用したプログラムから各minion上のモジュールを呼び出すことにより,モジュールの実行結果に応じて,さらに別の処理を行う,といったことも可能です。
例えば,以下のプログラムでは,各minion上のhttpdの実行状態を確認し,httpdが起動していないminionがあれば起動する,というタスクを実行します。
#!/usr/bin/python
import func.overlord.client as fc
# 全てのminion上のhttpdが起動しているかどうか確認する
results = fc.Client("*").service.status("httpd")
# httpdが起動していないminionがあれば起動する
for (host, returns) in results.iteritems():
if returns != 0:
fc.Client(host).service.start("httpd")このように,Funcは単にモジュールを追加できるだけではなく,モジュールの実行結果に応じた処理もプログラムできる,という点が,拡張性の高さに繋がっています。
Python APIを利用したプログラムの作り方についても,回をあらためて取り上げます。
以上がFuncの概要です。次回はFuncのインストールと設定方法について解説します。
オープンソースなシステム管理フレームワーク Func
- 第5回 Funcモジュールの作り方
- 第4回 Pythonプログラムからのモジュール実行
- 第3回 funcコマンドの使用方法
- 第2回 Funcのインストールと設定・起動
- 第1回 シンプルで拡張性の高いシステム管理フレームワークFuncの概要

