2009-04-15 86 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”执行特定的指令。