Chef Ohaiのプラグインを自作

以前Puppetを使っていた時に、
Facter変数を利用してサーバーによって個別の情報を埋め込んだりしていました。

Facter変数はデフォルトで用意されているものももちろんあるのですが、
自作することも出来ました。
その時のエントリーです。

Puppetのカスタムfact(ListenAddress) - tsunokawaのはてなダイアリー


PuppetはFacterでしたが、
ChefではOhaiというものを使ってサーバーの情報を取得出来ます。

Ohaiでもプラグインを自作出来ますのでやってみました。

やりたいこと

テンプレートファイルにそのサーバーの利用サービスを埋め込みたいという要件がありました。

例えば、ブログサービスで運用しているサーバーはホスト名が

web01.blog.example.com
cache01.blog.example.com
db01.blog.example.com

のようにしています。
.(ドット)区切りで2番目に利用サービス名をいれています。
この場合だとblogでこれらのサーバーはブログのサービスで使っているサーバー達だと分かります。

このホスト名からblogだけを抽出したいと思いそのOhaiプラグインを作りました。


Ohaiプラグインファイル作成

Chefリポジトリディレクトリの
chef/repo/ohai_plugins/

service.rb
というファイルを準備します。

provides "service"

service  `hostname | cut -d "." -f 2`

単純にhostnameで出力されるホスト名からサービス名を抜き出しているだけです。

自作Ohaiプラグイン読み込み設定

Chef-Soloを使う時に

chef-solo -c /root/chef/solo.rb -j /root/chef/node.json

このように設定ファイルを読み込んで実行しています。

この設定ファイル
solo.rb
に自作Ohaiプラグインを読み込むよう

Ohai::Config[:plugin_path] << "/root/chef/repo/ohai_plugins"

を追加します。

テンプレートに埋め込む

テンプレートに変数を埋め込む場合、
自作プラグインもデフォルトのOhai変数も同じ書き方でOKです。

<%= node['service'] %>

こんな感じです。

自作Ohai変数のチェック

ohai -d /root/chef/repo/ohai_plugins

※フルパスで指定する必要有り。


出力例

  "service": "blog\n"

無事出力されました。