2011-11-22 8 views
5

Estoy usando meskyanichi's backup gem. En general, hace lo que necesito, pero necesito tener varias copias de seguridad (por ejemplo, por hora, por día, por semana). Las configuraciones son básicamente las mismas, pero tienen algunas diferencias, así que necesito tener múltiples archivos de configuración. Tengo problemas para encontrar una forma sensata de administrar los bits comunes de las configuraciones (es decir, no repetir las partes comunes).Ruby copia de seguridad joya - configuraciones compartidas?

Los archivos de configuración utilizan muchas estructuras de bloques, y por lo que puedo decir, cada copia de seguridad necesita tener un archivo de configuración separado (por ejemplo, config/backup/hourly.rb, config/backup/daily.rb, etc.) . Un típico archivo de configuración es el siguiente:

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 

A continuación, la copia de seguridad se ejecuta a la bundle exec backup perform -t my_backup -c path/to/config.rb.

Mi primer botín a permitir una configuración común fue definir los métodos que podría llamar a partir de los bloques:

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 

Pero esto no funciona con un undefined method 'my_db_config' for #<Backup::Database::MySQL:0x10155adf0>.

Mi intención era hacer que esto funcionara y luego dividir las funciones comunes de configuración en otro archivo que pudiera require en cada uno de mis archivos de configuración. También probé la creación de un archivo con el código de configuración y require ing en el bloque de definición del modelo:

# 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 

Esto también no funciona, ya partir de la investigación posterior he descubierto que eso no es sólo la forma en que require trabajos. Algo más en línea con la forma en que funciona C/C++ #include (es decir, pegar a ciegas los contenidos en cualquier ámbito desde el que se llama) podría funcionar.

¿Alguna idea?

Respuesta

2

La gema parece modificar el alcance de ejecución de los bloques de configuración. Para evitar esto, se podía concluir sus funciones en una clase:

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 

Usted podría ser un poco más elegante y abstracto de combinación de su configuración por defecto:

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

¡Excelente idea! ¡Gracias! – dantswain

1

En las versiones más recientes de la gema de copia de seguridad que pueda un uso simple archivo de configuración principal de la siguiente manera:

Genrate principal fichero de configuración:

[email protected]:~# backup generate:config 

Modificar el archivo /root/Backup/config.rb así:

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 

Crear archivo de modelo:

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

a continuación, modificar /root/Backup/models/daily_backup.rb así:

# 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 esto puede simplemente crear archivos diarios, mensuales o anuales.

Cuestiones relacionadas