オープンソースなシステム管理フレームワーク 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によるタスク実行の基本的な仕組みは、以下の図のようになっています。

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のインストールと設定方法について解説します。

参考リンク

おすすめ記事

記事・ニュース一覧