Heroku-style config management with capistrano and dotenv

12-factor Style

通常,應(yīng)用的 配置 在不同 部署 (預(yù)發(fā)布、生產(chǎn)環(huán)境哼蛆、開發(fā)環(huán)境等等)間會有很大差異。這其中包括:

  • 數(shù)據(jù)庫霞赫,Memcached腮介,以及其他 后端服務(wù) 的配置
  • 第三方服務(wù)的證書,如 Amazon S3端衰、Twitter 等
  • 每份部署特有的配置叠洗,如域名等

有些應(yīng)用在代碼中使用常量保存配置,這與 12-factor 所要求的代碼和配置嚴(yán)格分離顯然大相徑庭靴迫。配置文件在各部署間存在大幅差異惕味,代碼卻完全一致。

判斷一個應(yīng)用是否正確地將配置排除在代碼之外玉锌,一個簡單的方法是看該應(yīng)用的基準(zhǔn)代碼是否可以立刻開源名挥,而不用擔(dān)心會暴露任何敏感的信息。

12-Factor 推薦將應(yīng)用的配置存儲于 環(huán)境變量 中( env vars, env )主守。環(huán)境變量可以非常方便地在不同的部署間做修改禀倔,卻不動一行代碼。更多關(guān)于12-factor 的內(nèi)容請訪問 12factor.net.

Rails Style 存在的問題

Rails中大部分實踐是遵守了 12-Factor 規(guī)則参淫,除了日志和配置救湖。Rails Way的配置方式是yml文件,例如:database.yml涎才、secret.yml等鞋既。簡單的應(yīng)用使用yml文件和 12-factor 推薦的環(huán)境變量其實區(qū)別不大,不過當(dāng)項目不斷膨脹耍铜,配置數(shù)量也隨著增加邑闺,yml方式變得越來越難以維護。yml存在的問題表現(xiàn)在:

  1. 需要不斷的修改.gitignore文件
  2. 搭建各種環(huán)境(dev棕兼、production陡舅、test、staging)時需要不斷copy example文件
  3. 配置散落各處
  4. 每增加yml文件伴挚,需要在應(yīng)用里增加load和parse邏輯
  5. 不小心會被簽進版本控制里

下面是目前項目的配置文件靶衍,每次搭建環(huán)境修改這些配置文件是最痛苦的事情...

shared/config$ ls |grep yml
s3.yml
redis.yml
twilio.yml
paypal.yml
sunspot.yml
database.yml
icontact.yml
http_auth.yml
beanstream.yml
commercehub.yml
canada_post.yml
google_content_api.yml

系統(tǒng)環(huán)境變量

最直接的方式是使用shell 環(huán)境變量:

$ export TWILIO_ACCOUNT_SID=AC1234...
$ export TWILIO_AUTH_TOKEN=abc12...

在Ruby中使用ENV讀仍痔俊:

puts ENV['TWILIO_ACCOUNT_SID']
puts ENV['TWILIO_AUTH_TOKEN']

shell環(huán)境變量由于沒有持久化,又引出了 .bashrc颅眶、.bash_profile蜈出、~/.profile、/etc/environment等方式帚呼。都不是很完美掏缎,權(quán)限問題皱蹦、login shell問題的坑都等著你呢煤杀。最重要的是,上面提到這些都不方便應(yīng)付單機部署多個應(yīng)用的場景沪哺。

Envyable沈自、dotenv、Figaro

Envyable辜妓、dotenv枯途、Figaro等工具,在應(yīng)用程序中把配置注入到ENV中避免了上面提到的各種問題籍滴。Envyable酪夷、dotenv、Figaro 無論是實現(xiàn)上還是使用上其實大同小異孽惰,下面只拿dotenv來說:

In Gemfile:

gem 'dotenv-rails', :require => 'dotenv/rails-now'

config/application.rb

Bundler.require(*Rails.groups)
Dotenv::Railtie.load
HOSTNAME = ENV['HOSTNAME']

.env 文件:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE

gitignore忽略.env晚岭,并且cap設(shè)置軟鏈:

set :linked_files, fetch(:linked_files, []).push('config/database.yml', '.env')

調(diào)用的時候仍然是 ENV['SECRET_KEY']。當(dāng)然勋功,dotenv還支持多環(huán)境模式坦报,比如 .env.production 文件只對production環(huán)境生效。

Heroku-style

dotenv已經(jīng)很完美了狂鞋,但用過Heroku的都知道這還不夠片择,看一下Heroku設(shè)置環(huán)境變量的方式:

