Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从厨师烹饪书中的库访问当前节点?_Ruby_Chef Infra - Fatal编程技术网

Ruby 如何从厨师烹饪书中的库访问当前节点?

Ruby 如何从厨师烹饪书中的库访问当前节点?,ruby,chef-infra,Ruby,Chef Infra,我正试图为厨师烹饪书编写一个库,简化一些常见的搜索 例如,我希望能够在cookbook/libraries/library.rb中执行类似操作,然后从同一本烹饪书中的食谱中使用它: module Example def self.search_attribute(attribute_name) return search(:nodes, node[attribute_name]) end end 问题是,在Chef库文件中,节点对象或搜索函数都不可用 使用Che

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

例如,我希望能够在
cookbook/libraries/library.rb中执行类似操作,然后从同一本烹饪书中的食谱中使用它:

module Example
    def self.search_attribute(attribute_name)
        return search(:nodes, node[attribute_name])
    end
end
问题是,在Chef库文件中,
节点
对象或
搜索
函数都不可用

使用
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
这样,只有当前配方包含模块,而不是整个厨师运行中的所有模块(这样可以避免名称冲突)


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

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


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

这可能是个愚蠢的问题,但你说的“这样,只有当前的配方才能包含模块,而不是整个厨师运行中的所有模块”是什么意思?人们经常调用
Chef::Recipe.include MyCookbook::Helpers
,这使得helper函数在所有食谱中都可用(并且可以用相同的名称覆盖可能已经存在的函数)。我认为这是一种代码味道,我更喜欢我的版本,只将
Helpers
模块显式地包含在菜谱中。我想我理解。使用Ruby的extend只会将模块中的方法添加到正在运行的单个recipe对象中,而使用您提到的include会将其添加到所有Chef::recipe对象中。谢谢对我来说,
extend mycokbook::Helpers
仍然不允许访问节点属性…@s2t2请提出一个新问题,详细说明您尝试了什么(包括配方和库代码)以及到底出了什么问题。你可以从你的新问题链接到这个答案来说明你的观点
# 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