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