Ruby,Unicorn和环境variables

在玩Heroku的同时,我发现他们使用环境variables来实现服务器本地configuration的方法非常出色。 现在,在build立我自己的应用服务器的同时,我发现自己想知道如何复制。

我正在部署一个Sinatra应用程序,骑在Unicorn和Nginx上。 我知道nginx不喜欢和环境一起玩,让自己出去玩。 我可能会把这些variables放在独angular兽configuration文件​​的某个地方,但是由于这是在应用程序的其他部分进行版本控制,所以这种configuration的目的就是使服务器环境中的configuration成为可能。 就我而言,没有理由不把应用程序特定的configuration文件与应用程序的其余部分保持在一起。

第三个也是最后一个(据我所知)选项是将它们设置在产卵壳中。 那是我迷路的地方。 我知道login和非loginshell使用不同的rc文件,我不确定是否用sudo -u http stuff调用东西是否产生loginshell。 我做了一些家庭作业,并问谷歌和人,但我仍然不完全确定如何处理它。 也许我只是笨手笨脚的,无论如何,如果有人能够对整个壳牌环境交易有所了解,我会非常感激。

我认为你的第三种可能性是正确的。 你所缺少的是包装脚本的思想,其唯一的功能是设置环境,然后用任何所需的选项调用主程序。

要创建一个可以用作控制脚本的包装脚本(如果prodEnv使用DB = ProdDB等),还有一件事简化了这个问题。 Bash / ksh都支持一个名为sourcing files的功能。 这是一个shell提供的操作,用于打开文件并执行文件中的内容,就像在主脚本中一样。 像C和其他语言的#include一样。

ksh和bash会自动地源/etc/profile/etc/profile /var/etc/profile.local /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 ...... 

随着您在数据处理环境中开发越来越多的脚本,您可以始终将envFile的source放在顶部。 当您最终更改服务器的物理位置(或名称)时,您只有一个地方需要进行更改。

IHTH

还有一些处理这个问题的宝石。 无论有无heroku都可以使用的figaro 。 Figaro使用yaml文件(在配置和git忽略)来跟踪变量。 另一个选项是从.env文件读取变量的.env 。 还有另一篇文章 ,所有的选项。

为了产生一个交互式shell(aka登录shell),你需要像这样调用sudo:

 sudo -i -u <user> <command> 

你也可以使用-E来保存环境。 这将允许一些变量为您的当前环境适用于使用sudo调用的命令。

我通过明确告诉Unicorn在其init.d脚本中作为启动的一部分读取一个变量文件来解决了类似的问题。 首先,我在名为variables的应用程序根目录上创建了一个文件。 在这个脚本中,我调用所有环境变量的export VAR=value ,例如export VAR=value 。 然后我在/etc/init.d/unicorn文件中定义了一个变量GET_VARS=source /path/to/variables 。 最后,我修改了启动选项以读取su - $USER -c "$GET_VARS && $CMD" ,其中$CMD是启动命令, $USER是应用程序用户。 因此,文件中定义的变量在启动时被导出到Unicorn的应用程序用户的shell中。 请注意,我使用了一个与本文相同的init.d脚本。