2013-10-19 189 views
2

我正在使用AWS Opsworks托管我的Rails应用程序(Ruby 2.0/Rails 3.2)。 对于资产编译过程,我使用AssetSync在S3上自动上载编译资产。我曾经将凭据存储为环境变量。使用AWS Opsworks设置环境变量

你有什么想法,我该如何与厨师/ Opsworks做到这一点?

谢谢。

回答

1

这现在可以直接从AWS控制台完成的,在应用配置,按照文件:http://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html#workingapps-creating-environment

+0

是的,但还不够!您需要使用Chef处理它,将变量传递给Rails环境。在这里我解释了如何做到这一点:https://medium.com/@diego_durante/opsworks-rails-and-environment-variables-30c6a143253c#.696grsgg9 –

+0

OP在问如何设置它们。处理它们是另一个主题。 – IanBussieres

6

我知道这是一个较旧的帖子,但我张贴这个以防万一这可以帮助别人。

我发现最简单的方法实际上是使用厨师的部署挂钩(http://docs.opscode.com/resource_deploy.html#deploy-phases)之一。

在Rails项目根目录下添加一个名为'deploy'的目录。

在它添加一个名为before_restart.rb文件,用代码:

Chef::Log.info("Running deploy/before_restart.rb") 

# map the environment_variables node to ENV 
node[:deploy].each do |application, deploy| 
    deploy[:environment_variables].each do |key, value| 
    Chef::Log.info("Setting ENV[#{key}] to #{value}") 
    ENV[key] = value 
    end 
end 

当你触发OpsWorks部署,你应该能够看到ENV在Rails应用程序服务器实例日志乏被设置。

+1

这些变量将只在厨师过程中可用。不在我的应用程序中 – Erem

+0

以上过程对我来说在我的主要Rails serers中工作正常。 但我刚刚在自己的堆栈中遇到同样的问题,但这一次与Joey Aghion的delayed_job自定义配方 - 即使根据Chef日志在部署时注入变量,延迟的作业脚本也不会被拾取 所以我要去尝试application.yml或secrets.yml方法 – btsai

+0

正如Erem所说的那样,您将变量传递给Chef,但是您需要处理它以正确地将变量提供给Rails项目在这里我解释一下如何正确地做到这一点:https://medium.com/@dieg o_durante/opsworks-rails-and-environment-variables-30c6a143253c#.696grsgg9 –

2

环境变量之外的另一个选择是您可以在部署时使用其中的变量生成一个文件。

例如,对于Rails应用程序,config/secrets.yml是放置这些的合理位置。我创建部署/ before_restart.rb具有以下内容部署挂钩:

def create_secrets(secrets, release_path) 
    Chef::Log.info("Creating secrets") 
    file_path = ::File.join(release_path, 'config/secrets.yml') 
    ::File.open(file_path, 'w') do |f| 
    f.write("production:\n") 
    secrets.each do |k,v| 
     f.write(" #{k}: #{v}\n") 
    end 
    end 
end 

node[:deploy].each do |application, deploy| 
    create_secrets(deploy[:secrets], release_path) 
end 

,然后在OpsWorks栈自定义JSON,你可以添加你的秘密:

"deploy": { 
    "super_cool_app": { 
     "secrets": { 
     "some_service_id": "foo", 
     "some_password": "bar" 
     } 
    } 
2

您可以创建一个文件夹deploy你的应用程序的根目录,创建一个文件before_restart.rb里面,然后在你的文件中运行预编译任务

run "cd /srv/www/myapp/current && /usr/local/bin/bundle exec rake assets:precompile" 

该文件将在每个d运行eployment

来源:

https://www.youtube.com/watch?v=nHu8fCp9GR4&list=WL&index=7