Na primeira parte deste artigo configuramos o Vagrant para executar duas máquinas virtuais Ubuntu 14.04 Trusty Tahr, respectivamente chamadas
pg
e backup
. Nesta segunda parte veremos como usar o Puppet para configurar um servidor PostgreSQL em pg
e faça backup via Barman do backup
caixa. Fantoche:configuração
Depois de definir as máquinas conforme o artigo anterior, precisamos especificar os módulos Puppet necessários que
librarian-puppet
vai administrar por nós. São necessários dois módulos:
puppetlabs/postgresql
(http://github.com/puppetlabs/puppetlabs-postgresql/) para instalar o PostgreSQL nopg
VMit2ndq/barman
(http://github.com/2ndquadrant-it/puppet-barman) para instalar o Barman nobackup
Ambos os módulos serão instalados a partir do Puppet Forge. Para o
puppetlabs/postgresql
módulo, teremos que usar no máximo a versão 4.2.0 no momento, pois a versão mais recente (4.3.0) está quebrando a postgres_password
parâmetro que usaremos mais tarde (veja este pull request). Vamos criar um arquivo chamado Puppetfile
contendo este conteúdo no diretório do projeto: forge "http://forgeapi.puppetlabs.com" mod "puppetlabs/postgresql", "<4.3.0" mod "it2ndq/barman" |
Agora podemos instalar os módulos Puppet e suas dependências executando:
$ librarian-puppet install --verbose |
Embora não seja essencial, é preferível usar a opção
--verbose
toda vez que librarian-puppet
é usado. Sem ele o comando fica muito tranquilo e é útil ter detalhes sobre o que está fazendo com antecedência. Por exemplo, sem usar --verbose
, você pode descobrir que perdeu um tempo precioso esperando a resolução de um conflito de dependência, apenas para ver um erro muitos minutos depois. Após a conclusão bem-sucedida do comando, um
modules
diretório contendo o barman
e postgresql
módulos e suas dependências (apt
, concat
, stdlib
) será criado em nosso diretório de trabalho. Além disso, librarian-puppet
irá criar o Puppetfile.lock
para identificar dependências e versões dos módulos instalados, fixando-os para evitar futuras atualizações. Dessa forma, a instalação do librarian-puppet
runs irão sempre instalar a mesma versão dos módulos em vez de possíveis actualizações (caso seja necessária uma actualização, librarian-puppet update
vai fazer o truque). Agora podemos dizer ao Vagrant que estamos usando um manifesto Puppet para provisionar os servidores. Alteramos o
Vgrantfile
do seguinte modo: 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 = 'http://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 |
Com as linhas que acabamos de adicionar, demos ao Vagrant as instruções para provisionar as VMs usando
manifests/site.pp
como o manifesto principal e os módulos incluídos nos modules
diretório. Esta é a versão final do nosso Vgrantfile
. Agora temos que criar os
manifestos
diretório: $ mkdir manifests |
e escreva nele uma primeira versão do
site.pp
. Vamos começar com uma configuração muito básica: node backup { class { 'barman': manage_package_repo => true, } } node pg {} |
Agora podemos iniciar as máquinas e ver isso em
backup
existe um servidor Barman com uma configuração padrão (e nenhum PostgreSQL em pg
ainda). Vamos fazer login no backup
: $ vagrant ssh backup |
e dê uma olhada em
/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 |
A próxima etapa é executar uma instância do PostgreSQL em
pg
. Devemos estar cientes dos parâmetros exigidos pelo Barman no servidor PostgreSQL, então precisamos definir:wal_level
pelo menos emarquivo
nívelarchive_mode
paraligar
archive_command
para que os WALs possam ser copiados nobackup
- uma regra em
pg_hba.conf
para acesso debackup
Todos esses parâmetros podem ser facilmente configurados através do
puppetlabs/postgresql
módulo. Além disso, no servidor Barman, precisamos:- uma string de conexão do PostgreSQL
- um
.pgpass
arquivo para autenticação - um comando SSH
- para realizar a troca de chave SSH
it2ndq/barman
gera um par de chaves privada/pública em ~barman/.ssh
. No entanto, a troca automática de chaves entre os servidores requer a presença de um Puppet Master, o que está além dos objetivos deste tutorial (será parte da próxima parcela, que se concentrará na configuração de um Puppet Master e do barman ::autoconfiguração
class) – portanto, esta última etapa será realizada manualmente. Editamos o
site.pp
arquivo da seguinte forma: node backup { class { 'barman': manage_package_repo => true, } barman::server {'test-server': conninfo => 'user=postgres host=192.168.56.221', ssh_command => 'ssh [email protected]', } 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 [email protected]:/var/lib/barman/test-server/incoming/%f'; } class { 'postgresql::server::contrib': package_ensure => 'present', } } |
Tendo alterado o manifesto, a disposição deve ser executada novamente:
$ vagrant provision |
Com as máquinas funcionando, podemos prosseguir com as trocas de chaves. Entramos em
pg
: $ vagrant ssh pg |
e criamos o par de chaves para o
postgres
usuário, usando ssh-keygen
, deixando todos os campos vazios quando solicitado (sempre pressionando enter): [email protected]:~$ sudo -iu postgres [email protected]:~$ ssh-keygen [email protected]:~$ cat .ssh/id_rsa.pub |
O último comando gera uma longa string alfanumérica que deve ser anexada ao
~barman/.ssh/authorized_keys
arquivo em backup
. $ vagrant ssh backup [email protected]:~$ sudo -iu barman [email protected]:~$ echo "ssh-rsa ..." >> .ssh/authorized_keys |
Da mesma forma, copiamos a chave pública do
barman
usuário nas authorized_keys
arquivo do postgres
usuário em pg
: [email protected]:~$ cat .ssh/id_rsa.pub ssh-rsa ... [email protected]:~$ logout [email protected]:~$ logout $ vagrant ssh pg [email protected]:~$ sudo -iu postgres [email protected]:~$ echo "ssh-rsa ..." >> .ssh/authorized_keys |
Neste ponto, fazemos uma primeira conexão em ambas as direções entre os dois servidores:
[email protected]:$ ssh [email protected] [email protected]:$ ssh [email protected] |
Podemos executar
barman check
para verificar se o Barman está funcionando corretamente: [email protected]:~$ 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) |
Cada linha deve ler “OK”. Agora, para realizar um backup, basta executar:
[email protected]:$ barman backup test-server |
Uma configuração realista
A configuração do Barman usada até agora é muito simples, mas você pode adicionar facilmente alguns parâmetros ao
site.pp
e aproveite todos os recursos do Barman, como as políticas de retenção e o novo backup incremental disponível no Barman 1.4.0. Concluímos este tutorial com um caso de uso realista, com os seguintes requisitos:
- um backup todas as noites à 1h
- a possibilidade de realizar uma recuperação pontual para qualquer momento da última semana
- sempre ter pelo menos um backup disponível
- informar um erro via
barman check
caso o backup mais recente tenha mais de uma semana - ativando o backup incremental para economizar espaço em disco
Usamos o
arquivo
Puppet recurso para criar um .pgpass
arquivo com os parâmetros de conexão e um cron
recurso para gerar o trabalho para ser executado todas as noites. Por fim, editamos o barman::server
para adicionar os parâmetros Barman necessários. O resultado final é:
node backup { class { 'barman': manage_package_repo => true, } barman::server {'test-server': conninfo => 'user=postgres host=192.168.56.221', ssh_command => 'ssh [email protected]', 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 [email protected]:/var/lib/barman/test-server/incoming/%f'; } } |
Conclusão
Com 51 linhas do manifesto Puppet conseguimos configurar um par de servidores PostgreSQL/Barman com configurações semelhantes às que poderíamos desejar em um servidor de produção. Combinamos as vantagens de ter um servidor Barman para fazer backups com as de ter uma infraestrutura gerenciada por Puppet, reutilizável e versionável.
No próximo e último post desta série de artigos veremos como usar um Puppet Master para exportar recursos entre diferentes máquinas, permitindo assim que as VMs troquem os parâmetros necessários para o correto funcionamento através do
barman::autoconfigure class tornando todo o processo de configuração mais fácil.