クラウド時代の分散マシン操作ライブラリ Svengali -プラットフォーム

( クラウド時代の分散マシン操作ライブラリ Svengali )

プラットフォームを切り替える

多くの場合、マシンの設定方法などは対象とするマシンのプラットフォームによって異なります。
例えば、パッケージのインストール一つとっても、Redhat系ではyumDebian系ではaptとパッケージシステムを使い分ける必要があります。


これに対し、Svengaliでは利用時に対象とするプラットフォーム*1を指定する事で、システムに合わせた処理を行わせる事が可能です。


例えば、Debian系のディストリビューションが走っているマシンであれば

change_platform("debian")

というメソッド呼び出しでプラットフォームを指定可能です。


デフォルトのプラットフォームはRedhat系のディストリビューションに対応できるよう設定されており、同ディストリビューションが動作するマシンに適用する場合は、指定不要です。

複数プラットフォームに対応したプラグインを作成する

続いてプラットフォーム切り替えの仕組みについて説明します。
システムの設定作業を考えた時に、プラットフォーム間の差異として以下の2つがあると思います。

  • ・設定に用いるコマンド
  • ・設定ファイルのファイル名や配置場所


Svengaliでは、これらの情報を設定ファイルにくくり出し(外部化し)、プラットフォームに従って利用する設定ファイルを切り替えることで差異を吸収します。


プログラムからは以下のようにして外部化した情報にアクセスします。
プラグインの説明のところでも出てきたMachine#install_package()のコードです

  def install_package(package_name_str)
    return @ssh.exec!(ExtStr.cmd["package_install"] + " " + package_name_str)
  end


ExtStr.cmd["package_install"]という部分が、設定ファイルへアクセスしている箇所です。
ExtStr.cmdはHashです。ExtStr.cmd["package_install"]の値は"yun install -y"の時もあれば、"apt-get install"の場合もあるのですが、ここでどちらが返ってくるかを決定するのが、上のセクションで出てきたchange_platformメソッドです。


設定ファイルはYAMLで記述されます。2010年6月30日現在では以下のような内容となっています。


svengali/ext_string/command.yml

default:
 package_install: yum install -y
debian: 
 package_install: apt-get install


ここで、change_platform("debian")とすれば"apt-get install"が返るし、何も呼び出さなければdefaultの"yum install -y"メソッドが返るというわけです。
設定ファイルのパスの場合は、ExtStr.pathハッシュを介してアクセスし、設定ファイルはsvengali/ext_string/path.ymlになります。


まとめると、プラグインの作成では

  • 1. プラットフォーム依存の情報はcommand.ymlとpath.ymlに書いておく
  • 2. プログラム中でのアクセスはExtStr.cmdとExtStr.pathを介して行う


の2つを行って下さい、ということです。


先人のプラグインを新たなプラットフォーム対応させる場合は、プラグインのコードを眺めてアクセスしている外部データの名前を確認し、path.ymlやcommand.ymlに適切な情報を追加して下さい。

吸収しきれないケース

プラットフォームによって手続きがまったく異なる場合などは、外部化による方法だけでは差異を吸収しきれないと思われます。
この場合にどうするかはまだ検討中ですが、$platform_name変数にchange_platformメソッドで指定されたプラットフォーム名が入っているので、プラグインのコード中でこれを参照し処理を切り替えてもらうのかなぁとか考えています。

*1:とりあえずはディストリビューション。将来的にはOSの差異も隠蔽できるようにしたい。