2014-09-20 56 views
1

一個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 
+0

我的確在過去類似的東西,但Capistrano的2:https://github.com/arturhoo/matross/blob/master/lib/matross/mysql.rb#L92-L159 – arturhoo 2014-09-20 20:45:37

回答

2

首先,我認爲這是最好使用用於指定遠程舞臺服務器而不是本地舞臺服務器的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)回報你的流浪漢服務器的服務器。

相關問題