Capistrano获取列表服务器

时间:2018-02-14 10:07:44

标签: capistrano

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

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

我在3.10.1版本的gem中的docs http://www.rubydoc.info/gems/capistrano/toplevel中搜索了它。但是Capistrano中未定义servers方法。 看看我编造的东西)):

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

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

1 个答案:

答案 0 :(得分:2)

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

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