webistrano的安裝方法和一些用法

Centos6.4 部署安裝Webistrano

安裝環境:

安裝epel源:

wget -q -O -http://www.atomicorp.com/installers/atomic |sh

安裝軟件包:

yum install ruby ruby-devel ruby-docs ruby-ri ruby-irbruby-rdoc rubygems

安裝git

Yum install git –y

安裝mysql

Yum install mysql mysql-servermysql-devel

初始化mysql

Mysql_install_db

登陸mysqk

Mysq –uroot –p直接回車進入

mysql設置密碼

Use mysql;

Update user set password=PASSWORD(“123456”) where user=’root’;

Flush privileges;

啓動mysql

/etc/init.d/mysqld restart||start||stop

使用gem安裝軟件:

Gem install Capistrano

Gem install rails 如果提示要求ruby版本1.9.3以上,則制定安裝rails版本

Detail:

Gem install rails –v 2.1.2

安裝完成後安裝bundler

Gem installbundler

Gem installopen4 exception_notification

然後使用git拿到webistrano

Git clone https://github.com/peritor/webistrano.git

使用bundlerinstall 更新&&安裝ruby的環境包

Detail:

Bundle install

然後通過閱讀webistranoREADME文件進行安裝

RAILS_ENV=productionrake db:create 創建相關的數據庫

RAILS_ENV=productionrake db:migrate 創建相關的表結構

操作完成後,通過rubyscript/server –d –p 3000 –e prodution來啓動webistrano

報錯:

1.ERROR: 'rake/rdoctask' is obsolete and nolonger supported. Use 'rdoc/task'

這個錯誤是說rdoc過期

解決方法:

降低rake版本

gemuninstall rake -v 10.1.0

安裝0.8.7rake版本

Geminstall rake –v 0.8.7

然後就可以通過rake 建立相關的數據庫及表結構了


2.bundle install的時候提示要求1.3.5或更高版本的bundler,請運行gem install bundler –v 1.3.5

執行完gem install bundler –v 1.3.5安裝成功後依然出現這個提示

解決方法:

修改gemfilegem

gem 'bundler', " ~>1.3.5"

手動將bundler的版本更改成1.3.5


3.安裝0.8.7rake後,提示bundler版本要求10.0.1

解決方法:更改gemfile文件

gem "rake" , "0.8.7" 手動添加版本信息

然後執行bundle update rake

然後執行 gem install rake –v 0.8.7

這是將rake更改成0.8.7的方法在ruby1.8.7的版本下


webistrano是capistrano的web版,用法和capistrano差不多,附上capistrano的用法:

安裝capistrano後,執行capify conf/------conf文件下生產配置文件

如果開始沒有安裝capistrano

則使用gem install capistranovim Gemfile 添加一行gem capistrano”然後執行bundle install即可

編輯config下的deploy文件

set :application, "set your application name here"

set :repository, "set your repository location here"

如果你不熟悉ruby語法,你會發現這看起來十分像配置文件。但是,因爲在ruby中調用函數的時候,不需要使用括號,文件裏面的每一行其實就是調用set()函數:


set(:application, "your-app-name")

