我在一台服务器上部署我的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
和其他方法一样,从堆栈溢出答案中复制粘贴,但没有找到任何匹配的答案
答案 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
最后!