我需要编写一个任务,每次只在一台服务器上执行一行命令。 例如:
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
但我认为这不是仅为列表服务器添加新角色的真正方法。
答案 0 :(得分:2)
有一个匹配所有服务器的特殊角色:all
。此外,您可以指定in: :sequence
以确保一次在一台服务器上执行(而不是并行,默认情况下)。
task :start_service do
on roles(:all), in: :sequence do
execute 'sudo svc -t /etc/my_service'
end
end