【问题标题】:Capistrano 3: Run task only on a single server from a pool of servers assigned a roleCapistrano 3:仅在分配了角色的服务器池中的单个服务器上运行任务
【发布时间】:2023-12-15 05:39:01
【问题描述】:

我有 20 台服务器担任“网络”角色。我有一项任务只需要在其中一个上执行,因为更改会影响共享存储。我目前的解决方案是解决这个问题(如下)。寻找更好的方法,我没有大量的 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

【问题讨论】:

    标签: capistrano capistrano3


    【解决方案1】:

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

    server 'web_1', roles: %w(web)
    server 'web_2', roles: %w(web)
    server 'web_3', roles: %w(web)
    ...
    

    只需将其中一台服务器设为主要服务器,如下所示:

    server 'web_1', roles: %w(web), primary: true
    server 'web_2', roles: %w(web)
    server 'web_3', roles: %w(web)
    ...    
    

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

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

    【讨论】:

    • 不适合我 :'( 我尝试过使用或不使用(:web) 以及其他组合。可能是因为我正在使用invoke 而不是execute
    • 如果你想在任何角色的任何服务器上运行,你能做什么? primary 方法似乎必须带一个参数
    最近更新 更多