我的目标是对在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)
该execute
资源可以具有从其运行命令的工作目录的cwd
属性。
execute "rake audit:audi_image_urls" do
command "bundle exec rake audit:audi_image_urls"
cwd '/over/there'
environment 'RAILS_ENV' => 'production'
end
OpsWorks填充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_variables
,environment
则可能需要采购。
在Chef 12 Linux中,堆栈设置可作为Chef数据包使用,并且只能通过Chef搜索来访问。数据袋存储在目录中的一组JSON文件中的AWS OpsWorks Stacks实例上
/var/chef/runs/run-ID/data_bags
,其中run-ID是AWS OpsWorks Stacks分配给在实例上运行的每个Chef的唯一ID。堆栈设置不再可用作Chef属性,因此无法再通过Chef节点对象访问堆栈设置。有关更多信息,请参阅AWS OpsWorks Stacks数据袋参考。
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
Amazon选择不提供JSON的其他事件/命令的属性将丢失为了。
这是可能的,但非常哈克,容易发生破损,填充:deploy
从包含部署状态的最后一个JSON文件属性:{"deploy": { "app_name": { "application": "app_name" }
在/var/lib/aws/opsworks/chef
您还需要deploy::default
在JSON加载后获取属性以填充任何默认值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句