【发布时间】: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