action_class.class_eval方法不使用执行资源的环境属性

时间:2017-05-31 04:36:31

标签: ruby chef

我有一个有趣的问题,我通过创建一个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不是我的第一语言......

1 个答案:

答案 0 :(得分:1)

“env”方法名称可能是保留字或稍后在运行中被踩踏。尝试使用该方法的其他名称?