如何在 Cookbook 食谱中使用库模块
How to use library module in Cookbook recipes
在食谱中我有一个库(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
我的食谱目录结构-
请帮助我。
找到解决方法!!您需要将模块包含到 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)
希望对您有所帮助。
无需将方法注入任何提供程序 class,最好只将其注入您需要的 classes:
Chef::Recipe.send(:include, Client_helper)
Chef::Resource::RubyBlock.send(:include, Client_helper)
通过注入方法,您正在对那些 classes 进行猴子修补,并且伴随着与 'monkeypatching' 相关的所有风险(google 搜索可能具有教育意义)。
如果您将您的#network_zone 助手注入到 Chef::Provider 和 Chef::Resource 基础 class 中,这将覆盖任何核心资源或提供程序中任何类似命名的方法,或任何食谱资源或提供者。如果其他人使用该名称的方法,您将破坏他们的代码。
在食谱中我有一个库(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
我的食谱目录结构-
请帮助我。
找到解决方法!!您需要将模块包含到 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)
希望对您有所帮助。
无需将方法注入任何提供程序 class,最好只将其注入您需要的 classes:
Chef::Recipe.send(:include, Client_helper)
Chef::Resource::RubyBlock.send(:include, Client_helper)
通过注入方法,您正在对那些 classes 进行猴子修补,并且伴随着与 'monkeypatching' 相关的所有风险(google 搜索可能具有教育意义)。
如果您将您的#network_zone 助手注入到 Chef::Provider 和 Chef::Resource 基础 class 中,这将覆盖任何核心资源或提供程序中任何类似命名的方法,或任何食谱资源或提供者。如果其他人使用该名称的方法,您将破坏他们的代码。