如何在Cookbook食谱中使用库模块

时间:2016-05-25 10:36:22

标签: chef chef-recipe chef-solo cookbook lwrp

在食谱中我有一个图书馆( client_helper.rb )。在其中定义了一个模块。模块名称为 Client_helper 。这是模块代码。

module Client_helper
# This module contains helper methods

def network_zone
        Chef::Log.debug('network zone called...********')
        Chef::Log.debug("inside-::::"+self.class.to_s)
end    

end
Chef::Recipe.send(:include, Client_helper)

现在我有默认配方。我从直接配方调用方法 network_zone 的地方就可以了。

但是当我在 ruby​​_block(例如Client_helper.network_zone)中调用network_zone方法时,它无法正常工作

请查找食谱代码。

# Cookbook: client
# Recipe: default

Chef::Resource.send(:include, Sap_splunk_client_helper)   


  host_network_zone = network_zone # This is working

Log.info("inside-::::"+self.class.to_s)

ruby_block 'parse auto generated templates' do
  block do
    host_network_zone = Client_helper.network_zone #This is not working
    Log.info("inside ruby block-::::"+self.class.to_s)
end
end

我的食谱目录结构 -

enter image description here

请帮帮我。

2 个答案:

答案 0 :(得分:5)

没有必要将方法注入任何提供程序类,最好只将它注入到您需要的类中:

Chef::Recipe.send(:include, Client_helper)
Chef::Resource::RubyBlock.send(:include, Client_helper)

通过注入方法,你可以对这些类进行monkeypatching,并伴随着与monkeypatching'相关的所有风险。 (谷歌搜索可能会有教育意义)。

如果您将#network_zone助手注入Chef :: Provider和Chef :: Resource基类,这些类将覆盖任何核心资源或提供程序或任何cookbook资源或提供程序中任何类似命名的方法。如果其他人使用该名称的方法,您将破坏他们的代码。

答案 1 :(得分:0)

找到解决方案!!您需要将模块包含在Chef :: Recipe,Chef :: Resource和Chef :: Provider中。 所以完整的代码将是 -

# This module contains helper methods
module Client_helper     

def network_zone
        Chef::Log.debug('network zone called...********')
        Chef::Log.debug("inside-::::"+self.class.to_s)
end    

end
Chef::Recipe.send(:include, Client_helper)
Chef::Resource.send(:include, Client_helper)
Chef::Provider.send(:include, Client_helper) 

我希望这会有所帮助。