Ruby, Unicorn и переменные среды

#ruby #shell #nginx #environment #unicorn

#ruby #оболочка #nginx #Окружающая среда #unicorn

Вопрос:

Играя с Heroku, я нашел их подход к использованию переменных окружения для локальной конфигурации сервера блестящим. Теперь, настраивая собственный сервер приложений, я задаюсь вопросом, насколько сложно было бы это воспроизвести.

Я развертываю приложение sinatra, использующее Unicorn и Nginx. Я знаю, что nginx не любит играть со средой, так что этот вариант исключен. Вероятно, я могу поместить переменные где-нибудь в конфигурационном файле unicorn, но поскольку это находится под контролем версий вместе с остальной частью приложения, это как бы противоречит цели размещения конфигурации в серверной среде. Насколько я понимаю, нет причин не хранить файлы конфигурации для конкретного приложения вместе с остальной частью приложения.

Третий и последний (насколько мне известно) вариант — это установка их в порождающей оболочке. Вот где я заблудился. Я знаю, что оболочки login и non-login используют разные rc-файлы, и я не уверен, вызывает ли вызов чего-либо с sudo -u http stuff или нет оболочку login. Я сделал кое-какую домашнюю работу и спросил Google и man, но я все еще не совсем уверен, как к этому подойти. Может быть, я просто туплю … в любом случае, я был бы очень признателен, если бы кто-нибудь мог пролить некоторый свет на всю ситуацию с оболочкой.

Комментарии:

1. Способ, которым я это делаю, — поместить эти переменные в файл .bashrc, таким образом, когда я подключаюсь к серверу по ssh, я получаю эти переменные, установленные напрямую, без использования скрипта-оболочки, и они безопасны, потому что только человек, который может войти на сервер, может получить к ним доступ. Сценарий-оболочка полезен, если вы хотите развернуть свое приложение на нескольких серверах и задать множество переменных.

Ответ №1:

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

Чтобы создать скрипт-оболочку, который может функционировать как сценарий управления (если prodEnv использует DB = ProdDB и т.д.), Есть еще одна часть, которая упрощает эту проблему. Оба Bash / ksh поддерживают функцию, называемую sourcing files. Это операция, которую предоставляет оболочка, чтобы открыть файл и выполнить то, что находится в файле, точно так же, как если бы это было встроено в основной скрипт. Как #include в C и других языках.

ksh и bash будут автоматически исходными /etc/profile , /var/etc/profile.local (иногда) $HOME/.profile . Есть и другие имена файлов, которые также будут выбраны, но в этом случае вам нужно будет создать свой собственный env-файл и явно загрузить его.

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

Как получить исходный файл среды?

 envFile=/path/to/my/envFile  
. $envFile
  

где envFile будет заполнен инструкциями типа

 dbServer=DevDBServer
webServer=QAWebServer
....
  

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

 export dbServer webServer
  

Поддерживается альтернативное назначение / экспорт

 export dbServer=DevDBServer
export webServer=QAWebServer
  

В зависимости от того, насколько неидентичны ваши различные среды, вы можете попросить свой скрипт-оболочку определить, какой файл среды загружать.

 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 вверху. Когда вы в конечном итоге меняете физическое местоположение сервера (или его имя), у вас остается только одно место, которое вам нужно для внесения изменений.

Я

Ответ №2:

Также пара драгоценных камней, связанных с этим. figaro, который работает как с heroku, так и без него. Figaro использует файл yaml (в конфигурации и git игнорируется) для отслеживания переменных. Другим вариантом является dotenv, который считывает переменные из .env файла. А также другая статья со всеми этими опциями.

Ответ №3:

Чтобы создать интерактивную оболочку (также известную как login shell), вам нужно вызвать sudo следующим образом:

 sudo -i -u <user> <command>
  

Также вы можете использовать -E для сохранения среды. Это позволит передавать некоторые переменные для вашей текущей среды в команду, вызываемую с помощью sudo.

Ответ №4:

Я решил аналогичную проблему, явно указав Unicorn прочитать файл переменных как часть запуска в его init.d скрипте. Сначала я создал файл в каталоге над корнем приложения под названием variables . В этом скрипте я вызываю export все мои переменные окружения, например, export VAR=value . Затем я определил переменную GET_VARS=source /path/to/variables в /etc/init.d/unicorn файле. Наконец, я изменил параметр «Пуск», чтобы читать, su - $USER -c "$GET_VARS amp;amp; $CMD" где $CMD — команда запуска, а $USER — пользователь приложения. Таким образом, переменные, определенные в файле, экспортируются в оболочку пользователя приложения Unicorn при запуске. Обратите внимание, что я использовал скрипт init.d, почти идентичный тому, что приведен в этой статье.