【发布时间】:2017-10-31 17:25:02
【问题描述】:
我有一个有趣的问题,我通过创建一个 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 不是我的第一语言...
【问题讨论】:
-
您在最后一个示例中的引号不匹配,您确定这是您所拥有的吗?
-
@coderanger 很好,解决了这个问题。在我的属性文件中是正确的,只是这里抄错了
标签: ruby chef-infra