Trong phần đầu tiên của bài viết này, chúng tôi đã định cấu hình Vagrant để thực thi hai máy ảo Ubuntu 14.04 Trusty Tahr, tương ứng được gọi là pg và backup . Trong phần thứ hai này, chúng ta sẽ xem xét cách sử dụng Puppet để thiết lập và định cấu hình máy chủ PostgreSQL trên pg và sao lưu nó qua Barman từ backup hộp.
Con rối:cấu hình
Sau khi xác định các máy theo bài viết trước, chúng ta cần chỉ định các mô-đun Con rối bắt buộc librarian-puppet sẽ quản lý cho chúng tôi.
Hai mô-đun được yêu cầu:
-
puppetlabs/postgresql(https://github.com/puppetlabs/puppetlabs-postgresql/) để cài đặt PostgreSQL trênpgVM -
it2ndq/barman(https://github.com/2ndquadrant-it/puppet-barman) để cài đặt Barman trênbackup
Cả hai mô-đun sẽ được cài đặt từ Puppet Forge. Đối với puppetlabs/postgresql , chúng tôi sẽ phải sử dụng tối đa phiên bản 4.2.0 vào lúc này, vì phiên bản mới nhất (4.3.0) đang phá vỡ postgres_password tham số chúng tôi sẽ sử dụng sau này (xem yêu cầu kéo này). Hãy tạo một tệp có tên là Puppetfile chứa nội dung này trong thư mục dự án:
forge "https://forgeapi.puppetlabs.com" mod "puppetlabs/postgresql", "<4.3.0" mod "it2ndq/barman" |
Bây giờ chúng tôi có thể cài đặt các mô-đun Con rối và các phần phụ thuộc của chúng bằng cách chạy:
$ librarian-puppet install --verbose |
Mặc dù không cần thiết nhưng bạn nên sử dụng tùy chọn --verbose mọi lúc librarian-puppet Được sử dụng. Nếu không có nó, lệnh sẽ rất yên tĩnh và sẽ hữu ích nếu bạn biết trước thông tin chi tiết về những gì nó đang làm. Ví dụ:không sử dụng --verbose , bạn có thể phát hiện ra rằng bạn đã lãng phí thời gian quý báu để chờ giải quyết xung đột phụ thuộc, chỉ để thấy lỗi nhiều phút sau đó.
Sau khi hoàn thành thành công lệnh, một modules thư mục chứa barman và postgresql mô-đun và các phụ thuộc của chúng (apt , concat , stdlib ) sẽ được tạo trong thư mục làm việc của chúng tôi. Ngoài ra, librarian-puppet sẽ tạo Puppetfile.lock để xác định các phụ thuộc và phiên bản của các mô-đun đã cài đặt, ghim chúng để ngăn các bản cập nhật trong tương lai. Bằng cách này, librarian-puppet install tiếp theo các lần chạy sẽ luôn cài đặt cùng một phiên bản của các mô-đun thay vì có thể nâng cấp (trong trường hợp cần nâng cấp, hãy librarian-puppet update sẽ thực hiện thủ thuật).
Bây giờ chúng ta có thể nói với Vagrant rằng chúng ta đang sử dụng một tệp kê khai Con rối để cung cấp cho các máy chủ. Chúng tôi thay đổi Vagrantfile như sau:
Vagrant.configure("2") do |config|
{
:pg => {
:ip => '192.168.56.221',
:box => 'ubuntu/trusty64'
},
:backup => {
:ip => '192.168.56.222',
:box => 'ubuntu/trusty64'
}
}.each do |name,cfg|
config.vm.define name do |local|
local.vm.box = cfg[:box]
local.vm.hostname = name.to_s + '.local.lan'
local.vm.network :private_network, ip: cfg[:ip]
family = 'ubuntu'
bootstrap_url = 'https://raw.github.com/hashicorp/puppet-bootstrap/master/' + family + '.sh'
# Run puppet-bootstrap only once
local.vm.provision :shell, :inline => <<-eos
if [ ! -e /tmp/.bash.provision.done ]; then
curl -L #{bootstrap_url} | bash
touch /tmp/.bash.provision.done
fi
eos
# Provision with Puppet
local.vm.provision :puppet do |puppet|
puppet.manifests_path = "manifests"
puppet.module_path = [".", "modules"]
puppet.manifest_file = "site.pp"
puppet.options = [
'--verbose',
]
end
end
end
end |
Với những dòng chúng tôi vừa thêm, chúng tôi đã cung cấp cho Vagrant hướng dẫn để cung cấp máy ảo bằng cách sử dụng manifests/site.pp dưới dạng tệp kê khai chính và các mô-đun được bao gồm trong modules danh mục. Đây là phiên bản cuối cùng của Vagrantfile của chúng tôi .
Bây giờ chúng ta phải tạo manifests thư mục:
$ mkdir manifests |
và viết vào đó phiên bản đầu tiên của site.pp . Chúng tôi sẽ bắt đầu với một thiết lập rất cơ bản:
node backup {
class { 'barman':
manage_package_repo => true,
}
}
node pg {} |
Bây giờ chúng tôi có thể khởi động máy và thấy điều đó trên backup có một máy chủ Barman với cấu hình mặc định (và không có PostgreSQL trên pg chưa). Hãy đăng nhập vào backup :
$ vagrant ssh backup |
và xem qua /etc/barman.conf :
# Main configuration file for Barman (Backup and Recovery Manager for PostgreSQL) # Further information on the Barman project at www.pgbarman.org # IMPORTANT: Please do not edit this file as it is managed by Puppet! # Global options [barman] barman_home = /var/lib/barman barman_user = barman log_file = /var/log/barman/barman.log compression = gzip backup_options = exclusive_backup minimum_redundancy = 0 retention_policy = retention_policy_mode = auto wal_retention_policy = main configuration_files_directory = /etc/barman.conf.d |
Bước tiếp theo là chạy một phiên bản PostgreSQL trên pg . Chúng ta phải biết các tham số được yêu cầu bởi Barman trên máy chủ PostgreSQL, vì vậy chúng ta cần đặt:
-
wal_levelít nhất tạiarchivecấp độ -
archive_modethànhon -
archive_commandđể các WAL có thể được sao chép trênbackup - một quy tắc trong
pg_hba.confđể truy cập từbackup
Tất cả các tham số này có thể được thiết lập dễ dàng thông qua puppetlabs/postgresql mô-đun. Ngoài ra, trên máy chủ Barman, chúng ta cần:
- một chuỗi kết nối PostgreSQL
- một
.pgpasstệp để xác thực - một lệnh SSH
- để thực hiện trao đổi khóa SSH
it2ndq/barman tạo cặp khóa riêng tư / công khai trong ~barman/.ssh . Tuy nhiên, việc tự động trao đổi khóa giữa các máy chủ yêu cầu sự hiện diện của Bậc thầy múa rối nằm ngoài mục tiêu của hướng dẫn này (nó sẽ là một phần của phần tiếp theo, sẽ tập trung vào việc thiết lập Bậc thầy múa rối và người phục vụ barman::autoconfigure class) - do đó bước cuối cùng này sẽ được thực hiện theo cách thủ công.
Chúng tôi chỉnh sửa site.pp tệp như sau:
node backup {
class { 'barman':
manage_package_repo => true,
}
barman::server {'test-server':
conninfo => 'user=postgres host=192.168.56.221',
ssh_command => 'ssh example@sqldat.com',
}
file { '/var/lib/barman/.pgpass':
ensure => 'present',
owner => 'barman',
group => 'barman',
mode => 0600,
content => '192.168.56.221:5432:*:postgres:insecure_password',
}
}
node pg {
class { 'postgresql::server':
listen_addresses => '*',
postgres_password => 'insecure_password',
pg_hba_conf_defaults => false,
}
postgresql::server::pg_hba_rule {'Local access':
type => 'local',
database => 'all',
user => 'all',
auth_method => 'peer',
}
postgresql::server::pg_hba_rule {'Barman access':
type => 'host',
database => 'all',
user => 'postgres',
address => '192.168.56.222/32',
auth_method => 'md5',
}
postgresql::server::config_entry {
'wal_level' : value => 'archive';
'archive_mode' : value => 'on';
'archive_command' : value => 'rsync -a %p example@sqldat.com:/var/lib/barman/test-server/incoming/%f';
}
class { 'postgresql::server::contrib':
package_ensure => 'present',
}
} |
Sau khi thay đổi tệp kê khai, điều khoản phải được chạy lại:
$ vagrant provision |
Với máy đang hoạt động, chúng tôi có thể tiến hành trao đổi chính. Chúng tôi đăng nhập vào pg :
$ vagrant ssh pg |
và chúng tôi tạo cặp khóa cho postgres người dùng, sử dụng ssh-keygen , để trống mọi trường khi được nhắc (vì vậy hãy luôn nhấn enter):
example@sqldat.com:~$ sudo -iu postgres example@sqldat.com:~$ ssh-keygen example@sqldat.com:~$ cat .ssh/id_rsa.pub |
Lệnh cuối cùng xuất ra một chuỗi dài gồm chữ và số phải được nối vào ~barman/.ssh/authorized_keys tệp trên backup .
$ vagrant ssh backup example@sqldat.com:~$ sudo -iu barman example@sqldat.com:~$ echo "ssh-rsa ..." >> .ssh/authorized_keys |
Tương tự, chúng tôi sao chép khóa công khai của barman người dùng vào authorized_keys tệp của postgres người dùng trên pg :
example@sqldat.com:~$ cat .ssh/id_rsa.pub ssh-rsa ... example@sqldat.com:~$ logout example@sqldat.com:~$ logout $ vagrant ssh pg example@sqldat.com:~$ sudo -iu postgres example@sqldat.com:~$ echo "ssh-rsa ..." >> .ssh/authorized_keys |
Tại thời điểm này, chúng tôi thực hiện kết nối đầu tiên theo cả hai hướng giữa hai máy chủ:
example@sqldat.com:$ ssh example@sqldat.com192.168.56.222 example@sqldat.com:$ ssh example@sqldat.com192.168.56.221 |
Chúng ta có thể chạy barman check để xác minh rằng Barman đang hoạt động chính xác:
example@sqldat.com:~$ barman check all
Server test-server:
ssh: OK
PostgreSQL: OK
archive_mode: OK
archive_command: OK
directories: OK
retention policy settings: OK
backup maximum age: OK (no last_backup_maximum_age provided)
compression settings: OK
minimum redundancy requirements: OK (have 0 backups, expected at least 0) |
Mỗi dòng phải đọc “OK”. Bây giờ, để thực hiện sao lưu, chỉ cần chạy:
example@sqldat.com:$ barman backup test-server |
Cấu hình thực tế
Cấu hình Barman được sử dụng cho đến nay rất đơn giản, nhưng bạn có thể dễ dàng thêm một vài tham số vào site.pp và tận dụng tất cả các tính năng của Barman, chẳng hạn như các chính sách lưu giữ và sao lưu gia tăng mới có sẵn trong Barman 1.4.0.
Chúng tôi kết thúc hướng dẫn này với một trường hợp sử dụng thực tế, với các yêu cầu sau:
- bản sao lưu hàng đêm lúc 1:00 sáng
- khả năng thực hiện Khôi phục kịp thời cho bất kỳ thời điểm nào trong tuần trước
- luôn có sẵn ít nhất một bản sao lưu
- báo cáo lỗi qua
barman checktrong trường hợp bản sao lưu mới nhất cũ hơn một tuần - bật tính năng sao lưu gia tăng để tiết kiệm dung lượng đĩa
Chúng tôi sử dụng tệp Puppet file tài nguyên để tạo .pgpass tệp với các tham số kết nối và cron tài nguyên để tạo ra công việc chạy hàng đêm. Cuối cùng, chúng tôi chỉnh sửa barman::server để thêm các thông số Barman cần thiết.
Kết quả cuối cùng là:
node backup {
class { 'barman':
manage_package_repo => true,
}
barman::server {'test-server':
conninfo => 'user=postgres host=192.168.56.221',
ssh_command => 'ssh example@sqldat.com',
retention_policy => 'RECOVERY WINDOW OF 1 WEEK',
minimum_redundancy => 1,
last_backup_maximum_age => '1 WEEK',
reuse_backup => 'link',
}
file { '/var/lib/barman/.pgpass':
ensure => 'present',
owner => 'barman',
group => 'barman',
mode => 0600,
content => '192.168.56.221:5432:*:postgres:insecure_password',
}
cron { 'barman backup test-server':
command => '/usr/bin/barman backup test-server',
user => 'barman',
hour => 1,
minute => 0,
}
}
node pg {
class { 'postgresql::server':
listen_addresses => '*',
postgres_password => 'insecure_password',
pg_hba_conf_defaults => false,
}
postgresql::server::pg_hba_rule {'Local access':
type => 'local',
database => 'all',
user => 'all',
auth_method => 'peer',
}
postgresql::server::pg_hba_rule {'Barman access':
type => 'host',
database => 'all',
user => 'postgres',
address => '192.168.56.222/32',
auth_method => 'md5',
}
postgresql::server::config_entry {
'wal_level' : value => 'archive';
'archive_mode' : value => 'on';
'archive_command' : value => 'rsync -a %p example@sqldat.com:/var/lib/barman/test-server/incoming/%f';
}
} |
Kết luận
Với 51 dòng tệp kê khai Con rối, chúng tôi đã quản lý để định cấu hình một cặp máy chủ PostgreSQL / Barman với các cài đặt tương tự như những cài đặt chúng tôi có thể muốn trên máy chủ sản xuất. Chúng tôi đã kết hợp những ưu điểm của việc có máy chủ Barman để xử lý các bản sao lưu với những lợi thế của việc có cơ sở hạ tầng do Puppet quản lý, có thể tái sử dụng và có thể thay thế được.
Trong bài tiếp theo và bài cuối cùng của loạt bài này, chúng ta sẽ xem xét cách sử dụng Puppet Master để xuất tài nguyên giữa các máy khác nhau, do đó cho phép các máy ảo trao đổi các tham số cần thiết để hoạt động chính xác thông qua barman::autoconfigure giúp toàn bộ quá trình thiết lập dễ dàng hơn.