Капистрано и переменные окружения
Я переключился на использование переменных окружения для конфигурации, и он работает очень хорошо - за исключением случаев, когда мне приходится развертывать или запускать задачи с capistrano.
Capistrano 3, похоже, выполняет каждую команду с префиксом /usr/bin/env
, которая стирает любые переменные среды, которые я установил через .bashrc
.
РЕДАКТИРОВАТЬ - при выполнении некоторого повторного поиска это может и не быть проблемой, проблема может заключаться в том, что capistrano выполняется как не-login, неинтерактивная оболочка и не загружает .bashrc
или .bash_profile
. Тем не менее, застрял.
Каким будет лучший способ убедиться, что окружения vars установлены, когда capistrano выполняет свои задачи?
Ответы
Ответ 1
Лучше всего посмотреть на разницу между ENVIRONMENT VARIABLES
и SHELL VARIABLES
Когда вы запускаете SSH, ваше приложение будет загружать переменные SHELL, которые определены в вашем файле .bashrc
. Они существуют только для жизни оболочки, и поэтому мы не используем их так же, как ENV
vars
Возможно, вам лучше разместить vars ENV
в:
/etc/environment
Вот так:
export ENVIRONMENT_VAR=value
Это сделает переменные доступными во всей системе, а не только в разных сеансах оболочки
Обновление
Вы пробовали
Capistrano: Могу ли я установить переменную среды для всего сеанса кепки?
set :default_env, {
'env_var1' => 'value1',
'env_var2' => 'value2'
}
Ответ 2
Хотя на это был дан ответ, я собираюсь оставить это здесь, если кто-то еще находится в той же ситуации, что и я.
Капистрано загружает .bashrc
. Но если вы заметите, что в верхней части файла есть следующее:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Решение было просто поставить любую настройку выше этого, и Капистрано работает так, как я хочу.
Это решение было также отмечено в этой проблеме GitHub.
Ответ 3
Решение, на котором я остановился, было:
- Включить параметр PermitUserEnvironment в /etc/ssh/sshd _config всех серверов, которые мне нужно развернуть.
- Добавьте файл ~/.ssh/environment для каждого пользовательского домашнего каталога, в который я развернусь, с помощью env vars в виде пар KEY = VALUE (я развертываю каждое приложение и службу через его собственного пользователя в этом домашнем каталоге пользователя).
Ссылка: http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fenvironment
На самом деле это хуже. Я использую Upstart для управления Puma/Rails, и вам нужны также env vars. Итак, после нескольких дней экспериментов я закончил следующее полное, но ужасное решение:
- Задайте свои env vars в пользователе .bashrc, используя "export KEY = VALUE". (Таким образом, они существуют, когда я SSH в интерактивном режиме.)
- Задайте мои env vars в файле .ssh/environment пользователя с помощью "KEY = VALUE". (Таким образом, они существуют, когда Capistrano SSHs in.)
- Установите мои env vars в /etc/init/puma.conf "script". (Таким образом, они существуют, когда начинается Puma/Rails.)
Это боль в заднице, поддерживающая тот же список env vars в нескольких файлах/шаблонах и в нескольких форматах (с экспортом, без экспорта...). К счастью, он стал немного проще/надежнее, используя Puppet для управления конфигурацией node, прежде чем Capistrano будет использоваться для его развертывания...
Я действительно ненавижу весь домен оболочки Linux, инициализацию и dotfiles. Это время для полной перезагрузки.
Ответ 4
Вам необходимо установить переменные среды в файле /etc/environment
, чтобы сделать их доступными для всех пользователей и обработать в системе. Переменные окружения в файлах .bashrc
или .bash_profile
доступны только в сеансе оболочки, а не для автоматически генерируемых процессов и служб.
Я создал библиотеку Capistrano (capistrano-env_config
) некоторое время назад для управления и синхронизации переменных среды в кластере, который работает точно, изменяя файл /etc/environment
. Он прост в использовании и похож на то, как вы можете установить переменные среды с инструментальной панелью Heroku. Вот несколько примеров:
cap env:list
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...]
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...]
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...]
cap env:sync