我想在配方中使用一个方法,所以我为它创建了一个辅助方法.
my_cookbook /库/ foo_helper.rb
module Foo
module Helper
def foo_daemon_command(action)
%Q{bash -c "export PATH='/usr/local/bin:/opt/rbenv/bin:$PATH'; eval '$(rbenv init -)'; cd /opt/foo; /opt/rbenv/shims/ruby foo_daemon.rb #{action} >>/var/log/foo/cron_#{action}.log 2>>/var/log/foo/cron_#{action}.log" }
end
end
end
并从配方中加载方法.
my_cookbook /食谱/ default.rb
Chef::Resource::User.send(:include, Foo::Helper)
execute "foo daemon restart" do
command foo_daemon_command("restart")
end
当我应用配方时,我得到未定义的方法错误,如下所示:
NoMethodError
-------------
undefined method `foo_daemon_command' for Chef::Resource::Execute
我究竟做错了什么?
最佳答案 特定错误是您正在将函数修补到User资源而不是Execute.但更好的方法是将其混合到当前配方中.只需将extend Foo :: Helper添加到配方的顶部即可.您还可以将其设置为模块方法,并将其直接调用为Foo :: Helper.foo_daemon_command.一般来说,全球DSL变更应该非常小心,而不是从食谱代码.