首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从厨师食谱中的库访问当前节点?

如何从厨师食谱中的库访问当前节点?
EN

Stack Overflow用户
提问于 2013-10-02 10:20:03
回答 2查看 5.6K关注 0票数 7

我正试图为一本厨师烹饪书编写一个库,简化一些常见的搜索。

例如,我希望能够在cookbook/libraries/library.rb中做这样的事情,然后在同一本食谱中使用它:

代码语言:javascript
复制
module Example
    def self.search_attribute(attribute_name)
        return search(:nodes, node[attribute_name])
    end
end

问题是,在主厨库文件中,node对象或search函数都不可用。

使用Chef::Search::Query.new().search(...)搜索似乎是可能的,但是我找不到任何可以访问node的东西。由此产生的错误是:

代码语言:javascript
复制
undefined local variable or method `node' for Example:Module

使用主厨10.16.4。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-02 10:37:21

您可以做的是将模块包含在您的食谱中。这样,模块函数就可以访问菜谱的方法,包括node

我通常这样做是为了我的图书馆模块:

代码语言:javascript
复制
# my_cookbook/libraries/helpers.rb
module MyCookbook
  module Helpers
    def foo
      node["foo"]
    end
  end
end

然后,在菜谱中,我将模块包含到菜谱的当前实例中:

代码语言:javascript
复制
# my_cookbook/recipes/default.rb
extend MyCookbook::Helpers

这样,只有当前的菜谱才会包含模块,而不是在整个厨师运行过程中的所有模块(这样就避免了名称冲突)。

或者,可以将当前节点作为参数传递给函数。这样,您就不需要包含模块(它有保留模块名称空间的好处),但是有一个更复杂的方法调用的缺点。

票数 8
EN

Stack Overflow用户

发布于 2013-12-03 01:59:09

我只是在试图访问库中的当前环境时遇到了这个问题。我不知道如何使用模块访问节点,我不想将节点传递给每个方法调用(或实例化调用),所以我这样做了(示例代码)。而不是实际的功能):

代码语言:javascript
复制
# 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

我不知道是否反对使用类变量,但它在我的所有测试中都有效,而且很好使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19134728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档