Capistrano 获取列表服务器

Capistrano get list servers

我需要编写一个任务,在每台服务器上只执行一次一行命令。 例如:

task :start_service do
  on servers do
    execute 'sudo svc -t /etc/my_service'
  end
end

我在3.10.1版本gem的文档http://www.rubydoc.info/gems/capistrano/toplevel中搜索到了。但是 servers 方法在 Capistrano 中是未定义的。 看看我炮制了什么)):

task :docker_start do
  servers = server('') # dirty hack to get all servers
  on servers do |h|
    next if h == ''
    execute 'sudo svc -t /etc/my_service'
  end
end

有没有办法不用这个肮脏的黑客来做到这一点? 谢谢。

编辑: 我的 my_stage.rb 看起来像这样:

server 'serv1', roles: %w(app role1 role2)
server 'serv2', roles: %w(app role2 db role3), primary: true

我想我可以为每个服务器添加一个特殊角色,例如:my_service:

server 'serv1', roles: %w(app role1 role2 my_service)
server 'serv2', roles: %w(app role2 db role3 my_service), primary: true

并将任务写为:

task :start_service do
  on roles :my_service do
    execute 'sudo svc -t /etc/my_service'
  end
end

但我认为只为列表服务器添加新角色并不是真正的方法。

有一个匹配所有服务器的特殊角色:all。此外,您可以指定 in: :sequence 以确保一次在一台服务器上执行(而不是并行,默认情况下)。

task :start_service do
  on roles(:all), in: :sequence do
    execute 'sudo svc -t /etc/my_service'
  end
end