我正在尝试“清理”我的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上运行它。
答案 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)