2011-11-22 14 views
5

Sto usando meskyanichi backup gem. In linea di massima fa quello che mi serve, ma ho bisogno di avere più backup (ad esempio, ogni ora, ogni giorno, ogni settimana). Le configurazioni sono quasi sempre le stesse ma hanno alcune differenze, quindi ho bisogno di avere più file di configurazione. Ho difficoltà a trovare un modo corretto per gestire i bit di configurazione comuni (ad esempio, non ripetere le parti comuni).Gemma di backup rubino - configurazioni condivise?

I file di configurazione utilizzano molte strutture a blocchi e, da quello che posso dire, ogni backup deve disporre di un file di configurazione separato (ad es. Config/backup/hourly.rb, config/backup/daily.rb, ecc.) . Un tipico file di configurazione è simile al seguente:

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 

Poi il backup viene eseguito alla bundle exec backup perform -t my_backup -c path/to/config.rb.

Il mio primo malloppo a consentire una configurazione comune è stato quello di definire i metodi che ho potuto chiamare dai blocchi:

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 

Ma questo non riesce con un undefined method 'my_db_config' for #<Backup::Database::MySQL:0x10155adf0>.

La mia intenzione era quella di far funzionare questo e poi dividere le funzioni di configurazione comuni in un altro file che potevo require in ciascuno dei miei file di configurazione. Ho provato anche la creazione di un file con il codice di configurazione e require ing che nel blocco di definizione del modello:

# 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 

Anche questo non funziona, e dalle successive ricerche ho scoperto che questo non è solo il modo in cui require lavori. Qualcosa di più in linea con il modo in cui funziona lo #include di C/C++ (vale a dire incollando ciecamente il contenuto in qualsiasi ambito da cui viene chiamato) potrebbe funzionare.

Qualche idea?

risposta

2

La gemma sembra modificare l'ambito di esecuzione dei blocchi di configurazione. Per ovviare a questo, si potrebbe avvolgere le funzioni in una classe:

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 

si potrebbe ottenere un po 'più di fantasia e astratto vostra configurazione di default di fusione:

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

Ottima idea! Grazie! – dantswain

1

Nelle versioni più recenti di gemma di backup è possibile uso semplice file di configurazione principale in questo modo:

Genrate file di configurazione principale:

[email protected]:~# backup generate:config 

Modificare il file /root/Backup/config.rb come questo:

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 

Creare file di modello:

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

quindi modificare /root/Backup/models/daily_backup.rb come questo:

# 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 

Con questo è possibile semplicemente creare archivi giornalieri, mensili o annuali.

Problemi correlati