Show page source of PLATFORM #60780

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


これに対し、Svengaliでは利用時に対象とするプラットフォーム((とりあえずはディストリビューション。将来的にはOSの差異も隠蔽できればベスト。))を指定する事で、システムに合わせた処理を行わせる事が可能です。


例えば、Debian系のディストリビューションが走っているマシンであれば
{{{ code ruby
change_platform("debian")
}}}
というメソッド呼び出しでプラットフォームを指定可能です。


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

[[BR]]
= 複数プラットフォームに対応したプラグインを作成する
続いてプラットフォーム切り替えの仕組みについて説明します。
システムの設定作業を考えた時に、プラットフォーム間の差異として以下の2つがあります。


 * 設定用コマンドの名前
 * 設定ファイルのファイル名や配置場所


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


プログラムからは以下のようにして外部化した情報にアクセスします。
プラグインの説明のところでも出てきたMachine#install_package()のコードです
{{{ code ruby
  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'''
{{{ code ruby
default:
 package_install: yum install -y
debian: 
 package_install: apt-get install
}}}


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


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


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


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


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

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