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

时间:2016-08-30 13:14:46

标签: 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}

这是我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

使用cap --roles=toto staging deploy,但我的两台服务器中只有一台已更新。

我尝试过这样的过滤方法:

namespace :assets do
    task :increment do
        set :filter, :roles => %w{toto}
        invoke 'symfony:console', 'one:specific:command'
    end
end

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

1 个答案:

答案 0 :(得分:2)

我可能会犹豫不决,因为这个答案不起作用。我仍然无法找到解决方案,在任何其他帖子,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}

deploy.rb

namespace :specific do
    task :command do
        on primary(:web) do
            invoke 'symfony:console', 'one:specific:command'
        end
    end
end

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

  03 php app/console one:specific:command
✔ 03 ubuntu@192.168.0.100 1.153s
✔ 03 ubuntu@192.168.0.101 6.551s

最后!