わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

ohaiの7系だとrequire_pluginが使えないみたい

ohaiとは

chefをインストールするとohaiという サーバの情報をよしなに取得してきてくれる超便利ツールがある。
使い方はとても簡単で

$ ohai

これだけでohaiが実行された環境の情報をいろいろ取得し、json形式で表示してくれる。 まぁこれだけをいきなり実行しても出力されたjsonでコンソールが埋まっちゃうので、 いったんohai > ohai.jsonみたいな感じで適当なテキストファイルに落としちゃって どんな情報がとれるのかざっくり見てみたらいいと思う。

ohaiの7系だとrequire_pluginが使えない

で、gem install chefを実行すると 今は以下のバージョンのライブラリがインストールされる。

$ gem list
chef (11.12.4)
ohai (7.0.4)

つまり現状ohaiは7系がインストールされるようになっているのだが、 いろんなブログとかにあるohaiライブラリの使い方はほとんどが6系を前提としているので 紹介されている使い方がそのままでは使えない。

というかohaiのコードを読んだら、 何とか6系との後方互換性を保とうとしているっぽいんだが、私が実際にコードを走らせてみたら 動かなくて使えねーじゃんって気づいた。

例えばこんなコード(test.rb)を動かしてみた。

require "ohai"

oh = Ohai::System.new
oh.require_plugin("os")
p oh[:os]

すると次のようなエラーをはく。

$ ruby test.rb
/Users/kimikimi714/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/ohai-7.0.4/lib/ohai/system.rb:138:in 'require_plugin': Can not find a plugin for dependency os (Ohai::Exceptions::DependencyNotFound) from test.rb:5:in '<main>'

というわけで上記のコードを次のように変更するとよい。

require "ohai"

oh = Ohai::System.new
a = oh.all_plugins("os")
a.each do |name|
  p name.class
end
p oh[:os]

出力結果

$ ruby test.rb
Ohai::NamedPlugin::OS
"darwin"

[#OHAI-553] require_plugin exception on Rubinius - Opscode Open Source Ticket Tracking
として報告済みのバグなんだけども、require_pluginの代わりにall_pluginsを使えばいいので、 優先度(Priority)が低い(Minor)んだろう。

ohaiのSystemクラスのコードにも

#
# Below APIs are from V6.
# Make sure that you are not breaking backwards compatibility
# if you are changing any of the APIs below.
#
def require_plugin(plugin_ref, force=false)

になっていて一番最初にrequire_pluginがあるので、 別に私は後方互換性を壊すようなことをやってないけど、使えなくなるつもりでいてもいいのかな。

ちなみに修正したテストコードのall_plugins("os")は引数を取っちゃえばohaiで使える すべてのプラグインを読み込むので若干重い。ただこの後にa.each do |name|というので ためしにどんなプラグインが読み込まれるのか出力させるようにしてあるので、それを見たら 引数に何を入れればいいかが分かると思う。
直接ohaiライブラリのコード読んでもいいけど手間だし時間がかかる。

記事書くにあたって見て回ったリンク