【问题标题】:action_class.class_eval method not working with execute resource's environment propertyaction_class.class_eval 方法不适用于执行资源的环境属性
【发布时间】: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


【解决方案1】:

“env”方法名称可能是一个保留字或在运行后期被踩踏。试试这个方法的不同名称,也许?

【讨论】:

  • 你是对的!我在execute 资源文档中找到了这一点:env is an alias for environment 将方法名称更改为enviro 工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多