В първата част на тази статия конфигурирахме Vagrant да изпълнява две виртуални машини Ubuntu 14.04 Trusty Tahr, съответно наречени pg и резервно . В тази втора част ще разгледаме как да използваме Puppet за настройване и конфигуриране на PostgreSQL сървър на pg и го архивирайте чрез Barman от backup кутия.
Кукла:конфигурация 
След като дефинираме машините съгласно предишната статия, трябва да посочим необходимите Puppet модули, които librarian-puppet ще управлява вместо нас.
Необходими са два модула:
puppetlabs/postgresql(https://github.com/puppetlabs/puppetlabs-postgresql/), за да инсталирате PostgreSQL наpgVMit2ndq/barman(https://github.com/2ndquadrant-it/puppet-barman), за да инсталирате Barman наbackup
И двата модула ще бъдат инсталирани от Puppet Forge. За puppetlabs/postgresql модул, ще трябва да използваме най-много версия 4.2.0 в момента, тъй като най-новата версия (4.3.0) нарушава postgres_password параметър, който ще използваме по-късно (вижте тази заявка за изтегляне). Нека създадем файл, наречен Puppetfile съдържащ това съдържание в директорията на проекта:
forge "https://forgeapi.puppetlabs.com" mod "puppetlabs/postgresql", "<4.3.0" mod "it2ndq/barman" |
Вече можем да инсталираме модулите Puppet и техните зависимости, като изпълним:
$ librarian-puppet install --verbose |
Въпреки че не е от съществено значение, за предпочитане е да използвате опцията --verbose всеки път библиотекар-марионетка се използва. Без него командата е много тиха и е полезно да имате подробности за това какво прави предварително. Например, без да използвате --verbose , може да разберете, че сте загубили ценно време в чакане на разрешаване на конфликт на зависимости, само за да видите грешка много минути по-късно.
При успешно завършване на командата, a modules директория, съдържаща barman и postgresql модули и техните зависимости (apt , конкат , stdlib ) ще бъде създаден в нашата работна директория. Освен това библиотекар-марионетка ще създаде Puppetfile.lock файл, за да идентифицира зависимостите и версиите на инсталираните модули, като ги закачи, за да предотврати бъдещи актуализации. По този начин последващо инсталиране на библиотекар-марионетка runs винаги ще инсталира една и съща версия на модулите вместо възможни надстройки (в случай, че е необходима надстройка, актуализация на библиотекаря-марионетка ще свърши работа).
Сега можем да кажем на Vagrant, че използваме манифест на Puppet за осигуряване на сървърите. Променяме Vagrantfile както следва:
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 |
С редовете, които току-що добавихме, дадохме на Vagrant инструкции за предоставяне на виртуалните машини с помощта на manifests/site.pp като основен манифест и модулите, включени в модулите директория. Това е последната версия на нашия Vagrantfile .
Сега трябва да създадем манифестите директория:
$ mkdir manifests |
и напишете в него първа версия на site.pp . Ще започнем с много основна настройка:
node backup {
class { 'barman':
manage_package_repo => true,
}
}
node pg {} |
Вече можем да стартираме машините и да видим това в backup има Barman сървър с конфигурация по подразбиране (и няма PostgreSQL на pg още). Нека влезем в backup :
$ vagrant ssh backup |
и разгледайте /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 |
Следващата стъпка е стартиране на екземпляр на PostgreSQL на pg . Трябва да сме наясно с параметрите, изисквани от Barman на PostgreSQL сървъра, така че трябва да зададем:
wal_levelпоне вархивнивоarchive_modeдовключеноархивна_командатака че WAL да могат да бъдат копирани врезервно копие- правило в
pg_hba.confза достъп отрезервно копие
Всички тези параметри могат лесно да бъдат зададени чрез puppetlabs/postgresql модул. Освен това на сървъра на Barman ни трябва:
- низ за връзка с PostgreSQL
.pgpassфайл за удостоверяване- SSH команда
- за извършване на обмен на SSH ключове
it2ndq/barman генерира частна/публична двойка ключове в ~barman/.ssh . Въпреки това, автоматичната размяна на ключовете между сървърите изисква присъствието на Puppet Master, което е извън целите на този урок (той ще бъде част от следващата част, която ще се фокусира върху настройката на Puppet Master и barman ::автоматично конфигуриране клас) – следователно тази последна стъпка ще бъде извършена ръчно.
Редактираме site.pp файл, както следва:
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',
}
} |
След промяна на манифеста, разпоредбата трябва да се изпълни отново:
$ vagrant provision |
При работещи машини можем да продължим с размяната на ключове. Влизаме в pg :
$ vagrant ssh pg |
и създаваме двойката ключове за postgres потребител, използвайки ssh-keygen , оставяйки всяко поле празно, когато бъдете подканени (така че винаги натискайте enter):
example@sqldat.com:~$ sudo -iu postgres example@sqldat.com:~$ ssh-keygen example@sqldat.com:~$ cat .ssh/id_rsa.pub |
Последната команда извежда дълъг буквено-цифров низ, който трябва да бъде добавен към ~barman/.ssh/authorized_keys файл на резервно копие .
$ vagrant ssh backup example@sqldat.com:~$ sudo -iu barman example@sqldat.com:~$ echo "ssh-rsa ..." >> .ssh/authorized_keys |
По подобен начин копираме публичния ключ на barman потребител в authorized_keys файл на postgres потребител на 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 |
В този момент правим първа връзка в двете посоки между двата сървъра:
example@sqldat.com:$ ssh example@sqldat.com192.168.56.222 example@sqldat.com:$ ssh example@sqldat.com192.168.56.221 |
Можем да изпълним барман проверка за да проверите дали Barman работи правилно:
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) |
Всеки ред трябва да гласи „OK“. Сега, за да направите резервно копие, просто изпълнете:
example@sqldat.com:$ barman backup test-server |
Реалистична конфигурация
Използваната досега конфигурация на Barman е много проста, но можете лесно да добавите няколко параметъра към site.pp и се възползвайте от всички функции на Barman, като например политиките за задържане и новото допълнително архивиране, достъпно в Barman 1.4.0.
Завършваме този урок с реалистичен случай на употреба, със следните изисквания:
- резервно копие всяка вечер в 1:00 сутринта
- възможността за извършване на Възстановяване във времето до всеки момент от последната седмица
- винаги да разполагате с поне едно резервно копие
- докладване за грешка чрез
барман проверкав случай, че най-новото архивно копие е по-старо от седмица - активиране на инкрементално архивиране за спестяване на дисково пространство
Използваме Puppet файл ресурс за създаване на .pgpass файл с параметрите на връзката и cron ресурс за генериране на заданието, което да се изпълнява всяка вечер. Накрая редактираме barman::server за да добавите необходимите параметри на Барман.
Крайният резултат е:
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';
}
} |
Заключение
С 51 реда манифест на Puppet успяхме да конфигурираме чифт PostgreSQL/Barman сървъри с настройки, подобни на тези, които може да искаме на производствен сървър. Комбинирахме предимствата на наличието на Barman сървър за обработка на архиви с тези на инфраструктура, управлявана от Puppet, за многократна употреба и версия.
В следващата и последна публикация от тази поредица от статии ще разгледаме как да използваме Puppet Master за експортиране на ресурси между различни машини, като по този начин позволяваме на VM да обменят параметрите, необходими за правилното функциониране чрез barman::autoconfigureкод> клас, което улеснява целия процес на настройка.