heroku config:set GITHUB_USERNAME=joesmith
Adding config vars and restarting myapp... done, v12GITHUB_USERNAME: joesmith

$ heroku config
GITHUB_USERNAME: joesmith 
OTHER_VAR: production

$ heroku config:get 
GITHUB_USERNAMEjoesmith

$ heroku config:unset GITHUB_USERNAME
Unsetting GITHUB_USERNAME and restarting myapp... done, v13

capistrano-twelvefactor + dotenv 可以打造出和Heroku一樣酷的體驗。

詳細(xì)的步驟capistrano-twelvefactor上面都有寫骚揍,下面只說和dotenv配合需要做的:

# config/deploy/production.rb
set :environment_file, deploy_path.join("shared/.env")

after 'config:set',   "deploy:symlink:linked_files"
after 'config:unset', "deploy:symlink:linked_files"

然后就可以使用這幾個命令查看和修改環(huán)境配置了:

  • bundle exec cap production config:list
  • bundle exec cap production config:set[FOO=bar]
  • bundle exec cap production config:unset[FOO]

注:上面需要capistrano 3 + dotenv字管,Envyable和Figaro目前無法使用Heroku style.

Multi Server && Apps

對于單臺服務(wù)器的應(yīng)用,capistrano-twelvefactor + dotenv 足以應(yīng)付信不,同時嘲叔,由于capistrano支持集群部署,單個應(yīng)用多服務(wù)器其實也是可以搞定的浑塞。但有時候不同應(yīng)用之間其實也需要共享配置文件的借跪,比如,S3配置變化了酌壕,依賴這個帳號的所有應(yīng)用都應(yīng)該得到同步掏愁。另外的一個問題是歇由,對于多服務(wù)器場景,配置存儲在.env會出現(xiàn)服務(wù)器之間配置不同步現(xiàn)象果港。如果要解決上述問題沦泌,可能引入etcdzookeeper是一個不錯的選擇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辛掠,一起剝皮案震驚了整個濱河市谢谦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萝衩,老刑警劉巖回挽,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猩谊,居然都是意外死亡千劈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門牌捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墙牌,“玉大人,你說我怎么就攤上這事暗甥∠脖酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵撤防,是天一觀的道長虽风。 經(jīng)常有香客問我,道長即碗,這世上最難降的妖魔是什么焰情? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮剥懒,結(jié)果婚禮上内舟,老公的妹妹穿的比我還像新娘。我一直安慰自己初橘,他們只是感情好验游,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著保檐,像睡著了一般耕蝉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夜只,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天垒在,我揣著相機與錄音,去河邊找鬼扔亥。 笑死场躯,一個胖子當(dāng)著我的面吹牛谈为,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踢关,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼伞鲫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了签舞?” 一聲冷哼從身側(cè)響起秕脓,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儒搭,沒想到半個月后吠架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡师妙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年诵肛,在試婚紗的時候發(fā)現(xiàn)自己被綠了屹培。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默穴。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褪秀,靈堂內(nèi)的尸體忽然破棺而出蓄诽,到底是詐尸還是另有隱情,我是刑警寧澤媒吗,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布仑氛,位于F島的核電站,受9級特大地震影響闸英,放射性物質(zhì)發(fā)生泄漏锯岖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一甫何、第九天 我趴在偏房一處隱蔽的房頂上張望出吹。 院中可真熱鬧,春花似錦辙喂、人聲如沸捶牢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秋麸。三九已至,卻和暖如春炬太,著一層夾襖步出監(jiān)牢的瞬間灸蟆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工亲族, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炒考,地道東北人吓歇。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像票腰,于是被迫代替她去往敵國和親城看。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杏慰,服務(wù)發(fā)現(xiàn)测柠,斷路器,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,848評論 6 342
  • Heroku平臺 Heroku平臺的靈活性極高且支持多種編程語言缘滥。若想把程序部署到Heroku上,開發(fā)者要使用Gi...
    超net閱讀 104,114評論 12 56
  • 作者簡介:黃慶兵轰胁,網(wǎng)易蜂巢首席技術(shù)布道師,浙大碩士畢業(yè)朝扼,從事云計算赃阀、Docker、Go等相關(guān)開發(fā)及技術(shù)布道工作擎颖;喜...
    43ce3d72fadb閱讀 9,310評論 0 11
  • 英文原文來自 https://wagtail.io/blog/deploying-wagtail-heroku/文...
    treelake閱讀 2,931評論 0 0