【问题标题】:Chef : Opsworks : run rake task厨师:Opsworks:运行 rake 任务
【发布时间】:2015-01-27 10:54:12
【问题描述】:

我的目标是对我在 Opsworks 中运行的应用执行 rake 任务。
在我看来,我的 opsworks 食谱没有从正确的目录运行 rake。

我如何让食谱在应用主目录中运行(以便它可以获取 Gemfile)?
我需要指定一个 RAILS_ENV 吗?

我的食谱 default.rb:

Chef::Log.info("****** Audit Photo URLS : Running Rake Task ******")
execute "rake audit:audi_image_urls" do
    command "bundle exec rake audit:audi_image_urls"
end

来自 Opsworks 日志的错误:

[2014-11-28T18:36:33+00:00] INFO: Running queued delayed notifications before re-raising exception
[2014-11-28T18:36:33+00:00] ERROR: Running exception handlers
[2014-11-28T18:36:33+00:00] ERROR: Exception handlers complete
[2014-11-28T18:36:33+00:00] FATAL: Stacktrace dumped to /var/lib/aws/opsworks/cache.stage2/chef-stacktrace.out
[2014-11-28T18:36:33+00:00] ERROR: execute[rake audit:audi_image_urls] (auditphoto::default line 3) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '10'
---- Begin output of bundle exec rake audit:audi_image_urls ----
STDOUT: Could not locate Gemfile
STDERR: 
---- End output of bundle exec rake audit:audi_image_urls ----
Ran bundle exec rake audit:audi_image_urls returned 10
[2014-11-28T18:36:33+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

【问题讨论】:

    标签: rake chef-infra aws-opsworks


    【解决方案1】:

    execute resource 可以使用 cwd attribute 作为运行命令的工作目录。

    execute "rake audit:audi_image_urls" do
      command       "bundle exec rake audit:audi_image_urls"
      cwd           '/over/there'
      environment   'RAILS_ENV' => 'production'
    end
    

    OpsWorks Deploy 事件和 Execute Recipes 命令

    厨师 11

    OpsWorks 为 Deploy 事件和 Execute Recipes 堆栈命令填充 node[:deploy]['appshortname'],以容纳每个应用程序配置。有了这些数据,您可以使用:

    execute "rake audit:audi_image_urls" do
      command       "bundle exec rake audit:audi_image_urls"
      cwd           node[:deploy]['appshortname'][:deploy_to]
      user          node[:deploy]['appshortname'][:user]
      group         node[:deploy]['appshortname'][:group]
      environment(  { 'RAILS_ENV' => node[:deploy]['appshortname'][:rails_env] } )
    end
    

    如果您在那里配置了任何相关内容,您可能希望为environment 提供:environment_variables

    厨师 12

    From the AWS stack settings docco

    在 Chef 12 Linux 中,堆栈设置以 Chef data bags 的形式提供,并且只能通过 Chef 搜索访问。数据包存储在 AWS OpsWorks Stacks 实例中 /var/chef/runs/run-ID/data_bags 目录中的一组 JSON 文件中,其中 run-ID 是 AWS OpsWorks Stacks 分配给在实例上运行的每个 Chef 的唯一 ID。堆栈设置不再可用作 Chef 属性,因此无法再通过 Chef 节点对象访问堆栈设置。如需更多信息,请参阅AWS OpsWorks Stacks Data Bag Reference.

    app = search("aws_opsworks_app").first
    
    execute "rake audit:audi_image_urls" do
      command       "bundle exec rake audit:audi_image_urls"
      cwd           app['app_source']['deploy_to']
      user          app['app_source']['user']
      group         app['app_source']['group']
      environment(  { 'RAILS_ENV' => app['app_source']['rails_env'] } )
    end
    

    其他事件和命令

    看起来 OpsWorks 的运行方式与普通 Chef 服务器略有不同,并且每次运行时都会将其自己的 JSON blob 提供给本地 Chef 实例,这意味着(如您所述)其他事件/命令将缺少 :deploy 属性亚马逊选择不提供 JSON。

    从包含部署状态的最后一个 JSON 文件中填充 :deploy 属性是可能的,但非常麻烦且容易损坏:{"deploy": { "app_name": { "application": "app_name" } in /var/lib/aws/opsworks/chef

    您还需要在 JSON 加载后获取 deploy::default 属性以填写任何 defaults

    【讨论】:

    • 是否可以派生诸如应用程序部署目录和rails env之类的东西,而不必设置cwdenvironment属性?
    • 您通常将配置项设置为attributes,并将它们作为变量node['app']['foo']['dir']node['app']['foo']['env'] 插入到配方中。假设 Chef 正在部署您的 rails 应用程序,这些设置在哪里进行部署?
    • 所以我一直在使用 opsworks 默认部署配方,这是我的第一个自定义配方,它似乎将它作为自定义配方运行(不是作为部署的一部分)不会公开我需要的属性.所以我必须为每个环境制作一个单独的配方(具有环境特定属性)?令人着迷。
    • 将 : environment new_resource.environment 添加到执行块中以自动从特定应用程序中派生环境变量
    • @mconlin 是的,我刚刚注意到了。你是如何触发你的食谱/食谱的?可以用execute_recipesstack 命令运行吗?
    猜你喜欢
    • 2012-04-10
    • 2015-03-08
    • 2016-07-19
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2019-03-06
    • 2018-07-24
    相关资源
    最近更新 更多