2016-07-19 5 views
1

У меня есть приложение для рельсов (4.2) через Passenger (5.0.28) + Apache (2.4.7) в системе Ubuntu (14.02), рубин (2.3.0), управляемый с помощью rbenv. Я развертываю с Capistrano (3.4.0).Как получить доступ к переменным окружения во время развертывания Capistrano?

Все мои переменные среды установлены в очень простом сценарии profile.d.

#!/bin/sh 
export VAR1=VAL1 
export VAR2=VAL2 

Это работает как шарм. В моем приложении ENV есть все правильные переменные, Secrets.yml правильно заполнен ... все работает ЗА ИСКЛЮЧЕНИЕМ при развертывании с Capistrano по ssh.

В моей deploy.rb я следующее, что я думаю, relavant:

set :ssh_options, { 
forward_agent: true, 
paranoid: true, 
keys: "~/.ssh/id_rsa.pub" 
} 

Capistrano документы являются невероятно ограниченным и SSH \ конфигурация сервера не мой конек, я не могу понять, почему мои ENV переменные Капистрано не видели. Если во время развертывания я запускаю puts ENV.inspect, я получаю такие вещи, как "TERM_PROGRAM"=>"Apple_Terminal" и информацию о моем локальном компьютере и многое другое. Почему Capistrano не использует удаленную среду? Как я могу изменить свою конфигурацию на стороне сервера или в моем сценарии развертывания, чтобы исправить это?

Спасибо за помощь.

ответ

3

Сначала я считаю, что требуется некоторое уточнение терминологии и модель исполнения Капистрано.

Capistrano - это программа, которая запускается на вашей локальной машине. Итак, ENV внутри Capistrano видит вашу локальную среду, а не сервер. Capistrano не может «видеть» удаленный ENV с простым кодом Ruby, потому что код Ruby, который составляет Capistrano, не выполняется там.

Что такое Capistrano do - это использование SSH для отправки команд серверу, который должен быть выполнен там. Такие команды, как mkdir, bundle install и т. Д.

Чтобы увидеть это иллюстрировано, добавить задачу Capistrano к вашему потоку развертывания, который делает это:

task :puts_remote_env do 
    on roles(:all) do 
    remote_env = capture("env") 
    puts remote_env 
    end 
end 

Это запустит команду env на удаленном сервере, захватить результат, и распечатать его на консоль.

Надеюсь, это поможет понять, как работает Капистрано.


Итак, как вы можете видеть из puts_remote_env вывода, переменные, определенные в вашем profile.d сценария не существует. Зачем?

Это потому, что Капистрано использует не-регистрационный, неинтерактивный сеанс SSH. В этом сеансе SSH ваш сценарий profile.d не оценивается. Это подробно объясняется в FAQ Capistrano: http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/

Вам нужно найти другой способ установить эти переменные, отличные от profile.d.

Вы можете указать их в самой конфигурации Capistrano (например,production.rb), как это:

set :default_env, { var1: "val1", var2: "val2" } 

Capistrano будет явно установить эту среду, когда он выполняет команду SSH.

Или вы можете использовать такой инструмент, как dotenv, который позволяет Rails читать переменные переменных из специального файла вместо того, чтобы полагаться на среду исполнения.

Или вы можете поэкспериментировать с различными локальными файлами точек, чтобы увидеть, есть ли некоторые из них, которые все еще оцениваются даже в неинтерактивном, неинтерактивном сеансе. На Ubuntu у меня был успех, экспортирующий переменные на самом верху ~/.bashrc.

+1

Отличный ответ. –

+0

Большое вам спасибо за то, что нашли время, чтобы написать это. Эта диаграмма в конце ссылки фантастическая. –