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 последовательность поиска следующая:
/etc/environment
/etc/default/locale
/etc/bash.bashrc
~/.bashrc
, когда ~/.bashrc
содержит первые строки, как это, любой код после этого не будет получен:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
чтобы понять, как capistrano
загружает переменные ENV этот график (источник) может быть полезным.
скорее всего ~/.bash*
файл не загружается из-за неинтерактивного сеанса.
вам нужно установить переменные окружения в /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
решение, на котором я остановился, было:
- включите параметр PermitUserEnvironment в файле /etc/ssh / sshd_config всех серверов, на которых мне нужно развернуть.
- добавить в ~/.файл ssh / environment для домашнего каталога каждого пользователя я развертываю с помощью env vars в виде пар ключ=значение (я развертываю каждое приложение и службу через собственного пользователя в домашнем каталоге этого пользователя).
ссылка: http://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fenvironment
на самом деле все гораздо хуже. Я использую Upstart для управления Puma / Rails,и мне также нужен набор env vars. Итак, после нескольких дней экспериментов я пришел к следующему полному, но ужасающему решению:--1-->
- установите мои env vars в пользователя .bashrc с помощью "export KEY=VALUE". (Таким образом, они существуют, когда я SSH в интерактивном режиме.)
- установите мой env vars в пользователь. файл ssh / environment с использованием "KEY=VALUE". (Таким образом, они существуют, когда Капистрано Шшш.)
- установите мой env vars в /etc/init / puma.раздел "сценарий" conf. (Таким образом, они существуют, когда начинается Puma/Rails.)
Это боль в заднице, поддерживая один и тот же список env vars в нескольких файлах/шаблонах и в нескольких форматах (с экспортом, без экспорта...). К счастью, это сделало немного проще/надежнее, используя Puppet для управления конфигурацией узла раньше Capistrano используется для развертывания на нем...
Я действительно ненавижу весь домен оболочек linux, инициализации и dotfiles. Пришло время для полной перезагрузки.