Capistrano и переменные среды

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

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

редактировать - при выполнении еще одного reasearch это может быть не проблема, проблема может быть в том, что capistrano выполняется как не вход, неинтерактивная оболочка и не загружается .bashrc или .bash_profile. Но все равно застрял.

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

5 ответов


вы бы лучше смотреть на!--9-->разницу между ENVIRONMENT VARIABLES и SHELL VARIABLES

когда вы запускаете SSH, ваше приложение будет загружать переменные оболочки, которые определены в вашем . Они существуют только для жизни оболочки, и поэтому мы не используем их столько, сколько ENV ВАР

вы можете быть лучше положить ENV vars в:

/etc/environment

такой:

export ENVIRONMENT_VAR=value

это сделает переменных во всей системе, а не только в разных сеансах оболочки


обновление

вы пробовали

Capistrano: могу ли я установить переменную среды для всего сеанса cap?

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

хотя на это был ответ, я собираюсь оставить это здесь, Если кто-то еще находится в той же ситуации, что и я.

Капистрано тут загрузить .bashrc. Но если вы заметите в верхней части файла есть это:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

решение было просто поставить любую настройку выше этого, и Capistrano работает так, как я хочу.

это решение также было отмечено на этот вопрос GitHub.


для отладки обновления проблемы config/deploy.rb С простой задачей:

namespace :debug do
  desc 'Print ENV variables'
  task :env do
    on roles(:app), in: :sequence, wait: 5 do
      execute :printenv
    end
  end
end

теперь бегите cap staging debug:env. Вы должны иметь возможность видеть эффективную конфигурацию ENV переменные.

порядок и имена файлов зависят от вашего дистрибутива, например, на Ubuntu последовательность поиска следующая:

  1. /etc/environment
  2. /etc/default/locale
  3. /etc/bash.bashrc
  4. ~/.bashrc

, когда ~/.bashrc содержит первые строки, как это, любой код после этого не будет получен:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

чтобы понять, как capistrano загружает переменные ENV этот график (источник) может быть полезным.

скорее всего ~/.bash* файл не загружается из-за неинтерактивного сеанса.

capistrano env variables loading


вам нужно установить переменные окружения в /etc/environment файл, чтобы сделать их доступными для всех пользователей и процессов в системе. Переменные среды в .bashrc или .bash_profile файлы доступны только в сеансе оболочки, а не для автоматически порожденных процессов и служб.

Я сделал библиотеку Капистрано (capistrano-env_config) некоторое время назад для управления и синхронизации переменных среды в кластере, который работает точно путем изменения . Это простой в использовании и похож на то, как вы можете установить переменные среды с помощью Heroku toolbelt. Вот несколько примеров:

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

решение, на котором я остановился, было:

  1. включите параметр PermitUserEnvironment в файле /etc/ssh / sshd_config всех серверов, на которых мне нужно развернуть.
  2. добавить в ~/.файл ssh / environment для домашнего каталога каждого пользователя я развертываю с помощью env vars в виде пар ключ=значение (я развертываю каждое приложение и службу через собственного пользователя в домашнем каталоге этого пользователя).

ссылка: http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fenvironment

на самом деле все гораздо хуже. Я использую Upstart для управления Puma / Rails,и мне также нужен набор env vars. Итак, после нескольких дней экспериментов я пришел к следующему полному, но ужасающему решению:--1-->

  1. установите мои env vars в пользователя .bashrc с помощью "export KEY=VALUE". (Таким образом, они существуют, когда я SSH в интерактивном режиме.)
  2. установите мой env vars в пользователь. файл ssh / environment с использованием "KEY=VALUE". (Таким образом, они существуют, когда Капистрано Шшш.)
  3. установите мой env vars в /etc/init / puma.раздел "сценарий" conf. (Таким образом, они существуют, когда начинается Puma/Rails.)

Это боль в заднице, поддерживая один и тот же список env vars в нескольких файлах/шаблонах и в нескольких форматах (с экспортом, без экспорта...). К счастью, это сделало немного проще/надежнее, используя Puppet для управления конфигурацией узла раньше Capistrano используется для развертывания на нем...

Я действительно ненавижу весь домен оболочек linux, инициализации и dotfiles. Пришло время для полной перезагрузки.