2011-11-22 83 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 

有了这个,你可以简单地创建每日,每月或每年的档案。