调用另一个环境
问题描述:
一个Capistrano的任务,我想创建从我的生产/开发环境同步到本地无业游民箱的任务。调用另一个环境
我希望这样的命令:cap vagrant sync_production_database
这将执行远程服务器上的数据库转储,下载它,然后将其导入到流浪者箱。不幸的是,我找不到在另一个环境中执行capistrano任务的方法。
我有我的环境设置,像这样:
config
├── deploy
│ ├── production.rb
│ ├── staging.rb
│ └── vagrant.rb
└── deploy.rb
这里是什么,我试图完成一个例子:
desc 'sync database'
task :sync_production_database do
# executed on remote server
# this is obviously not working
on(:production) do |host|
# dump database and download it
end
# executed on vagrant box
on roles(:web) do |host|
end
end
答
首先,我认为这是最好使用用于指定远程舞台服务器而不是本地舞台服务器的cap
命令的stage参数。这意味着你的命令假定:vagrant
一直是本地舞台。
这时如果vagrant
台服务器有角色的远程服务器没有,你可以在每个阶段通过以下执行不同的任务:
# Assuming the following stage definitions in deploy/production.rb and deploy/vagrant.rb respectively
server 'production.example.com', roles: %w{web app}
server 'vagrant.local', roles: %w{web localhost}
# the following will execute tasks on each host
desc 'sync database'
task :sync_database do
# executed on remote server(s)
on roles(:app) do |host|
# dump database and download it
end
# Load the servers in deploy/vagrant.rb
invoke(:vagrant)
# executed on vagrant box server(s)
on roles(:localhost) do |host|
# Create database and load dump from remote
end
end
这工作,因为roles(...)
回报装入所有服务器并且由于每个阶段都有独特的角色,因此您可以通过指定其各自的角色来检索所需的服务器。
通常,上述示例中没有invoke(:vagrant)
,roles(:localhost)
将不返回任何内容,因为Capistrano默认只加载给定阶段中定义的服务器。为了解决这个问题,你可以使用invoke(:vagrant)
迫使你vagrant
级负载的服务器。那么,roles(:app)
返回给定的阶段,roles(:localhost)
回报你的流浪汉服务器的服务器。
我的确在过去类似的东西,但Capistrano的2:https://github.com/arturhoo/matross/blob/master/lib/matross/mysql.rb#L92-L159 – arturhoo 2014-09-20 20:45:37