我正在使用Capistrano来处理我的部署,我在我的设置中有两个不同的角色 - 网络和:处理。它们都有通常的:部署任务,但:两种类型的服务器的:restart任务需要不同。
所以我的第一次尝试是这样的:
task :restart, :roles => :web do
run "... web related restart stuff ..."
end
task :restart, :roles => :processing do
run "... processing related restart stuff ..."
end
哪个不起作用,因为第二个:restart(for:处理角色)替换第一个:restart(对于:web角色),而:web:restart永远不会发生。
我快速浏览了一下,看看我是否可以编写条件代码,具体取决于运行任务时服务器可能处于哪个角色(或角色)但是旁边没有任何文档用于此类事情。有什么想法吗?
答案 0 :(得分:7)
您应该使用名称空间:
namespace :web do
desc "Restart web servers"
task :restart, :roles => :web do
# Restart Magic Here
end
end
namespace :process do
desc "Restart process servers"
task :restart, :roles => :process do
# Restart magic here
end
end
# Optionally:
task :restart do
web.restart
process.restart
end
我认为这就是你要找的东西!
另外,要在命令行中使用这些,您可以使用
$ cap <stage> # (if using multistage)
$ cap web:restart # Restarts web servers
$ cap process:restart # Restarts process servers
$ cap restart # Restarts both process and web servers
(来源:我是Capistrano的维护者。)
答案 1 :(得分:1)
在这种情况下,您应该使用'parallel'而不是'run':
task :restart do
parallel do |session|
session.when "in?(:web)", "...substitute run command contents here...."
session.when "in?(:process)", "...substitute run command contents here...."
end
end
如果你打算在不同的任务中使用“跑步”以外的东西,你最好坚持其他一个答案。
有关'parallel'命令的更多信息,请访问:https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invokation-Parallel
答案 2 :(得分:0)
如果您需要调用默认的deploy
任务,并进行一些自定义重启等,我想出了这个解决方案:
# Servers
server "importerhost.com", :app, :web, :db, :importer, :primary => true
server "backuphost.com", :app, :web, :db, :backup, :primary => true
set :deploy_to, "/apps/appname"
# Ensure deploy before restart
before 'importer:deploy', 'deploy'
before 'backup:deploy', 'deploy'
# Importer
namespace :importer do
desc "Restart importer service"
task :deploy, :roles => :importer do
sudo "cp #{current_release}/config/importer.conf /etc/init/importer.conf"
sudo "service importer restart N=1"
sudo "service importer restart N=2"
end
end
# Backup
namespace :backup do
desc "Restart backup service"
task :deploy, :roles => :backup do
sudo "cp #{current_release}/config/backup.conf /etc/init/backup.conf"
sudo "service backup restart"
end
end
然后只需使用cap ROLES=importer importer:deploy
或cap ROLES=backup backup:deploy
进行部署。这使我可以自由地将相同的源代码部署到不同的服务器,并在实际部署后执行完全不同的任务。