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, почти идентичный элементу этой статье.