應用chef構建伺服器集群自動化部署與管理

火星人 @ 2014-03-03 , reply:0


應用chef構建伺服器集群自動化部署與管理

為了將rails程序部署到伺服器上,需要做的工作有

        [*]安裝伺服器各組件,如libcurl等
        [*]配置伺服器,如用戶管理、iptable等
        [*]安裝資料庫
        [*]安裝緩存服務
        [*]安裝配置前端應用伺服器
        [*]安裝rvm
        [*]安裝項目所需gems
以上工作屬於新伺服器到位后的一次性工作,而項目更新升級的工作屬於不定期重複性工作,大致如下:

        [*]下載最新源代碼
        [*]運行資料庫腳本
        [*]重新啟動應用伺服器
此外,日常工作還包括伺服器的監控、維護等
當項目規模不大,伺服器只有一兩台時,可以手動或者應用 Capistrano 及 deprec 自動處理
capistrano的缺點在應用capify安裝某些組件的過程中,如果出現問題,只能進入源代碼檢查相應的recipe,因為capistrano的recipe相對來說是隱性的
比如,安裝之前,我們不知道mysql的安裝會是通過package直接安裝還是通過下載source本地編譯后安裝,也無法獲知其版本
而當recipe不符合你的要求時,需要對其進行改造的成本比較大
隨著項目規模的不斷擴大,比如,有了專門的資料庫伺服器,甚至是資料庫伺服器集群,這時候capistrano就會顯示力不從心了
我們需要有專業的伺服器管理配置工具來統一管理所有的伺服器,這類工具不少,這裡只介紹chef
ChefChef是一個什麼樣的工具想像一下我們現在需要搭建一台mysql database slave伺服器,安裝過程我們手動操作了
沒過多久,我們需要第二台,這時候我們會想,如果之後安裝第一台的時候把操作過程執行的命令寫成腳本
現在安裝第二台,運行一下腳本就行了,節約時間而且不容易出錯
chef就相當於這樣的一個腳本管理工具,但功能要強大得多,可定製性強
chef將腳本命令代碼化,定製時只需要修改代碼,安裝的過程就是執行代碼的過程
架構圖
http://saberma.me/images/article/chef/chef.png
Chef的三種管理模式1. Chef-Solo
由一台普通電腦控制所有的伺服器,不需要專設一台chef-server
2. Client-Server
所有的伺服器作為chef-client,統一由chef-server進行管理,管理包括安裝、配置等工作
chef-server可以自建,但安裝的東西較多,由於使用solr作為全文搜索引擎,還需要安裝java
3. Opscode Platform
類似於Client-Server,只是Server端不需要自建,而是採用 http://www.opscode.com 提供的chef-server服務,本文描述以此方式為主,免費帳號可以管理5個伺服器
http://saberma.me/images/article/chef/opscode.png
Library程序庫程序庫是定義的module方法,可以在chef中任何地方被調用,在方法體內可以執行與資料庫等資源的交互動作
詳見 Libraries
操作對象chef可以通過recipe指定新建目錄、生成配置文件、安裝gems等操作,可控性非常強
新建目錄
新建目錄/data,owner為node[:user]指定的內容,許可權代碼為0755
directory 「/data」 do
 owner node[:user]
 mode 0755
end
生成配置文件
以someservice.conf.erb為模板,生成/data/someservice.conf配置文件,生成時會傳遞參數applications給模板
template 「/data/someservice.conf」 do
 owner node[:user]
 mode 0644
 source 「someservice.conf.erb」
 variables({
  :applications => node[:apps]
 })
