ruby - Chef - 从库访问 new_resource

标签 ruby chef-infra cookbook

有没有办法可以从 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

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

有更好的方法吗?

最佳答案

使用普通的 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

另请记住,如果方法仅对某个提供程序有用,您可以直接在提供程序中定义方法。

关于ruby - Chef - 从库访问 new_resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638564/

相关文章:

ruby-on-rails - 有没有更简单的方法在 Ruby 中构建 HTML?

ruby - 有没有办法在 Vim 中折叠所有多行 Ruby 注释?

html - 导航栏的 Bootstrap 下拉菜单

chef-infra - 如何覆盖 Chef 中的默认属性

chef-infra - 如何对 Chef 搜索中的节点进行排序?

linux - Chef 服务器卡在 Docker 容器上运行的 ruby​​_block [supervise_rabbitmq_sleep] 操作

mysql - Chef :了解 Chef::resource 提供?

dependencies - 解决 chef-solo Recipe 依赖关系

javascript - Rails 服务器/控制台错误 - 没有要加载的文件 - CoffeeScript (LoadError)