2011-11-22 82 views
5

我使用meskyanichi的backup gem。總的來說,它可以滿足我的需求,但我需要有多個備份(例如,每小時,每天,每週)。配置大多相同,但有一些差異,所以我需要有多個配置文件。我無法找到一種理智的方式來管理配置的常見部分(即不重複常見部分)。每個備份都需要有一個單獨的配置文件(例如config/backup/hourly.rb,config/backup/daily.rb等),這些配置文件使用了很多塊結構,並且從我所知道的情況來看, 。一個典型的配置文件看起來是這樣的:Ruby備份寶石 - 共享配置?

Backup::Model.new(:my_backup, 'My Backup') do 

    database MySQL do |db| 
    db.name    = "my_database" 
    db.username   = "foo" 
    db.password   = "bar" 
    # etc 
    end 

    # similar for other config options 

end 

則備份將被執行一拉bundle exec backup perform -t my_backup -c path/to/config.rb

我在啓用常見的配置第一贓物是確定,我可以從模塊調用的方法:

def my_db_config db 
    db.name = "my_database" 
    # etc 
end 

Backup::Model.new(:my_backup, 'My Backup') do 
    database MySQL do |db| 
    my_db_config db 
    end 
    #etc 
end 

但這種失敗的undefined method 'my_db_config' for #<Backup::Database::MySQL:0x10155adf0>

我的目的是要得到這個工作,然後拆分常見的配置功能合併到其他文件,我可以在我的每一個配置文件require。我也試圖創建一個與配置代碼的文件和require將其投入模型定義塊:

# common.rb 
database MySQL do |db| 
    db.name = "my_database" 
    #etc 
end 

# config.rb 
Backup::Model.new(:my_backup, 'My Backup') do 
    require "common.rb" # with the right path, etc 
end 

這也不起作用,以及後來的研究我發現,這只是沒有辦法的辦法是require作品。一些更符合那個C/C++的#include作品(即盲目地粘貼內容到什麼範圍內,可以從所謂的)可能的工作方式。

任何想法?

回答

2

該寶石似乎修改配置塊的執行範圍。要解決這個問題,你可以換你的功能類:

class MyConfig 
    def self.prepare_db(db) 
    db.name = "my_database" 
    # etc 
    db 
    end 
end 

Backup::Model.new(:my_backup, 'My Backup') do 
    database MySQL do |db| 
    db = MyConfig.prepare_db(db) 
    end 
    #etc 
end 

你可以得到多一點幻想和抽象的默認配置的合併:

class BaseConfig 
    @@default_sets = 
    :db => { 
     :name => "my_database" 
    }, 
    :s3 => { 
     :access_key => "my_s3_key" 
    } 
    } 

    def self.merge_defaults(initial_set, set_name) 
    @@default_sets[set_name].each do |k, v| 
     initial_set.send("#{k}=".to_sym, v) 
    end 
    initial_set 
    end 
end 

Backup::Model.new(:my_backup, 'My Backup') do 
    database MySQL do |db| 
    db = BaseConfig.merge_defaults(db, :db) 
    end 

    store_with S3 do |s3| 
    s3 = BaseConfig.merge_defaults(s3, :s3) 
    end 
end 
+0

好主意!謝謝! – dantswain

1

在備份的寶石,你可以的最新版本簡單的使用主要配置文件是這樣的:

Genrate主配置文件:

[email protected]:~# backup generate:config 

修改文件的/root/Backup/config.rb這樣的:

Backup::Storage::S3.defaults do |s3| 
    s3.access_key_id  = "youkey" 
    s3.secret_access_key = "yousecret" 
    s3.region   = "us-east-1" 
    s3.bucket   = "youbacket" 
    s3.path    = "youpath" 
end 

Backup::Database::PostgreSQL.defaults do |db| 
     db.name    = "youname" 
     db.username   = "youusername" 
     db.password   = "youpassword" 
     db.host    = "localhost" 
     db.port    = 5432 
     db.additional_options = ["-xc", "-E=utf8"] 
end 

Dir[File.join(File.dirname(Config.config_file), "models", "*.rb")].each do |model| 
    instance_eval(File.read(model)) 
end 

創建模型文件:

[email protected]:~# backup generate:model --trigger daily_backup \ 
--databases="postgresql" --storages="s3" 

然後修改/root/Backup/models/daily_backup.rb這樣的:

# encoding: utf-8 

Backup::Model.new(:daily_backup, 'Description for daily_backup') do 
    split_into_chunks_of 250 

    database PostgreSQL do |db| 
    db.keep = 20 
    end 

    store_with S3 do |s3| 
    s3.keep = 20 
    end 

end 

有了這個,你可以簡單地創建每日,每月或每年的檔案。