Ruby, Unicorn и переменные окружения
Во время игры с Heroku я нашел, что их подход к использованию переменных среды для локально-серверной конфигурации близок. Теперь, когда я настраиваю собственный сервер приложений, я задаюсь вопросом, насколько сложно будет реплицироваться.
Я развертываю приложение синатра, верховая езда на Единороге и Nginx. Я знаю, что nginx не любит играть с окружающей средой, так что один из них. Я могу, вероятно, поместить vars в конфигурационный файл unicorn, но так как это под управлением версиями с остальной частью приложения, это своего рода поражение, цель настройки конфигурации в серверной среде. Нет причин не хранить файлы конфигурации, специфичные для приложения, вместе с остальной частью приложения, насколько мне известно.
Третий и последний (насколько мне известно) вариант устанавливает их в оболочку нереста. То, где я заблудился. Я знаю, что логин и не-login-оболочки используют разные rc файлы, и я не уверен, что вызов чего-то с sudo -u http stuff
является или не порождает оболочку входа. Я сделал домашнее задание и спросил гуглу и человека, но я все еще не совсем уверен, как подойти к нему. Может быть, я просто тупой... в любом случае, я был бы очень признателен, если бы кто-то мог пролить свет на всю окружающую среду оболочки.
Ответы
Ответ 1
Я думаю, что ваша третья возможность находится на правильном пути. То, что вам не хватает, - это идея обертки script, единственной функцией которой является настройка среды, а затем вызов основной программы с любыми параметрами.
Чтобы создать оболочку script, которая может функционировать как элемент управления script (если prodEnv использует DB = ProdDB и т.д.), есть еще одна часть, которая упрощает эту проблему. Bash/ksh поддерживают функцию, называемую файлами sourcing. Это операция, которую предоставляет оболочка, открыть файл и выполнить то, что находится в файле, так же, как если бы оно было выровнено в главном script. Как #include
на C и других языках.
ksh и bash будут автоматически отправляться /etc/profile
, /var/etc/profile.local
(иногда), $HOME/.profile
. Существуют и другие имена файлов, которые также будут собраны, но в этом случае вам нужно создать свой собственный файл env и явно загрузить его.
Как мы говорим о сценариях-оболочках, и вы хотите управлять настройкой среды, вы захотите выполнить поиск внутри оболочки script.
Как вы отправляете файл окружения?
envFile=/path/to/my/envFile
. $envFile
где envFile будет заполнен такими выражениями, как
dbServer=DevDBServer
webServer=QAWebServer
....
вы можете обнаружить, что вам нужно экспортировать эти переменные, чтобы они выглядели
export dbServer webServer
Поддерживается альтернативное назначение/экспорт
export dbServer=DevDBServer
export webServer=QAWebServer
В зависимости от того, как не идентичны ваши разные среды, вы можете установить свою оболочку script, какой файл среды загрузить.
case $( /bin/hostame ) in
prodServerName )
envFile=/path/2/prod/envFile ;;
QASeverName )
envFile=/path/2/qa/envFile ;;
devSeverName )
envFile=/path/2/dev/envFile ;;
esac
. ${envFile}
#NOW call your program
myProgram -v -f inFile -o outFile ......
По мере того, как вы разрабатываете все больше сценариев в своей среде обработки данных, вы можете всегда source
ваш envFile вверху. Когда вы в конечном итоге меняете физическое местоположение сервера (или его имя), у вас есть только одно место, которое необходимо внести для изменения.
IHTH
Ответ 2
Также пара драгоценных камней, имеющих дело с этим. figaro, который работает как с героем, так и без него. Фигаро использует файл yaml (в config и git ignored), чтобы отслеживать переменные. Другим вариантом является dotenv, который читает переменные из файла .env
. А также другая статья со всеми их вариантами.
Ответ 3
Чтобы создать интерактивную оболочку (оболочка входа a.k.a.), вам нужно вызвать sudo следующим образом:
sudo -i -u <user> <command>
Также вы можете использовать -E для сохранения среды. Это позволит некоторым переменным быть перенесенными для вашей текущей среды в команду, вызванную с помощью sudo.
Ответ 4
Я решил аналогичную проблему, явно сообщив Unicorn прочитать файл переменных как часть запуска в своем init.d
script. Сначала я создал файл в каталоге выше корня приложения с именем variables
. В этом script я вызываю export
для всех переменных среды, например. export VAR=value
. Затем я определил переменную GET_VARS=source /path/to/variables
в файле /etc/init.d/unicorn
. Наконец, я изменил параметр запуска, чтобы прочитать su - $USER -c "$GET_VARS && $CMD"
, где $CMD
- это команда запуска, а $USER
- пользователь приложения. Таким образом, переменные, определенные в файле, экспортируются в оболочку пользователя приложения Unicorn при запуске. Обратите внимание, что я использовал init.d script, почти идентичный элементу этой статье.