在Chef Recipe中编写Ruby类

时间:2014-02-28 18:20:26

标签: ruby chef chef-recipe

我正在尝试“清理”我的Chef配方来安装Zabbix Agent,我知道那里有一百万,但这是我的理解案例。我将我的厨师指令拆分为一个类,并为每个步骤分别需要完成的方法。我把这个类放在配方文件中。因此,当我执行配方linked here at GitHub时,我收到此错误:

NoMethodError
-------------
undefined method `execute' for #<Class:0x000000030e42c0>::Recipe_Zabbix_Agent_Unix

我绝不是一个Ruby大师,所以我想我自己,我打赌这个类是从Chef继承的“分离”自己,所以我需要让这个类继承使用{继承Chef库{1}}事。但是,我仍然收到上面列出的错误。在尝试这样做时,我错过了什么,或者没有理解?我见过人们编写的库基本上只是一个Ruby脚本,然后配方包含脚本并在那里执行功能,但我想把它包含在我的简单理解的配方中。这是可能的还是我正在寻找图书馆路线的唯一选择?我也在主厨10.24上运行它。

2 个答案:

答案 0 :(得分:1)

通常,基于类的资源进入库文件,而不是配方。有关使用Poise在基于类的资源中获取LWRP DSL元素的示例,请参阅https://github.com/poise/berkshelf-api/blob/master/libraries/berkshelf_api.rb

答案 1 :(得分:0)

您可以创建一个将配方作为参数的类,以便资源定义方法在范围内。

libraries/useful_thing.rb

class UsefulThing
  def initialize(blah)
    @blah = blah
  end

  def apply(recipe)
    # Chef resources use instance_eval for blocks, which hides self
    outer_self = self
    recipe.directory "/foo/#{@blah}" do
        user ...
        group outer_self.latest_group
        ...
    end
    ...
  end

  ...
end

然后在recipes/default.rb

ut = UsefulThing.new(...)
ut.apply(self)