Подтвердить что ты не робот

Капистрано и переменные окружения

Я переключился на использование переменных окружения для конфигурации, и он работает очень хорошо - за исключением случаев, когда мне приходится развертывать или запускать задачи с capistrano.

Capistrano 3, похоже, выполняет каждую команду с префиксом /usr/bin/env, которая стирает любые переменные среды, которые я установил через .bashrc.

РЕДАКТИРОВАТЬ - при выполнении некоторого повторного поиска это может и не быть проблемой, проблема может заключаться в том, что capistrano выполняется как не-login, неинтерактивная оболочка и не загружает .bashrc или .bash_profile. Тем не менее, застрял.

Каким будет лучший способ убедиться, что окружения vars установлены, когда capistrano выполняет свои задачи?

4b9b3361

Ответ 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