2011-11-22 11 views
5

मैं meskyanichi के backup gem का उपयोग कर रहा हूँ। बड़े पैमाने पर यह मुझे करता है जो मुझे चाहिए, लेकिन मुझे एकाधिक बैकअप (उदाहरण के लिए, प्रति घंटा, दैनिक, साप्ताहिक) होना चाहिए। कॉन्फ़िगरेशन ज्यादातर समान होते हैं लेकिन कुछ अंतर होते हैं, इसलिए मुझे एकाधिक कॉन्फ़िगरेशन फ़ाइलों की आवश्यकता होती है। मुझे कॉन्फ़िगरेशन के सामान्य बिट्स को प्रबंधित करने के लिए एक सौहार्दपूर्ण तरीका खोजने में परेशानी हो रही है (यानी, सामान्य भागों को दोहराना नहीं)।रूबी बैकअप मणि - साझा कॉन्फ़िगरेशन?

कॉन्फ़िगरेशन फ़ाइलें बहुत से ब्लॉक संरचनाओं का उपयोग करती हैं, और जो मैं बता सकता हूं, प्रत्येक बैकअप को एक अलग कॉन्फ़िगरेशन फ़ाइल (जैसे कॉन्फ़िगर/बैकअप/hourly.rb, config/backup/daily.rb, आदि) की आवश्यकता होती है। । एक ठेठ कॉन्फ़िग फ़ाइल इस तरह दिखता है:

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 निष्पादित किया जाता है।

एक आम config को सक्षम करने के मेरी पहली लूट तरीकों कि मैं ब्लॉकों से कह सकते हैं परिभाषित करने के लिए किया गया था:

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 config कोड के साथ एक फ़ाइल और मॉडल परिभाषा ब्लॉक में यह ing बनाने की कोशिश की:

# 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 नहीं है काम करता है। सी/सी ++ के #include काम करने के तरीके के साथ कुछ और अधिक (यानी, सामग्री को अंधाधुंध रूप से चिपकाकर जो भी गुंजाइश कहा जाता है) काम कर सकता है।

कोई विचार?

उत्तर

2

मणि कॉन्फ़िगरेशन ब्लॉक के निष्पादन दायरे को संशोधित करने लगता है। इस को हल करने के लिए, आप एक कक्षा में अपने कार्यों लपेट सकता है:

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

बैकअप मणि आप कर सकते हैं के नवीनतम संस्करण में:

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 

आप में थोड़ा और अधिक फैंसी और अमूर्त अपने डिफ़ॉल्ट config मर्ज मिल सकता है इस तरह सरल उपयोग मुख्य कॉन्फ़िग फ़ाइल:

Genrate मुख्य कॉन्फ़िग फ़ाइल:

[email protected]:~# backup generate:config 

संशोधित इस तरह /root/Backup/config.rb दायर:

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

तो इस तरह /root/Backup/models/daily_backup.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 

मॉडल फ़ाइल बनाएँ

# 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 

इसके साथ आप दैनिक, मासिक या वार्षिक अभिलेखागार बना सकते हैं।

संबंधित मुद्दे