Chef - 从图书馆访问 new_resource

Chef - access new_resource from library

有没有一种方法可以从 Chef 库(在 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

我认为这是不必要的开销,但我想不出更好的解决方案。

有没有更好的方法?

使用普通的混入:

# 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

另请记住,如果方法只对那个提供者有用,您可以直接在提供者中定义方法。