2011-04-29 137 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腳本。