我正在尝试为 Chef Recipe 编写一个库,以简化一些常见的搜索。
例如,我希望能够在 cookbook/libraries/library.rb
中执行类似的操作,然后从同一 Recipe 中的 Recipe 中使用它:
module Example
def self.search_attribute(attribute_name)
return search(:nodes, node[attribute_name])
end
end
问题是,在 Chef 库文件中,node
对象或 search
函数都不可用。
似乎可以使用 Chef::Search::Query.new().search(...)
进行搜索,但我找不到任何可以访问 的内容节点
。由此产生的错误是:
undefined local variable or method `node' for Example:Module
使用 Chef 10.16.4。
最佳答案
您可以做的是将模块包含在您的配方中。这样,您的模块函数就可以访问配方的方法,包括 node
。
我通常为我的库模块这样做:
# my_cookbook/libraries/helpers.rb
module MyCookbook
module Helpers
def foo
node["foo"]
end
end
end
然后,在配方中,我将模块包含到配方的当前实例中:
# my_cookbook/recipes/default.rb
extend MyCookbook::Helpers
那样的话,只有当前的 Recipe 才会包含模块,而不是整个 Chef 运行中的所有 Recipe (这样可以避免名称冲突)。
或者,您可以将当前节点作为参数传递给函数。这样,您就不需要包含模块(这样做的好处是保留模块 namespace ),但缺点是方法调用更复杂。
关于ruby - 如何从 Chef 说明书中的库访问当前节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19134728/