2016-05-25 12 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 and 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 :: RubyBlock, а не Chef :: Resource and Chef :: Provider. Делая то, что вы делаете, вы вводите методы в каждый ресурс и поставщика в базовом O/S, включая каждого будущего поставщика, который мы будем писать, плюс весь юниверс ресурсов и поставщиков в кулинарных книгах, которые пользователь имеет или будет когда-либо использовать. Если мы когда-нибудь будем использовать метод #network_zone в любом ресурсе или поставщике основного шеф-повара, вы перезапишете его и сломаете наш код. И мы не будем считать себя ответственными за этот полом. – lamont