2015-02-28 2 views
9

Я запускаю приложение Ubuntu 14.04 LTS 64 бит Rails и я не могу получить доступ к моим переменным среды приложения.AWS OpsWorks переменные среды не работают

В OpsWorks App панели, я поставил свои переменные окружения, скажем:

MYKEY: 1234 

Затем я сохранить и развернуть мое приложение еще раз, чтобы сделать их видимыми.

В моем приложении Rails или консолях рельсов я получаю ноль:

$ bundle exec rails c production 
>ENV["MYKEY"] 
=> nil 

Я пытался перезапустить сервер. Я не уверен, что мне не хватает, я использовал переменные среды в других сервисах.

Как я могу отслеживать, где они должны быть установлены?

+0

Если я схожу и запускаю 'sudo opsworks-agent-cli get_json', я вижу, что у MYKEY есть' {"deploy": {"server": {"environment": {"MYKEY": "1234"} .. ' – peterept

+0

Вы получили решение для этого? – loganathan

+0

Странно, что выяснилось, что он работает в экземплярах производства Passenger, но не работает, когда я '$ bundle exec rails c production' как пользователь развертывания (который является тем же самым пользователем, что и Пассажир работает под). Apache работает под www-данными, но если я вхожу в качестве www-data или deploy, я не вижу никаких env vars. Так что я бегу, но я понятия не имею, что происходит под капотом. – peterept

ответ

4

OpsWorks хранит переменные среды в разных местах в зависимости от того, какое приложение вы развертываете. В Rails/Passenger они должны быть сохранены в конфигурационном файле Apache #{your_app_name}.conf. (Source)

Это означает, что они недоступны в вашей обычной среде оболочки.

Я знаю, что рецепты Node.js хранятся в файле /srv/www/#{app_name}/shared/app.env ... который затем отправляется в среду, чтобы запустить сервер узла. Эта деталь реализации также означала, что вы могли бы написать сценарии оболочки, которые были получены из файла app.env, а затем вызвали некоторый сценарий Node или что-то еще.

Конечно, Rails не является узлом. Я даже не подозреваю, что переменные окружающей среды также хранятся где-то в другом месте: быстрый взгляд на рецепты Rails в кулинарных книжках OpsWorks не нашел ничего очевидного, но, возможно, я что-то пропустил.

В зависимости от количества изменений вы собираетесь в вашем OpsWorks поваренной книге, вы можете создать рецепт Deploy, что делает что-то вроде этого:

application_environment_file do user deploy[:user] group deploy[:group] path ::File.join(deploy[:deploy_to], "shared") environment_variables deploy[:environment_variables] end

(возможно регулировочный пути)

Затем, чтобы запустить консоль, когда вы используете SSHed на сервере, сделайте что-нибудь вроде

sudo source /srv/www/my_app_name/shared/app.env; bundle exec rails console -e production или что-то еще.

+0

Большое вам спасибо, это правильная информация! Если я вижу '/ etc/apache2/sites-enable/myapp.conf', я вижу там' SetEnv 'PKTEST "" тестирование "так ясно, что на самом деле OpsWorks пишет и почему его не видно пульт рельсов. – peterept

+0

Я ответил более подробно и с полным справочником. Пожалуйста, проверьте это и подумайте о том, чтобы отметить его как правильный ответ. Спасибо. –

1

I (с некоторой помощью от Bruno на AWS PopUp Loft в Нью-Йорке) добавил некоторый пользовательский код Chef внутри крюка развертывания after_restart.rb, просто добавьте папку «развернуть» в корневой каталог приложений и внутри добавьте «after_restart». ЕВ «. В нем ....

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

contents = [] 

node[:deploy].each do |application, deploy| 
    deploy[:environment_variables].each do |key, value| 
    contents << "export #{key}=\"'#{value}'\"" 
    end 
end 


Chef::Log.info("Adding the environment variables to /etc/profile.d/startup_env_config.sh") 

bash "create_startup_env_config.sh" do 
    user "root" 
    cwd "/etc/profile.d" 
    code <<-EOH 
    echo \''#{contents.join(" ")}\'' > startup_env_config.sh 
    source startup_env_config.sh 
    cd #{release_path} 

    EOH 
    end 

И все. Если вы обновите переменные среды внутри панели OpsWorks, не забудьте перезапустить свои экземпляры.

+0

Я пробовал этот рецепт, но это не сработало! Я добавил свой ответ ниже с полным подробным руководством по эксплуатации –

+0

Эй, Диего - что пошло не так? Каковы были ошибки? – dsieczko

+0

Я сделал небольшое изменение – dsieczko

3

Консоль AWS OpsWorks позволяет объявлять переменные окружения, но , чтобы они были доступны для нашего приложения Rails, нам нужно использовать рецепт повара шеф-повара и некоторые меры предосторожности.

В двух словах мы используем конфигурации/secrets.yml файл в сочетании с конфигурации/приложения.yml file, Figaro gem и Рецепт поваренной книги повара. Рецепт поваренной книги повара читает переменные, определенные в консоли OpsWorks, и позволяет им использовать приложение Rails, записывающее файл config/application.yml.

Я опубликовал подробное руководство, чтобы объяснить, как именно это сделать. Link here.

Это основные моменты, которые я охватываемые:

  1. Использование конфигурации/secrets.yml файл (добавлены из Rails 4.1)
  2. Использование Figaro жемчужину для загрузки переменных в среде
  3. переменные окружения Declare внутри AWS OpsWorks консоли
  4. использования пользовательской Ch рецепт для создания конфигурации/application.yml файла, Figaro будет использовать, чтобы переменные, доступные