Capistrano 3:仅在分配了角色的服务器池中的单个服务器上运行任务

Capistrano 3:仅在分配了角色的服务器池中的单个服务器上运行任务,capistrano,capistrano3,Capistrano,Capistrano3,我有20台服务器处于“web”角色。我只需要对其中一个执行一项任务,因为更改会影响共享存储。我目前的解决方案是绕过这一点(见下文)。为了寻找更好的方法,我没有大量的ruby或cap经验 task :checkout_project_properties do num_runs = 0 on roles(:web), in: :sequence do if num_runs > 0 abort('Only running on one

我有20台服务器处于“web”角色。我只需要对其中一个执行一项任务,因为更改会影响共享存储。我目前的解决方案是绕过这一点(见下文)。为了寻找更好的方法,我没有大量的ruby或cap经验

task :checkout_project_properties do
    num_runs = 0
    on roles(:web), in: :sequence do
        if num_runs > 0
            abort('Only running on one server.  Exiting')
        end
        execute("checkout-project-properties #{uc_stage} #{repo} #{branch}")
        num_runs += 1
    end
end

我假设您指的是您的生产配置,有这么多web服务器。在本例中,您的
config/deploy/production.rb
可能包含许多这样的行:

服务器“web_1”,角色:%w(web)
服务器“web_2”,角色:%w(web)
服务器“web_3”,角色:%w(web)
...
只需将其中一台服务器设为主服务器,使其看起来像:

服务器“web_1”,角色:%w(web),主:true 服务器“web_2”,角色:%w(web) 服务器“web_3”,角色:%w(web) ... 然后更改任务,使其如下所示:

任务:签出项目属性
在主(:web)上执行
执行(“签出项目属性#{uc_stage}#{repo}#{branch}”)
结束
结束

不适用于我:”(我尝试过使用或不使用
(:web)
,以及其他组合。可能是因为我正在执行
调用
,而不是执行
执行
?如果要在任何角色的服务器上运行,您可以做什么?似乎
方法必须带参数