如何在ruby_block中使用来自另一个厨师食谱的厨师助手库

时间:2015-08-10 21:42:53

标签: ruby chef

AWS Opsworks:Chef版本11.10,Berkshelf版本3.2.0。

我无法弄清楚如何在食谱B的ruby_block中使用食谱A中的辅助库。

我找到了一个post讨论如何在ruby_block中包含一个方法,another讨论如何在cookbook中共享库,但我不能同时使用它们。

cookbookA /库/ helpers.rb

module libraryA
    module Helpers
        def log(output)
            Chef::Log.info("#{cookbook_name}:#{recipe_name}: #output}")
        end
    end
end

cookbookB / metadata.rb

depends 'cookbookA'

以下setup.rb可以使用。

cookbookB /食谱/的setup.rb

 ::Chef::Recipe.send(:include, libraryA::Helpers)
 log("this is a log")

但是,当我在ruby块中使用log函数时,它会失败。 以下setup.rb不起作用:

cookbookB /食谱/的setup.rb

 ::Chef::Recipe.send(:include, libraryA::Helpers)
 ruby_block "logging-function" do
      block do
           log("this is a log")
      end
 end

P.S。:我也尝试过使用::Chef::Resource.send(:include, libraryA::Helpers)

更新了代码块:

::Chef::Recipe.send(:include, libraryA::Helpers) 
ruby_block "logging-test" do 
    block do 
        ::Chef::Recipe.send(:include, libraryA::Helpers)    
        ::libraryA::Helpers.ttlog("message") 
    end 
end

收到错误:NoMethodError - libraryA的未定义方法ttlog :: Helpers:Module

更新了帮助者

cookbookA /库/ helpers.rb

def log(output)
    Chef::Log.info("#{cookbook_name}:#{recipe_name}: #output}")
end

P.S:删除了模块结构

1 个答案:

答案 0 :(得分:1)

我认为ruby_block在其他上下文中运行,在其他对象下运行。 您可以尝试将该库包含在提供程序中,但我不能保证它可以正常工作。

::Chef::Provider::RubyBlock.send(:include, libraryA::Helpers)

PS。资源确实有定义和参数列表,但代码是从Provider执行的。