2009-04-15 124 views

回答

18

標準的方式Capistrano的做到這一點:

task :whatever, :roles => [:x, :y, :z] do 
    x_tasks 
    y_tasks 
    z_tasks 
end 

task :x_tasks, :roles => :x do 
    #... 
end 

task :y_tasks, :roles => :y do 
    #... 
end 

task :z_tasks, :roles => :z do 
    #... 
end 

所以,是的,你確實需要編寫不同的任務,但你可以從父任務給他們打電話,他們會適當地進行篩選。

+3

這不適合我,所有三項任務都會執行。 – aceofspades 2012-03-15 00:58:29

5

其實也沒什麼:

% cat capfile 
server 'localhost', :role2 
task :task1, :roles=>:role1 do 
    puts 'task1' 
end 
task :task2 do 
    task1 
end 

% cap task2 
    * executing `task2' 
    * executing `task1' 
task1 

的:角色參數是通過進一步的運行命令等,但似乎並沒有影響任務是否真正激發。

對不起,沒有找到方法發表評論,所以我寫在這裏。

1

有一種方法,種。檢查:http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/,您會看到您可以使用ROLES環境變量覆蓋默認角色。

我有一個任務定義爲:

desc "A simple test to show we can ssh into all servers" 
task :echo_hello, :roles => :test do 
    run "echo 'hello, world!'" 
end 

:test角色分配給一臺服務器。

在命令行中,我可以運行:

[[email protected] bin]$ cap echo_hello ROLES=lots_of_servers 

而且現在的任務將在lots_of_servers角色運行。

我還沒有通過更新ENV哈希來驗證它是否可用於ruby腳本,但這是一個好的開始。

3

你也可以做

task :foo do 
    run "command", :roles => :some_role 
    upload "source", "destination", :roles => :another_role 
end 
1

只有備案,這可能是使用Capistrano 3的解決方案:

desc "Do something specific for 3 different servers with 3 different roles" 
task :do_something do 
    on roles(:api_role), in: :sequence do 
    # do something in api server 
    end 

    on roles(:app_role), in: :sequence do 
    # do something in application server 
    end 

    on roles(:another_role), in: :sequence do 
    # do something in another server 
    end 
end 

的服務器定義來執行的應用程序服務器「do_something」任務將是這樣的:

server 'application.your.domain', user: 'deploy', roles: %w{app_role} 

然後,你可以調用任務(有幾種方法可以做到這一點),任務會根據「app_role」執行特定的指令。