end
把一台新的vps納入chef管理假設vps ip為188.188.188.188
ssh密碼為123456
註冊到 https://cookbooks.opscode.com/users/new 註冊帳號
通過郵件認證后,進入控制台 https://manage.opscode.com 創建organization
按提示下載兩個鏈接文件至~/Downloads: Download validation key | Generate knife config
點擊右上角的用戶名,下載鏈接文件至~/Download: Get a new private key
下載后的knife.txt要改名為knife.rb
以上三個文件請妥善保管,下載之後opscode平台不再保存這些文件
本地安裝gem install chef net-ssh-multi --no-ri --no-rdoccd ~/Documentsgit clone git://github.com/opscode/chef-repo.gitcd chef-repomkdir -p .chef# USERNAME和ORGANIZATION改為實際的文件名稱cd ~/Downloadscp USERNAME.pem ~/Documents/chef-repo/.chefcp ORGANIZATION-validator.pem ~/Documents/chef-repo/.chefcp knife.rb ~/Documents/chef-repo/.chef#測試連接opscode platformknife client list#成功連接則顯示validator的數組,如#[ "shopqi-validator" ]為vps安裝ruby及chef客戶端環境knife bootstrap 188.188.188.188 -u root -P 123456#ssh登錄伺服器不再需要輸入密碼ssh root@188.188.188.188 'sh -c "mkdir ~/.ssh"'scp ~/.ssh/id_rsa.pub root@188.188.188.188:/root/.ssh/authorized_keys遠程測試是否安裝正常ssh root@188.188.188.188chef-client#如果出現錯誤,可使用調試模式chef-client -l debug讓vps運行第一個cookbook安裝完伺服器操作系統后,第一件事情就是更新軟體
一般情況下,我們會在伺服器上運行命令
sudo apt-get update現在我們要通過chef來指定vps運行此命令
本地安裝apt cookbook#此命令最常用,會從opscode官網 "http://cookbooks.opscode.com/":http://cookbooks.opscode.com/ 下載cookbookknife cookbook site vendor apt為node加入recipe
knife node list#以上查看node id,假如為201166,現在查看node的run_listknife node show 201166 -r#加入apt recipe到vps的run list中knife node run_list add 201166 "recipe"knife node show 201166 -rknife cookbook upload -a遠程登錄vps,開始按run_list運行指定recipessh root@188.188.188.188chef-client#每次本地更新后都要在遠程運行chef-client比較麻煩,可以使用以下命令,設置為後台程序運行chef-client -i 3600 -s 600安裝ruby-on-rails3下載cookbook#參數-d要求下載依賴的cookbookknife cookbook site vendor rvm -d#此cookbook調用了chef內置的deploy resource,實現類似於capistrano的部署功能#但此cookbook還依賴了java cookbook等,忽略它們即可knife cookbook site vendor application -d新增apps data bagdata bag相當於全局變數,application cookcook需要根據apps指定role,recipe等參數
export EDITOR=vim#參考 "https://github.com/opscode/cookbooks/tree/master/application":https://github.com/opscode/cookbooks/tree/master/application 將json粘貼進來#退出vim時,data bag會被自動上傳至chef server,本地不保存knife data bag create apps 55true#保存至本地mkdir data_bags/appsknife data bag show apps 55true > data_bags/apps/55true.jsonknife data bag from file apps 55true.json新增role railsexport EDITOR=vimknife role create railsTip伺服器集群中可能會區分出production, staging環境,也可能同一應用部署在多台伺服器中,但只需由其中的一台伺服器運行資料庫遷徙腳本

        [*]新增production, staging等role,設置app_environment attribute,分配至相應的node,這樣可以重複使用deploy cookbook
        [*]新增app_name_run_migrations role,設置run_migrations attribute
常用cookbook以下列出在 https://github.com/opscode/cookbooks 中常用的cookbook
apt此recipt會運行apt-get update,用於更新操作系統
runit用於保證unicorn等服務時刻處於運行狀態
runsvdir服務會不停地監測/etc/sv目錄下的服務目錄,每個目錄對應一個runsv服務
如果某個runsv服務出現故障停止了,runsvdir會自動重新啟動它
#sv服務不啟動時查看日誌ps -ef | grep runsvdir#查看服務的狀態sv stat unicorn_server#查看服務的日誌tail -f /etc/sv/unicorn_server/log/main/currentbluepillrunit保證了服務的運行,bluepill保證進程的cpu、memory佔用率處於正常水平
users新增用戶,用戶定義在users data bag中
mongodb安裝1.6.5版本的mongo server
https://github.com/papercavalier/mongodb-cookbook
unicorn經過對比,還是選擇37signal的unicorn cookbook,因為支持多app部署,而unicornapp不支持(opscode官方已經刪除此cookbook)。為了對unicorn子線程進行監控,兩者都使用了bluepill取代God進行監控。
注意:在production環境下,rails3默認不會處理public目錄下靜態文件的請求,所以不能像dev環境下直接通過指定埠訪問某個unicorn服務
application這個包含太多的依賴cookbook了,經過以上的實踐,還是覺得不用它了,因為裡面對rails項目有用的就是deploy部分,自己重寫一個也很容易
注意事項在service或者definition中傳遞參數時,如果將父params需要級聯傳遞下去,得手動為params賦值至其他變數,因為在service或者definition塊中,params參數已經被當前塊覆蓋了
詳情參考:"http://tickets.opscode.com/browse/CHEF-422"
參考資源Infrastructure Automation with Chef
Getting started with Chef tutorial
Getting Started With The Opscode Chef Platform – Configuration Management In The Cloud
How to Deploy Ruby on Rails With The Opscode Chef Application Cookbook
Cooking with Chef 101
Why Startups Need Automated Infrastructures
Deploy Resource
application cookbook
runit

《解決方案》

回復 1# wang290


    不錯的分享,如果能再完善些就更好了
《解決方案》





[火星人 via ] 應用chef構建伺服器集群自動化部署與管理已經有399次圍觀

http://www.coctec.com/docs/service/show-post-778.html