7

いくつかの一般的な検索を簡素化するシェフのクックブック用のライブラリを作成しようとしています。

cookbook/libraries/library.rbたとえば、次のようなことをして、同じクックブックのレシピから使用できるようにしたいと考えています。

module Example
    def self.search_attribute(attribute_name)
        return search(:nodes, node[attribute_name])
    end
end

問題は、Chef ライブラリ ファイル内では、nodeオブジェクトもsearch関数も使用できないことです。

を使って検索はできるようですがChef::Search::Query.new().search(...)、アクセスできるものが見つかりませんnode。これによるエラーは次のとおりです。

undefined local variable or method `node' for Example:Module

Chef 10.16.4 を使用。

4

2 に答える 2

8

What you can do is to include the module in your recipe. That way, your module functions get access to the methods of the recipe, including node.

I normally do this for my library modules:

# my_cookbook/libraries/helpers.rb
module MyCookbook
  module Helpers
    def foo
      node["foo"]
    end
  end
end

Then, in the recipe, I include the module into the current instance of a recipe:

# my_cookbook/recipes/default.rb
extend MyCookbook::Helpers

That way, only the current recipe gets the module included, not all of them in the whole chef run (you thus avoid name clashes).

Alternatively, you could pass the current node as a parameter to the function. That way, you don't need to include the module (which has the upside of keeping the module namespaces) but has the downside of a more convoluted method call.

于 2013-10-02T10:37:21.013 に答える