2011-04-29 152 views
11

在使用Heroku时,我发现他们使用环境变量进行服务器本地配置的方法非常精彩。现在,在设置我自己的应用服务器的同时,我发现自己想知道复制的难度有多大。Ruby,Unicorn和环境变量

我正在部署一个使用Unicorn和Nginx的sinatra应用程序。我知道nginx不喜欢和环境一起玩,让自己一个人出去玩。我可以将这些变量放在独角兽配置文件​​的某个位置,但是由于这是在应用程序的其他部分进行版本控制的情况下,这种做法有可能导致配置位于服务器环境中。就我而言,没有理由不将应用程序特定的配置文件与应用程序的其余部分保持在一起。

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

+0

我这样做的方式是将这些变量放在.bashrc文件中,这样,当我ssh到服务器时,我将直接设置这些变量而不需要包装脚本,并且它们是安全的,因为只有可以登录到可以访问它们的服务器的人员。如果您想要在多台服务器上部署您的应用程序并设置许多变量,则包装脚本非常有用。 – 2014-04-21 16:56:38

回答

7

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

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

ksh和bash会自动输入/etc/profile,​​(有时),$HOME/.profile。还有其他的文件名也会被选中,但在这种情况下,您需要制作自己的env文件并明确加载它。

正如我们在谈论包装脚本,并且您想要管理您的环境如何设置,您将需要在包装脚本中进行采购。

如何获取环境文件?

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

其中envFile将充满了之类的语句

dbServer=DevDBServer 
webServer=QAWebServer 
.... 

,你可能会发现你需要导出这些变量对它们进行visble

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。当您最终更改服务器的物理位置(或名称)时,则只有一个地方需要进行更改。

IHTH

0

产卵的交互式shell(又名登录shell),你需要调用须藤像这样:

sudo -i -u <user> <command> 

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

1

还有一些处理这个问题的宝石。 figaro,无论有无heroku。 Figaro使用yaml文件(在config和git中忽略)来跟踪变量。另一个选项是dotenv,它读取.env文件中的变量。也有another article与他们的所有选项。

0

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