【问题标题】:Capistrano deploy to all servers but run some tasks on only oneCapistrano 部署到所有服务器,但仅在其中一台服务器上运行一些任务
【发布时间】:2016-08-30 13:14:45
【问题描述】:

我只在一台服务器上部署了 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

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

【问题讨论】:

标签: capistrano capistrano3


【解决方案1】:

我可能会犹豫更长的时间,因为这个答案不起作用。而且我仍然无法在任何其他帖子、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

终于!

【讨论】:

  • 我相信默认情况下,第一个条目被定义为主服务器。因此,如果您只希望一个特定角色的服务器运行任务,但您不在乎它是哪一个,那么您可以省略 primary: true 参数。
  • @will_in_wi 嗯……我也得试试。也许这个:capistranorb.com/documentation/advanced-features/…
猜你喜欢
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2010-11-17
  • 2011-01-07
  • 2014-05-26
  • 2023-04-04
  • 2012-09-06
相关资源
最近更新 更多