我通过一个模块扩展了配方类以提供一些属性,这些属性使我能够全局访问我的路径,这些路径是动态构造的。例子:
module Variables
def user
"user_name"
end
def user_home
"/home/#{node['user']}"
end
end
class Chef::Recipe
include Variables
end
问题是,在资源块中这些方法不可用。
bash "do_something_with_property" do
user user
code "somecommand #{user_home}"
end
NoMethodError:Chef::Resource::Bash 的未定义方法“user_home”
奇怪的行为是,用户属性工作正常,但代码块中使用的 a 属性不起作用。
在此之后,我还通过这样做将模块包含到所有资源中:
class Chef::Resource
include Variables
end
现在,我的 user_home 属性在资源块中的行为与在“外部”使用时不同,这意味着:
directory "#{user_home}/new_dir" do
action :create
end
创建 /home/user_name/new_dir
bash "create_dir" do
code "mkdir #{user_home}/new_dir"
end
结果 /home//new_dir
我已经用一个小测试脚本对此进行了测试,一切正常。
module MyModule
def module_method
puts "blablalba"
end
end
class A
def block_method (&block)
block.call
end
end
class B
include MyModule
def doit
a = A.new
a.block_method { module_method }
end
end
B.new.doit
所以对我来说,这似乎是厨师特有的问题。
谁能解释一下,为什么会这样?
是否有更好的解决方案来全局访问动态构建的路径和属性?
谢谢。