Chef infra 如何在食谱中使用库模块

Chef infra 如何在食谱中使用库模块,chef-infra,chef-recipe,chef-solo,cookbook,lwrp,Chef Infra,Chef Recipe,Chef Solo,Cookbook,Lwrp,在一本食谱中,我有一个库(client\u helper.rb)。其中定义了一个模块。模块名称为客户端\u帮助程序。这是模块代码 module Client_helper # This module contains helper methods def network_zone Chef::Log.debug('network zone called...********') Chef::Log.debug("inside-::::"+self.class.t

在一本食谱中,我有一个库(client\u helper.rb)。其中定义了一个模块。模块名称为客户端\u帮助程序。这是模块代码

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)
现在我有了默认的配方。在这里,我从direct recipe调用方法network_zone,它正在工作

但是,当我在ruby\u块内调用方法network\u zone(例如Client\u helper.network\u 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
我的食谱目录结构-


请帮帮我

找到了解决方案!!您需要将模块包括到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) 

我希望这会有所帮助。

没有必要将该方法注入任何提供程序类,最好只将其注入所需的类:

Chef::Recipe.send(:include, Client_helper)
Chef::Resource::RubyBlock.send(:include, Client_helper)
通过注入方法,你就是在对这些类进行修补,而这也带来了与“修补”相关的所有风险(谷歌搜索可能具有教育意义)


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

最好专门针对Chef::Resource::RubyBlock类,而不是Chef::Resource和Chef::Provider。通过这样做,您将方法注入到基本O/S中的每个资源和提供者中,包括我们将要编写的每个未来提供者,以及用户已经或将要使用的烹饪书中的整个资源和提供者。如果我们在任何核心厨师资源或提供者中使用#网络#区域方法,您将覆盖它并破坏我们的代码。我们不会认为自己对那次破损负有责任。