2010-08-10 36 views
10

我正在使用Capistrano來處理我的部署,並且在我的設置 - :web和:處理中有兩個不同的角色。它們都具有通常的部署任務,但對於兩種類型的服務器,重啓任務需要不同。如何爲Capistrano中的不同角色定義相同的任務?

所以我的第一次嘗試是這樣的:

task :restart, :roles => :web do 
    run "... web related restart stuff ..." 
end 

task :restart, :roles => :processing do 
    run "... processing related restart stuff ..." 
end 

不工作,因爲第二:重啓(用於:處理角色)取代第一:重啓(爲:Web角色),和:網絡:重新啓動從未發生。

我有一個快速瀏覽,看看我是否可以編寫條件代碼,這取決於服務器在運行任務時可能處於哪個角色(或多個角色),但是旁邊沒有任何相關文檔。有任何想法嗎?

回答

7

你應該使用的命名空間:

namespace :web do 
    desc "Restart web servers" 
    task :restart, :roles => :web do 
    # Restart Magic Here 
    end 
end 

namespace :process do 
    desc "Restart process servers" 
    task :restart, :roles => :process do 
    # Restart magic here 
    end 
end 

# Optionally: 
task :restart do 
    web.restart 
    process.restart 
end 

這就是你要找什麼,因爲我的想法!

另外,在命令行上使用了這些,你會用

$ cap <stage>   # (if using multistage) 
$ cap web:restart  # Restarts web servers 
$ cap process:restart # Restarts process servers 
$ cap restart   # Restarts both process and web servers 

(來源:我是Capistrano的維護者。)

1

你應該用「水貨」,而不是「跑」在這種情況下:

task :restart do 
    parallel do |session| 
    session.when "in?(:web)", "...substitute run command contents here...." 
    session.when "in?(:process)", "...substitute run command contents here...." 
    end 
end 

如果你要使用除了在不同的任務「跑」的東西,你最好堅持到其他的答案之一。

上「水貨」命令更多信息可以在這裏找到:https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel

0

如果需要調用默認deploy任務,並做一些自定義的重新啓動,等我想出了這個解決方案:

# Servers 
server "importerhost.com", :app, :web, :db, :importer, :primary => true 
server "backuphost.com", :app, :web, :db, :backup, :primary => true 
set :deploy_to, "/apps/appname" 

# Ensure deploy before restart 
before 'importer:deploy', 'deploy' 
before 'backup:deploy', 'deploy' 

# Importer 
namespace :importer do 
    desc "Restart importer service" 
    task :deploy, :roles => :importer do 
    sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf" 
    sudo "service importer restart N=1" 
    sudo "service importer restart N=2" 
    end 
end 

# Backup 
namespace :backup do 
    desc "Restart backup service" 
    task :deploy, :roles => :backup do 
    sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf" 
    sudo "service backup restart" 
    end 
end 

然後只需部署cap ROLES=importer importer:deploy或。這使我可以自由地將相同的源代碼部署到不同的服務器,並在實際部署後執行完全不同的任務。

相關問題