使用你的應用的名字替代:application變量,不要包含空格--這會創建一個部署目錄。使用你的版本管理URL目錄替代:repository(在這個例子中,我們使用SVN


如果你的SVN需要用戶名和密碼,請按如下配置:

set :scm_username, "svn-username"

set :scm_password, "svn-password"



接着,取消註釋並配置部署目錄。如果你的部署服務器上沒有部署的目錄,Capistrano會幫你創建它:


set :deploy_to, "/path/to/doc/root/www/#{application}"

這裏,我們使用我們之前設置的目標部署目錄的application變量。這寫全部是ruby的標準語法,在所有的Capistrano腳本中適用,這樣可以使我們的工作更有效,而不是混雜各種令人頭暈的語法在裏面。

最後,我們需要配置部署的服務器信息。你可以添加很多你需要部署的服務器,你只需遵循SSH可以理解的命名規則:

role :app, "app-server-1", "app-server-2", "app-server-3"

role :web, "192.168.3.173"

role :db, "db-server-1", :primary => true

如果你只是想測試一下Capistrano,你可以把你的工作站配置到部署地址; 這樣,你就無需考慮服務器之間的跳轉:



role :app, "me@my-local-ip"

現在,我們可以告訴Capistrano爲我們建立部署路徑的配置:


cap deploy:setup

當你運行這個命令,Capistrano開始爲你展示它所做的。這樣一來,可以方便我們調試Capfile,並可以消除你的疑慮知道它在做什麼動作。每當你連接到一臺服務器,系統會需要你提供密碼,然後Capistrano就會運行一連串的命令。

執行完deploy:setup命令後,部署路徑就會創建了一些新增的目錄,運行cap命令去推送新版本,執行回滾和其他動作:

myapp/

releases/ shared/log shared/pids shared/system

接着,我們開始部署應用。Capistrano會自動檢查源代碼併發布,同時創建一個叫做current的symlink鏈接:


cap deploy:cold

執行完這個命令後,讓我們來看看發佈目錄:


# current@ -> /www/captest/myapp/releases/20131119144520

這個一個"cold"發佈,意思是表示只執行一次的任務。之後如果我們需要再發布應用,你只需使用部署任務:


cap deploy

當你執行完deploy:cold或者deploy命令後,查看一下部署目錄,你會發現你的源代碼會按照Capistrano的方式被髮布出去。

部署任務替代了登錄服務器,獲取源代碼,設置數據庫和重啓服務器。任務只需運行很短時間,我們能就現在可以享受懶惰的感覺了!


深入知識

我們只需運用deploy:setup , deploy:cold, deploy命令就可以發佈應用。recipe裏面其實包含了很多東西,讓我們來看看所有可用的任務:

cap -Tv

和rake -T很相像,這個命令會列出所有的任務和任務相關的文檔。如果你已經運行過幾次deploy,我們就可以嘗試一下rollback或者rollback_code任務。

每次你執行回滾的時候,Capistrano會把symlink指向前一次發佈的目錄。回滾操作可以重複執行,直到你找到了你想要的穩定版本:

cap deploy:rollback_code

屬於你自己的任務

當你使用Capistrano應用到你的rails項目中,你就會發現他是如何讓你變得更懶惰。使用Rails特有命令的任務同樣可以包含任何的命令在裏面。

當你運行Capistrano任務,例如deploy,你會很多SSH命令和迴應會回顯出來。如果你需要發佈到幾臺服務器上,你看到來自多臺服務器的迴應,因爲Capistrano可以在多臺服務器上運行任務,只要你需要發佈到多少臺服務器都可以。

它的用處是非常廣的——檢查硬盤空間,從集羣中複製實時數據和運行維護計劃——那麼我們應該如何構建我們自己的任務呢?


Capistrano的任務是通過如下的語法來定義的:

desc "Short description here..."

task :name_of_function, :roles => :servers do

# tasks is in here...

end

Ruby的優雅語法讓所有事情都變得十分簡單,那麼讓我們來單獨討論它。第一行是一些解釋說明,這些說明會在你運行命令時被輸出(同樣在你的項目的跟目錄下):


cap -Tv

Ruby支持在調用函數的時候,不使用括號,所以第二行實際上是調用了Capistrano的任務函數.

第一個參數是新任務的名字(name_of_function)。第二個參數是指定執行任務的服務器集合;這個可以是:server,:app,:db或者其他服務器的集合。

任務第一部分由do開始,這個是一個匿名函數,它是表示任何在do和end之間的任務都會被執行。你可能在javascript函數中也遇到過匿名函數。

一個非常簡單的任務'df -h'將會被執行,用於檢查服務器的磁盤使用情況。這個任務不會修改服務器上的任何配置,所以你可以大膽的去運行它:

desc "Check disk space"

task :diskspace, :roles => :servers do

run 'df -h'

end

run函數只會簡單的在服務器上運行命令。你可以使用sudo來替代它,使用sudo在遠程服務器上實行命令:

desc "Who hasn't been cleaning out their home directories?"

task :home_disk_usage, :roles => :servers do

sudo 'du -sh /home/*'

end

如果你就如上一節提到的一樣,capified你的項目,你甚至可以添加你自己自定義的任務到標準的Rails recipe上,並修改Rails recipe的行爲。這樣可以讓你的Capistrano按照你的意思去工作,這樣的好處就在於當你忘記了某些命令如何運行。


在capified之後的Rails項目中添加你自己的任務,只需按照上面提到的任務語法,把它們添加到 config/deploy.rb中。當你添加了以惡搞任務,運行runcap -Tv命令檢查你的任務是否存在,並運行其他任務。

Tasks可以被其他Task調用就如函數一樣,所以複雜的Tasks可以切分成多個簡單的tasks並按照“DRY”原則設計你的Capistrano recipes。Tasks可以通過rails函數調用實現互相調用:

task :home_disk_usage, :roles => :servers do

vhosts_disk_usage

run "ls /home/"

end

你可能需要自定義的任務知道你的項目是在哪個路徑上。這就用到了我們在開頭提到的配置變量,並通過ruby語法來定義:


run "tar czf ~/snapshot.tgz #{release_path}"

如果你需要其他變量,你可以像之前的語法一樣去set:


set :foo, "bar"

或者,你可以通過set函數提示用戶輸入變量,但是用法有一點點不同:

set(:deploy_version) do

Capistrano::CLI.ui.ask "What version is this? "

end

變量使用方法是一樣的,不管是用那個方式去set他們。

所有的這些都離不開ruby,所以你會發現Capistrano更像一個框架而並非是一個獨立的應用或腳本。如果Ruby對於你來說是一件新鮮的事情, 請繼續學習吧——你很會就能熟悉它。

最後,就像DRY原則一樣,儘量保持代碼整潔。所有的Rails recipes可以在deploy 命名空間中找到,當你運行runcap -Tv的時候你就會發現的。命名空間允許你把任務組合在一起,這可以通過namespace命令包含你的這些任務:

namespace :our_tasks do

desc "The default task"

task :default do

restart

end


desc "Empty logs"

task :empty_logs do

# ...

end

end

當你運行runcap -Tv,你可以看到任務已經被組合在一起:


cap our_tasks # The default task

cap our_tasks:empty_logs # Empty logs


定製Rails recipe

創建Capistrano任務很簡單,但是我們之前使用的Rails recipe已經包含了90%我們需要的東西。在這個例子中,更好的方式是定製recipe而不是創建就一個。我們可以通過覆蓋特定的任務,實現對某些行爲的定製。

我在嘗試使用Capistrano來運行makefile的時候發現這個特性。在這裏我完成了大部分的代碼管理,數據庫版本控制和安裝配置。我們可以在不需要提交或編輯文件的場合使用這個方法。所以通過capistrano來部署是相當誘人的。

當你讀到這裏並想:"這是酷斃了,但是我們還沒打算遷移到Rails"。定製化會很適合你,因爲你可以覆蓋執行rails命令相關的任務。

第一,嘗試在非Rails項目中使用cap,但是請確保有一個config/目錄,這樣capify可以放置它的deploy.rb文件。當capify運行完畢後,你可以開始嘗試運行各種我們上面提到的cap deploy任務。

但是,當Rails服務器不存在或者Rakefile不存在時候,Capistrano就會發生錯誤。

這是因爲其中一個任務deploy:restart,會嘗試重啓rails服務器。另外一個任務會嘗試運行runrake db:migrate。你的項目很可能不支持這兩個任務,所以你需要添加如下的代碼到config/deploy.rb,覆蓋他們:

desc "Do nothing"

deploy.task :restart, :roles => :app do

# ...do what you like here...

end


這個很直觀,這段代碼是在deploy 命名空間中覆蓋了restart任務,和所有包含在任務裏面的命令(所有包含在do和end之間的代碼)都可以被編輯。你可能需要重啓Apache服務器而不是rails服務器:

desc "Do nothing"

deploy.task :restart, :roles => :app do

sudo '/etc/init.d/restart'

end

當你運行cap命令 deploy:cold,rails遷移命令會創建對應的數據庫。我們可以按照我們實際需要覆蓋它:

deploy.task :migrate, :roles => :app do

run "make data"

end

結論

Capistrano提供給我們相當簡潔的方法去發佈應用。它還能在其他關於遠程服務器的領域中使用,例如監視,隨意的任務,創建一次性備份和其他。

這些要歸功於Ruby的優雅簡潔,Capistrano可以推廣到很多地方。Rails recipe可以被其他non-rails應用所提到,還可以使用小小的ruby知識就能添加一個新的recipes

最後,要讓所有事情變得更迅速,使用SSH認證登錄遠程服務器。如果你需要把認證文件放在其他地方,你只需添加如下代碼到deploy.rb文件:

ssh_options[:keys] = "/path/to/identity_file"

通過這個方式,你可以通過cap命令完全發佈你的應用——現在你就是真正的懶人了。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章