我有一个有趣的问题,我通过创建一个Chef资源来重构配方,以处理我在其他配方中可能需要的一些任务。例如,我创建了以下操作:
resource_name :my_command
action :run do
execute "Execute my command" do
environment ({"SETTINGS_FOLDER" => node['settings']['folder']})
command "#{command_exe} -some -params"
end
end
action_class.class_eval do
def command_exe
"#{node['command']['folder']}\\bin\\command.exe"
end
end
当我从食谱中调用my_command
时,它按预期工作。不过,我还有其他几个actions
,这个资源将实现,并且所有人都使用相同的environment
。所以我所做的就是重构资源看起来像这样:
resource_name :command
action :run do
execute "Execute my command" do
environment env
command "#{command_exe} -some -params"
end
end
action_class.class_eval do
def command_exe
"#{node['command']['folder']}\\bin\\command.exe"
end
def env
{"SETTINGS_FOLDER" => node['settings']['folder']}
end
end
现在发生的情况是,一旦chef-client
执行my_command
资源,就会看起来机器上的SETTINGS_FOLDER
环境变量看起来像这样:
SETTINGS_FOLDER = ""C:\my\settings\folder""
注意加倍的双引号?我不确定为什么会这样,但这让command.exe
非常生气:(
['settings']['folder']
属性在食谱attributes/default.rb
中定义如下:
default['settings']['folder'] = 'C:\\my\\settings\\folder'
我的节点正在运行chef-client 13.0.118
编辑我认为加倍的双引号是一个红色的鲱鱼。我认为记录器只是以这种方式表示哈希。我的新想法是,在传递给env
之前,environment
方法可能没有被评估,而是传递了函数引用本身。跟我一起,Ruby不是我的第一语言......
答案 0 :(得分:1)
“env”方法名称可能是保留字或稍后在运行中被踩踏。尝试使用该方法的其他名称?