我正在尝试为厨师食谱编写一个库,简化了一些常见搜索.
例如,我希望能够在cookbook / libraries / library.rb中执行类似的操作,然后在同一个cookbook中的配方中使用它:
module Example def self.search_attribute(attribute_name) return search(:nodes,node[attribute_name]) end end
使用Chef :: Search :: Query.new().search(…)似乎可以搜索,但我找不到任何可以访问节点的东西.由此产生的错误是:
undefined local variable or method `node' for Example:Module
使用Chef 10.16.4.
解决方法
您可以做的是将模块包含在配方中.这样,您的模块函数就可以访问配方的方法,包括节点.
我通常为我的库模块执行此操作:
# my_cookbook/libraries/helpers.rb module MyCookbook module Helpers def foo node["foo"] end end end
然后,在配方中,我将模块包含在配方的当前实例中:
# my_cookbook/recipes/default.rb extend MyCookbook::Helpers
这样,只有当前配方包含模块,而不是所有这些都在整个厨师运行中(因此避免了名称冲突).
或者,您可以将当前节点作为参数传递给函数.这样,您不需要包含模块(它具有保留模块名称空间的优点),但具有更复杂的方法调用的缺点.