2011-11-22 33 views
5

Tôi đang sử dụng số backup gem của meskyanichi. Bởi và lớn nó làm những gì tôi cần nó, nhưng tôi cần phải có nhiều bản sao lưu (ví dụ, hàng giờ, hàng ngày, hàng tuần). Các cấu hình chủ yếu là giống nhau nhưng có một vài khác biệt, vì vậy tôi cần phải có nhiều tệp cấu hình. Tôi gặp khó khăn khi tìm một cách lành mạnh để quản lý các bit cấu hình chung (tức là, không lặp lại các phần phổ biến).Đá quý sao lưu của Ruby - cấu hình được chia sẻ?

Tệp cấu hình sử dụng nhiều cấu trúc khối và từ những gì tôi có thể biết, mỗi bản sao lưu cần phải có tệp cấu hình riêng (ví dụ: config/backup/hourly.rb, config/backup/daily.rb, v.v.) . Tệp cấu hình điển hình trông giống như sau:

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 

Sau đó, sao lưu được thực hiện la la bundle exec backup perform -t my_backup -c path/to/config.rb.

swag đầu tiên của tôi tạo điều kiện cho một cấu hình chung là để xác định phương pháp mà tôi có thể gọi từ các khối:

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 

Nhưng điều này không thành công với một undefined method 'my_db_config' for #<Backup::Database::MySQL:0x10155adf0>.

Ý định của tôi là làm cho tính năng này hoạt động và sau đó chia các chức năng cấu hình chung thành một tệp khác mà tôi có thể require trong mỗi tệp cấu hình của mình. Tôi cũng đã cố gắng tạo ra một tập tin với mã config và require ing nó vào trong khối mô hình định nghĩa:

# 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 

này cũng không hoạt động, và từ nghiên cứu tiếp theo tôi đã phát hiện ra rằng đó chỉ là không phải là cách mà require công trinh. Một cái gì đó phù hợp hơn với cách hoạt động của công cụ #include của C/C++ (tức là, dán một cách mù quáng nội dung vào bất kỳ phạm vi nào được gọi từ) có thể hoạt động.

Bất kỳ ý tưởng nào?

Trả lời

2

Đá quý có vẻ như sửa đổi phạm vi thực hiện của các khối cấu hình. Để làm việc xung quanh này, bạn có thể quấn chức năng của bạn trong một lớp học:

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 

Bạn có thể nhận được một chút lạ mắt hơn và trừu tượng cấu hình mặc định của bạn merge:

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

Ý tưởng tuyệt vời! Cảm ơn! – dantswain

1

Trong các phiên bản mới nhất của ngọc sao lưu bạn có thể sử dụng đơn giản tập tin cấu hình chính như thế này:

genrate chính tập tin cấu hình:

[email protected]:~# backup generate:config 

Sửa nộp /root/Backup/config.rb như thế này:

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 

Tạo mô hình file:

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

Sau đó sửa đổi /root/Backup/models/daily_backup.rb như thế này:

# 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 

Với điều này, bạn có thể chỉ cần tạo lưu trữ hàng ngày, hàng tháng hoặc hàng năm.

Các vấn đề liên quan