2016-02-25 73 views
1

有沒有一種方法可以從廚師圖書館裏訪問new_resource屬性(在libraries/default.rb)?廚師 - 從圖書館訪問new_resource

我目前的解決辦法是:

libraries/default.rb

module Libraries 
    def init(resource) 
     @@server_name = resource.server_name 
     @@server_type = resource.server_type 
     @@script  = get_script_path 
     ... 
    end 
    def get_script_path 
     if @@server_type == 'admin' 
      script = 'admin_cntl.sh' 
      path = '/admin_server/bin' 
     elsif @@server_type == 'managed' 
      script = 'managed_cntl.sh' 
      path = '/managed_server/bin' 
     end 
     ::File.join(path, script) 
    end 
end 

providers/default.rb

include Libraries 

action :start do 
    init(new_resource) 
    execute 'my_script' do 
     command "./#{@@script} start" 
    end 
end 

action :remove do 
    init(new_resource) 
    execute 'my_script' do 
     command "./#{@@script} stop" 
    end 
end 

我認爲這是不必要的開銷,但我不能想出一個更好的解決方案。

有沒有更好的方法?

+0

爲什麼你想這樣做?感覺就像缺少一些背景。 – MaxVT

+0

我需要從'''new_resource''屬性中計算變量。 一些計算繁重,檢查不同屬性的值,需要在庫中,而不是在提供者中。 然後我直接從提供者訪問計算的變量。 –

+0

我編輯了我的問題以顯示一個用例。我知道我可以直接將'''new_resource'''屬性傳遞給get_script_path'',但它在不同的''''''''''中是多餘的,特別是要知道真正的代碼有很多使用這些屬性的庫函數。我覺得這更清潔,但我仍然想擺脫'''init'''函數並直接在'''''''''''模塊中訪問它們。我也知道圖書館在廚師任何其他事情之前執行,但我只是問是否可能。 –

回答

1

使用正常的mixin:

# libraries/default.rb 
module MyLibrary 
    def script_path 
    case new_resource.server_type 
    when 'admin' 
     '/admin_server/bin/admin_cntl.sh' 
    when 'managed' 
     '/managed_server/bin/managed_cntl.sh' 
    end 
    end 
end 

# providers/default.rb 
include MyLibrary 

action :start do 
    execute 'my_script' do 
     command "./#{script_path} start" 
    end 
end 

action :remove do 
    execute 'my_script' do 
     command "./#{script_path} stop" 
    end 
end 

還記得你可以直接在提供者定義方法,如果他們只爲一個提供者有用。