【问题标题】:Chef - access new_resource from libraryChef - 从库中访问 new_resource
【发布时间】:2016-02-27 03:42:35
【问题描述】:

有没有办法可以从 Chef 库中访问 new_resource 属性(在 libraries/default.rb 中)?

我目前的解决方案是:

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

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

有没有更好的办法?

【问题讨论】:

  • 你为什么要这样做?感觉好像缺少一些上下文。
  • 我需要从 new_resource 的属性中计算变量。一些计算量很大,需要检查不同属性的值,需要在库中,而不是在提供者中。然后我直接从提供者访问计算变量。
  • 我编辑了我的问题以显示一个用例。我知道我可以将new_resource 属性直接传递给get_script_path,但在不同的actions 中它会是多余的,尤其是知道真正的代码有大量使用这些属性的库函数。我发现这更干净,但我仍然想摆脱 init 函数并直接在 Libraries 模块中访问它们。我也知道库在 Chef 中的任何其他操作之前执行,但我只是问这是否可能。

标签: ruby chef-infra cookbook


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2014-03-31
    • 2013-10-08
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多