3

我想在托管许多应用程序(AWS Opsworks)的堆栈层中增加部署时间。当前我收到以下错误:

错误

[2014-05-05T22:27:51+00:00] ERROR: Running exception handlers
[2014-05-05T22:27:51+00:00] ERROR: Exception handlers complete
[2014-05-05T22:27:51+00:00] FATAL: Stacktrace dumped to /var/lib/aws/opsworks/cache/chef-stacktrace.out
[2014-05-05T22:27:51+00:00] ERROR: deploy[/srv/www/lakers_test] (opsworks_delayed_job::deploy line 65) had an error: Mixlib::ShellOut::CommandTimeout: Command timed out after 600s:

提前致谢。

4

1 回答 1

2

首先,正如在报告类似问题的票中提到的,Opsworks 人员建议先尝试加快调用速度(总是有优化的空间)。

如果这不起作用,我们可以进入兔子洞:this 被调用,然后又调用Mixlib::ShellOut.new,它恰好有一个超时选项,您可以在初始化程序中传递!

现在您可以使用Opsworks 自定义说明书覆盖初始方法,并传递相应的超时选项。Opsworks 将其基本说明书的内容与您的自定义说明书的内容合并 - 因此您只需向您的自定义说明书添加和编​​辑一个文件opsworks_commons/libraries/shellout.rb::

module OpsWorks
  module ShellOut
    extend self

    # This would be your new default timeout.
    DEFAULT_OPTIONS = { timeout: 900 }

    def shellout(command, options = {})
      cmd = Mixlib::ShellOut.new(command, DEFAULT_OPTIONS.merge(options))
      cmd.run_command
      cmd.error!
      [cmd.stderr, cmd.stdout].join("\n")
    end
  end
end

请注意唯一的添加是如何DEFAULT_OPTIONS在调用中合并这些选项的Mixlib::ShellOut.new

对此方法的改进是通过chef 属性更改此超时选项,您可以依次通过Opsworks 界面中的自定义 JSON进行更新。timeout这意味着在初始调用中传递属性Opsworks::ShellOut.shellout- 而不是在方法定义中。但这取决于shellout方法实际上是如何被调用的......

于 2015-02-18T18:02:32.963 回答