17

我正在寻找一种方法来调用单个 Capistrano 任务来为不同的角色执行不同的事情。Capistrano 是否能够做到这一点,或者我是否为每个角色编写了特定的任务?

4

6 回答 6

17

在 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

所以是的,您确实需要编写单独的任务,但您可以从父任务中调用它们,它们会适当地过滤。

于 2009-04-15T23:31:54.580 回答
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

:roles 参数被进一步传递给运行命令等,但似乎并不影响任务是否被实际触发。

抱歉,没有找到对评论发表评论的方法,所以我在这里写了。

于 2011-06-20T00:11:47.413 回答
3

你也可以做

task :foo do
    run "command", :roles => :some_role
    upload "source", "destination", :roles => :another_role
end
于 2012-04-18T13:01:48.997 回答
2

使用命名空间: https ://github.com/leehambley/capistrano-handbook/blob/master/index.markdown#namespacing-tasks

namespace :backup do

  task :default do
    web
    db
  end

  task :web, :roles => :web do
    puts "Backing Up Web Server"
  end

  task :db, :roles => :db do
    puts "Backing Up DB Server"
  end
end

这些任务在 cap -T 中显示为

backup:default 
backup:web
backup:db
于 2012-07-06T19:57:20.537 回答
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角色分配给一台服务器。

在命令行上,我可以运行:

[james@fluffyninja bin]$ cap echo_hello ROLES=lots_of_servers

该任务现在将在lots_of_servers 角色上运行。

我还没有通过更新哈希验证这在 ruby​​ 脚本中是否有效ENV,但这是一个好的开始。

于 2012-03-16T22:01:12.523 回答
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”执行具体的指令。

于 2014-02-11T20:05:02.413 回答