ruby - 如何从 Chef 说明书中的库访问当前节点?

标签 ruby chef-infra

我正在尝试为 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/

相关文章:

二维数组的 Ruby 数组,搜索/查找?

ruby - 向 Hash.new([]) 注入(inject)元素时 << 和 += 有什么区别?

caching - 使用 docker/host 卷时如何保留 apt-cache 归档目录

Python Pychef : Not able to search attributes using class chef. 搜索

ruby - Chef : how to get a timestamp at *convergence* rather than *compile* time

ruby - 如何在 Ruby 中搜索 $PATH 中的可执行文件

带有远程数据库的 Ruby ODBC

yaml - 向测试厨房添加属性

ubuntu - Chef-server 在运行重新配置时卡住了 ruby​​_block[supervise_rabbitmq_sleep]

ruby-on-rails - 如何使用 button_to 提交表单?