Capistrano: Могу ли я установить переменную среды для всего сеанса cap? - PullRequest
34 голосов
/ 29 сентября 2011

У меня есть промежуточный сервер с установленными стандартными Ruby и Ruby Enterprise.Поскольку стандартный Ruby отказывается устанавливать критический гем, мне нужно установить $ PATH так, чтобы ruby ​​/ gem / rake / etc.всегда обращайтесь к версии REE.И поскольку я использую Capistrano для развертывания на наших машинах, мне нужно сделать это в Capistrano.

Как я могу один раз установить переменную среды и сохранить ее в течение сеанса Capistrano?

1) Это легко сделать в файлах bashrc, но Capistrano не читает файлы bashrc.

2) Я бы использовал Capistrano

default_environment['PATH'] = 'Whatever'

, но Capistrano использует ихпеременные окружения, такие как

env PATH=Whatever command arg ...

, и они теряются всякий раз, когда в исполняемом файле передается другая оболочка, передаваемая в env.Например, когда вы используете sudo.Что очень важно:

[holt@Michaela trunk]$ env VAR=hello ruby -e "puts ENV['VAR']"
hello
[holt@Michaela trunk]$ env VAR=hello sudo ruby -e "puts ENV['VAR']"
nil

3) И я не могу использовать команду bash export, так как она тоже потеряна - Capistrano, похоже, запускает новую оболочку для каждой команды (или что-то в этом роде)и это тоже потеряно:

cap> export MYVAR=12
[establishing connection(s) to xxx.xxx.xxx.xxx]
cap> echo $MYVAR
 ** [out :: xxx.xxx.xxx.xxx] 
cap> 

4) Я пробовал возиться с опциями Capistrano: shell и: pty, а также (и в сочетании с другими подходами), но там тоже не повезло.

Итак, каков правильный способ сделать это? Это кажется такой простой задачей, что должен быть действительно простой способ ее выполнить, но у меня нет идей.Кто-нибудь?

Заранее спасибо!

Ответы [ 5 ]

51 голосов
/ 28 сентября 2012

У меня точно такая же проблема, но я думаю, что это решение лучше:

set :default_environment, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}

Это работает для меня как шарм.

10 голосов
/ 18 февраля 2012

Если вам нужно установить переменную на удаленном хосте, отличную от PATH, вы должны знать, что sshd по умолчанию допускает только определенные переменные окружения /etc/profile или ~/.bashrc по соображениям безопасности.Как сказал Лу, вы можете либо выполнить cap shell и использовать команду cap> printenv, либо вы можете выполнить cap COMMAND=printenv invoke в одной команде.

Если вы видите переменную при обычном ssh в удаленной оболочке,но вы не видите этого в команде cap printenv, вот одно из решений:

  1. Установите PermitUserEnvironment yes в файле /etc/ssh/sshd_config вашего удаленного сервера и перезапустите sshd
  2. Отредактируйте файл ~/.ssh/environment для удаленного пользователя, которого вы используете как ssh, и поместите туда свою переменную (и) как VARIABLE=value

Теперь они должны отображаться, когда вы делаете cap COMMAND=printenv invoke

5 голосов
/ 07 октября 2011

Я думаю, что у вас на самом деле 2 проблемы:

1) Вы хотите изменить PATH на своем удаленном хосте (ах).

Измените / установите путь в вашем .bashrc на вашем удаленном хосте (ах) и запустите cap> printenv, если ваш путь верен, перейдите к # 2, иначе попробуйте добавить export BASH_ENV=~/.bashrc к вашему /etc/profile (будьте осторожны , ~ / .bashrc будет запущен для всех неинтерактивных оболочек для всех пользователей)

2) Вы хотите, чтобы sudo сохранил свой PATH

Запустите visudo на удаленных хостах и ​​добавьте:

Defaults        exempt_group = "<your_user>"
3 голосов
/ 20 сентября 2012

Мне нужно было установить переменную среды для выполнения конкретной задачи. Команда «run» позволяет вам передавать опции, которые включают: env:

run "cmd", :env => { 'name' => 'value' }

В моем случае я хотел добавить переменную окружения к задаче, которую я не писал, поэтому я использовал default_run_options, который используется всеми вызовами run. Я добавил это в начало моего Capfile:

default_run_options[:env] = { 'name' => 'value' }
0 голосов
/ 10 апреля 2014

Я безуспешно пытался использовать метод @ brian-defling, который довольно часто используется другими, кто обсуждал это ... Возможно, я делаю что-то не так, но тем временем я нашел камень dotenv-rails, и он работалотлично подходит для загрузки значений из файла .env в корне моего проекта.

Инструкции по их Github repo довольно просты.Я добавил Dotenv.load к своему config/application.rb

...