我正试图为一本厨师烹饪书编写一个库,简化一些常见的搜索。
例如,我希望能够在cookbook/libraries/library.rb中做这样的事情,然后在同一本食谱中使用它:
module Example
def self.search_attribute(attribute_name)
return search(:nodes, node[attribute_name])
end
end问题是,在主厨库文件中,node对象或search函数都不可用。
使用Chef::Search::Query.new().search(...)搜索似乎是可能的,但是我找不到任何可以访问node的东西。由此产生的错误是:
undefined local variable or method `node' for Example:Module使用主厨10.16.4。
发布于 2013-10-02 10:37:21
您可以做的是将模块包含在您的食谱中。这样,模块函数就可以访问菜谱的方法,包括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这样,只有当前的菜谱才会包含模块,而不是在整个厨师运行过程中的所有模块(这样就避免了名称冲突)。
或者,可以将当前节点作为参数传递给函数。这样,您就不需要包含模块(它有保留模块名称空间的好处),但是有一个更复杂的方法调用的缺点。
发布于 2013-12-03 01:59:09
我只是在试图访问库中的当前环境时遇到了这个问题。我不知道如何使用模块访问节点,我不想将节点传递给每个方法调用(或实例化调用),所以我这样做了(示例代码)。而不是实际的功能):
# libraries/account.rb
class Account
@@env = "_default"
def self.env=(env)
@@env = env
end
def settings
Chef::EncryptedDataBagItem.load(@@env, "settings") || {}
end
end
# recipes/accounts.rb
Account.env = node.chef_environment
Account.new.settings我不知道是否反对使用类变量,但它在我的所有测试中都有效,而且很好使用。
https://stackoverflow.com/questions/19134728
复制相似问题