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

Jef*_*f V 5 capistrano capistrano3

我有20个处于"web"角色的服务器.由于更改会影响共享存储,因此我只需要对其中一个执行任务.我目前的解决方案是解决这个问题(下面).寻找更好的方法,我没有大量的红宝石或帽子经验.

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
Run Code Online (Sandbox Code Playgroud)

pym*_*kin 5

我假设您是指具有如此多Web服务器的生产配置。在这种情况下,您config/deploy/production.rb可能包含许多这样的行:

server 'web_1', roles: %w(web)
server 'web_2', roles: %w(web)
server 'web_3', roles: %w(web)
...
Run Code Online (Sandbox Code Playgroud)

只需将其中一台服务器设置为主服务器,就可以像这样:

server 'web_1', roles: %w(web), primary: true
server 'web_2', roles: %w(web)
server 'web_3', roles: %w(web)
...    
Run Code Online (Sandbox Code Playgroud)

然后更改您的任务,使其看起来像这样:

task :checkout_project_properties do
    on primary(:web) do
        execute("checkout-project-properties #{uc_stage} #{repo} #{branch}")
    end
end
Run Code Online (Sandbox Code Playgroud)