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)
和其他方法,从堆栈溢出答案中复制粘贴,但没有找到任何匹配的答案
我可能会犹豫更长时间,因为这个答案不起作用。而且我仍然无法在任何其他帖子、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)
最后!