2016-05-25 11 views
0

料理本で私はライブラリ(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は直接レシピから働いています。

しかし、私がメソッドnetwork_zoneをruby​​_block(例えばClient_helper.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

のみ必要なクラスにそれを注入するために、任意のプロバイダクラスにメソッドを注入し、その優れたために、その不要:

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

あなたはこれらのクラスをmonkeypatchingれている方法を注入することにより、それがすべて付属しています'monkeypatching'(Google検索はおそらく教育的になる)に関連するリスク。

#network_zoneヘルパーをChef :: ProviderおよびChef :: Resourceの基本クラスに挿入すると、コアリソースまたはプロバイダ、または料理本のリソースまたはプロバイダの同様の名前付きメソッドを上書きします。他の誰かがその名前のメソッドを使用している場合は、コードを破棄します。

+0

パーフェクトで分かりやすい –

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) 

となります。

+2

Chef :: ResourceとChef :: Providerではなく、Chef :: Resource :: RubyBlockクラスを特に対象とする方が良いです。あなたがやっていることをすることで、私たちが書いてくれるすべての将来のプロバイダーや、ユーザーが持っているかそうであろう料理ブックのリソースとプロバイダーの全世界を含む、ベースのO/Sのすべてのリソースとプロバイダーにメソッドを注入していますこれまで使用。コアシェフのリソースまたはプロバイダで#network_zoneメソッドを使用した場合、それを上書きしてコードを破ります。そして、我々はその破損に責任があるとは考えません。 – lamont

関連する問題