2016-02-25 37 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 

还记得你可以直接在提供者定义方法,如果他们只为一个提供者有用。