背景信息:我已经制作了一个使用ruby gem Devise的Ruby on Rails应用程序。使用gem时,我已将OpsWorks控制台中gem的密钥配置为环境变量。
运行before_migrate.rb
部署挂钩时,我运行命令rake assets:precompile
。但是我在部署日志中收到错误。
execute "rake assets:precompile" do
cwd release_path
command "bundle exec rake assets:precompile"
environment "RAILS_ENV" => rails_env
end
在资源上执行操作
run
时出错'执行[rake 资产:预编译]' Mixlib :: ShellOut :: ShellCommandFailed预期进程以[0]退出,但已收到' 1' ----开始输出bundle exec rake assets:precompile --trace ---- STDOUT:STDERR:
**调用资产:预编译(first_time) **调用资产:环境(first_time)
**执行资产:环境
**调用环境(first_time)
**执行环境耙中止! Devise.secret_key没有设置。请将以下内容添加到您的Devise初始化程序中:
config.secret_key =' *****'
我知道最终会设置环境变量,因为在我的before_migrate.rb
文件中,我将环境变量输出到log。当我硬编码config.secret_key
时,一切正常。
问题:在使用OpsWorks时,我的项目中的初始值设定项config/initializers/*
是否会在任何环境变量设置之前运行?如果没有硬编码密钥或SSH连接到每个实例,还有另一种解决方法吗?
答案 0 :(得分:0)
您可以通过
access在厨师食谱中SUMIFS环境变量node[:deploy]['<YOUR_APP_SHORT_NAME>'][:environment_variables][:SECRET_KEY_BASE]
因此,您可以编写一个配方,将secrets.yml或something.yml与环境值放在一起。 创建模板
<强> your_cookbook /模板/默认/ secret.yml.erb 强>
secret_key: <%= node[:deploy]['<YOUR_APP_SHORT_NAME>'][:environment_variables][:SECRET_KEY_BASE] %>
您可以通过食谱将 secret.yml 放入 / data / YOUR_APPLICATION_SLUG_NAME / shared / config 。
<强> your_cookbook /食谱/默认/ secret.rb 强>
template "/data/#{<YOUR_APP_SLUG_NAME}/shared/config/secrets.yml" do
source "secrets.yml.erb"
owner 'OWNER'
end
并确保将shared / config文件夹中的secrets.yml符号链接到部署挂钩中的before_migrate.rb中的发布路径。
<强> your_code_path /部署/ before_migrate.rb 强>
run "ln -nfs /data/<YOUR_APP_SLUG_NAME>/shared/config/secrets.yml #{release_path}/config/secrets.yml"
在部署生命周期事件中使用配方your_cookbook::secret
。
现在您将在代码路径/ config中生成secrets.yml。您必须加载该yaml并将其设置在config / initializer / devise.rb
中config.secret_key = <SECRET KEY FROM THE YML GENERATED>