Capistrano 部署到所有服务器,但仅在一个服务器上运行一些任务

Lau*_*ntG 4 capistrano capistrano3

我只在一台服务器上部署了我的 Symfony2 应用程序几个月,它是完美的,但是随着我添加了更多服务器,当我想同时更新我的​​所有服务器时我卡住了,但只运行一些命令一次(如数据库迁移、资产生成和推送到 S3)。

这是我的服务器:

server '192.168.0.100', user: 'ubuntu', roles: %w{app db web toto}
server '192.168.0.101', user: 'ubuntu', roles: %w{app db web}
Run Code Online (Sandbox Code Playgroud)

这是我的一项自定义任务deploy.rb

namespace :specific do
    task :command do
        on roles(:all) do |host|
            if host.roles.include?(:toto)
                invoke 'symfony:console', 'one:specific:command'
            end
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

随着cap --roles=toto staging deploy后来只有我的两个服务器中的一个进行了更新。

我试过这样的过滤方法:

namespace :assets do
    task :increment do
        set :filter, :roles => %w{toto}
        invoke 'symfony:console', 'one:specific:command'
    end
end
Run Code Online (Sandbox Code Playgroud)

和其他方法,从堆栈溢出答案中复制粘贴,但没有找到任何匹配的答案

Lau*_*ntG 7

我可能会犹豫更长时间,因为这个答案不起作用。而且我仍然无法在任何其他帖子、SO 问题或 Capistrano 文档中找到解决方案...


我犹豫着发布这个问题,终于找到了我的答案。但由于我花了很长时间搜索,这里是答案:

只需添加primary: true到一个网站:

server '192.168.0.100', roles: %w{app db web}, primary: true
server '192.168.0.101', roles: %w{app db web}
Run Code Online (Sandbox Code Playgroud)

而在deploy.rb

namespace :specific do
    task :command do
        on primary(:web) do
            invoke 'symfony:console', 'one:specific:command'
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

我的命令输出仍然指定了两个服务器,但希望只有一个执行了特定命令:

  03 php app/console one:specific:command
? 03 ubuntu@192.168.0.100 1.153s
? 03 ubuntu@192.168.0.101 6.551s
Run Code Online (Sandbox Code Playgroud)

最后!