在玩Heroku时,我发现他们使用环境变量进行服务器本地配置的方法很棒。现在,在设置我自己的应用程序服务器时,我发现自己想知道复制有多难。
我正在部署sinatra应用程序,使用Unicorn和Nginx。我知道nginx不喜欢玩环境,所以一个人出来了。我可以将变量放在unicorn配置文件中的某个地方,但由于这是在应用程序的其余部分的版本控制下,它有点失败了配置在服务器环境中的目的。就我而言,没有理由不将我的特定于应用程序的配置文件与应用程序的其余部分保持在一起。
第三个,也就是最后一个(据我所知)选项是在产卵shell中设置它们。那就是我迷路的地方。我知道登录和非登录shell使用不同的rc文件,我不确定调用sudo -u http stuff
的东西是否产生登录shell。我做了一些功课,并问谷歌和男人,但我仍然不完全确定如何接近它。也许我只是愚蠢......无论如何,如果有人能够对整个贝壳环境协议有所了解,我真的很感激。
答案 0 :(得分:7)
我认为你的第三种可能性是正确的。您所缺少的是包装器脚本的概念,其唯一的功能是设置环境,然后使用所需的任何选项调用主程序。
要创建一个可以作为控制脚本运行的包装器脚本(如果prodEnv使用DB = ProdDB等),还有一个部分可以简化这个问题。 Bash / ksh都支持称为采购文件的功能。这是shell提供的操作,用于打开文件并执行文件中的内容,就像它在主脚本中内嵌一样。与C和其他语言中的#include
一样。
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 ......
当您在数据处理环境中开发越来越多的脚本时,您可以始终{en} {en}顶部的envFile。当您最终更改服务器的物理位置(或其名称)时,您只需要一个地方进行更改。
IHTH
答案 1 :(得分:1)
还有几个宝石处理这个问题。 figaro可以使用或不使用heroku。 Figaro使用yaml文件(在config和git中忽略)来跟踪变量。另一个选项是dotenv,它从.env
文件中读取变量。还有another article以及所有选项。
答案 2 :(得分:0)
要生成交互式shell(a.k.a。登录shell),您需要像这样调用sudo:
sudo -i -u <user> <command>
您也可以使用-E来保护环境。这将允许将当前环境的某些变量用于使用sudo调用的命令。
答案 3 :(得分:0)
我通过明确告诉Unicorn在其init.d
脚本中读取变量文件作为启动的一部分来解决类似的问题。首先,我在名为variables
的应用程序根目录上的目录中创建了一个文件。在此脚本中,我在所有环境变量上调用export
,例如export VAR=value
。然后我在GET_VARS=source /path/to/variables
文件中定义了一个变量/etc/init.d/unicorn
。最后,我修改了start选项以读取su - $USER -c "$GET_VARS && $CMD"
,其中$CMD
是启动命令,$USER
是app用户。因此,文件中定义的变量在启动时被导出到Unicorn的app用户的shell中。请注意,我使用的init.d脚本几乎与this article中的脚本相同。