Skip to content

centos

Instalando o PuppetDB e integrando ao PuppetServer e ao PuppetExplorer e PuppetBoard no Ubuntu Server 14.04/16.04, Debian 8, Red Hat 6 e 7 e CentOS 6 e 7

Aviso:

Este tutorial foi escrito para ensinar a montar um servidor Puppet usando os pacotes Puppet-Server e PuppetDB (da PuppetLabs), PuppetExplorer (da Spotify) e PuppetBoard. Este ambiente usa pacotes do Puppet 4.x.

Se você ainda não sabe o que é Puppet, como funciona e para que serve, sugiro parar por aqui e começar a estudar os links que estão nesta página: http://blog.aeciopires.com/primeiros-passos-com-o-puppet

 

Os tutoriais de instalação do Puppet-Server podem ser encontrados nas páginas abaixo. A leitura e implementação deles é requisito para a continuação deste tutorial.

No Debian 8 e Ubuntu Server 14.04/16.04:
http://blog.aeciopires.com/configurando-um-ambiente-puppet

No CentOS 6/7 e Red Hat 6/7:
http://blog.aeciopires.com/configurando-um-ambiente-puppet-2

Instalando o PostgreSQL no PuppetServer

 

Antes de iniciar a instalação do PuppetDB, instale o PostgreSQL 9.5 com os comandos abaixo.

No CentOS/RedHat 6 64 bits:

rpm -ivh --force https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/pgdg-redhat95-9.5-2.noarch.rpm
yum -y install postgresql95-server postgresql95-contrib
service postgresql-9.5 initdb
chkconfig postgresql-9.5 on 

No CentOS/RedHat 7 64 bits:

rpm -ivh --force https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-redhat95-9.5-2.noarch.rpm
yum -y install postgresql95-server postgresql95-contrib
/usr/pgsql-9.5/bin/postgresql95-setup initdb
service postgresql-9.5 start
chkconfig postgresql-9.5 on 

No Debian 8:

su -
echo "deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main" > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get -y install postgresql-9.5

No Ubuntu Server 14.04:

sudo su
echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get -y install postgresql-9.5

No Ubuntu Server 16.04:

echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt update
apt -y install postgresql-9.5

Edite o arquivo /etc/postgresql/9.5/main/pg_hba.conf (no Debian/Ubuntu) ou /var/lib/pgsql/9.5/data/pg_hba.conf (no CentOS/Red Hat) e configure o arquivo como mostrado abaixo.

Antes:

local     all       postgres      peer 
local     all       all          peer 
host     all      127.0.0.1/32  md5 
host     all      ::1/128           md5 

Depois:

local     all       postgres         trust 
local     all       all             trust 
host    all       127.0.0.1/32     trust 
host     all      ::1/128               trust 

 Outro arquivo que precisa ser editado é o /etc/postgresql/9.5/main/postgresql.conf (no Debian/Ubuntu) ou /var/lib/pgsql/9.5/data/postgresql.conf (no CentOS/Red Hat) conforme mostrado abaixo.

Antes:

#listen_addresses = 'localhost'
port = 5432

Depois:

listen_addresses = 'localhost'
port = 5432

 Depois de alterar estes arquivos é preciso reiniciar o PostgreSQL para aplicar as configurações realizadas. Faça isso usando o comando abaixo.

No Debian/Ubuntu:

service postgresql restart

No CentOS/Red Hat:

service postgresql-9.5 restart

Agora crie o banco de dados e usuário para o puppetdb com a sequencia de comandos abaixo.

su postgres
createdb puppetdb
createuser -a -d -E -P puppetdb
exit

Opcionalmente, a instalação do PostgreSQL e a criação do banco de dados, pode ser realizado usando o módulo Puppet puppetlabs-postgresql https://forge.puppetlabs.com/puppetlabs/postgresql.

Fonte:
https://www.postgresql.org/download/linux/ubuntu
https://www.postgresql.org/download/linux/debian
https://www.postgresql.org/download/linux/redhat
http://yum.postgresql.org/repopackages.php

Instalando o PuppetDB no PuppetServer

Assumindo que você já instalou o PuppetServer, o Puppet-Agent e o PostgreSQL usando os tutoriais e comandos indicados nas seções anteriores, instale o PuppetDB com o comando abaixo.

puppet resource package puppetdb ensure=latest

Fonte:
https://docs.puppet.com/puppetdb/4.1/install_from_packages.html

Configurando a integração do PuppetDB com PostgreSQL

No servidor PuppetServer, edite o arquivo /etc/puppetlabs/puppetdb/conf.d/database.ini e altere as seguinte linhas:

[database]
 classname = org.postgresql.Driver
 subprotocol = postgresql
 subname = //localhost:5432/puppetdb
 username = puppetdb
 password = SENHA-DO-USUARIO-PUPPETDB

 

OBS.: A porta padrão do PostgreSQL é 5432/TCP e ela foi configurada na seção anterior.

Agora edite o arquivo /etc/puppetlabs/puppetdb/conf.d/jetty.ini e altere os parâmetros abaixo para deixá-los com os valores mostrados em negrito.

[jetty]
 host = 0.0.0.0
 port = 8080
 ssl-host = 0.0.0.0
 ssl-port = 8081

Execute o comando abaixo para gerar os certificados a serem usados pelo PuppetDB e configurar o arquivo jetty.ini.

puppetdb ssl-setup

Reinicie o PuppetDB com o comando abaixo:

service puppetdb restart

Fonte:

https://docs.puppet.com/puppetdb/latest/configure.html

Configurando a integração do PuppetServer com o PuppetDB

Ainda no servidor PuppetServer, instale o pacote puppetdb-termini com o comando abaixo.

puppet resource package puppetdb-termini ensure=latest

Crie o arquivo /etc/puppetlabs/puppet/puppetdb.conf e adicione o seguinte conteúdo:

[main]
 server_urls = https://puppetserver.domain.com.br:8081

Edite o arquivo /etc/puppetlabs/puppet/puppet.conf e adicione o seguinte conteúdo na seção [master].

storeconfigs = true
storeconfigs_backend = puppetdb
reports = store,puppetdb
reportstore = /var/log/puppetlabs/puppet

Crie o arquivo /etc/puppetlabs/puppet/routes.yaml com o seguinte conteúdo:

---
 master:
   facts:
     terminus: puppetdb
     cache: yaml

Atribua as permissões corretas ao arquivo com o comando abaixo:

chown -R puppet:puppet `puppet config print confdir`

Reinicie o PuppetServer com o comando abaixo:

service puppetserver restart

Os arquivos de log do PuppetDB ficam em: /var/log/puppetlabs/puppetdb/

O PuppetDB ficará acessível em: http://puppetserver.domain.com.br:8080 ou https://puppetserver.domain.com.br:8081

perf-dash-large

OBS.: Se não conseguir acessar a interface web do PuppetDB, verifique se há algum firewall bloqueando a porta.

No CentOS/Red Hat 6, você pode desabilitar o firewall seguindo estas instruções: http://www.cyberciti.biz/faq/fedora-redhat-centos-5-6-disable-firewall

No CentOS/Red Hat 7, você pode desabilitar o firewall seguindo estas instruções: http://www.liquidweb.com/kb/how-to-stop-and-disable-firewalld-on-centos-7

Você também pode precisar desabilitar o SELinux no CentOS/RedHat. Siga estas instruções: http://www.revsys.com/writings/quicktips/turn-off-selinux.html ou http://aruljohn.com/info/centos-selinux/

Fonte:
https://docs.puppet.com/puppetdb/4.1/connect_puppet_master.html

Instalando o PuppetExplorer

Os módulos Puppet de instalação do PuppetExplorer e dependências podem ser instalados no Puppet-Server usando os comandos abaixo.

puppet module install puppetlabs-apache
puppet module install puppetlabs-apt
puppet module install spotify-puppetexplorer 

Agora edite o aquivo /etc/puppetlabs/code/environments/production/manifests/site.pp e adicione o seguinte conteúdo:

node puppetserver.domain.com.br {
   class {'::puppetexplorer':
     vhost_options => {
       rewrites  => [ { rewrite_rule => ['^/api/metrics/v1/mbeans/puppetlabs.puppetdb.query.population:type=default,name=(.*)$  https://puppetserver.domain.com.br:8081/api/metrics/v1/mbeans/puppetlabs.puppetdb.population:name=$1 [R=301,L]'] } ] }
     }
}

Agora execute o comando abaixo.

puppet agent -t

Ao final da instalação, o PuppetExplorer ficará acessível em: https://puppetserver.domain.com.br

events

OBS.: O módulo de instalação do PuppetExplorer foi declarado passando o recurso vhost_options, afim de corrigir um bug no PuppetExplorer devido a uma atualização realizada no PuppetDB. Veja o report em: https://github.com/spotify/puppetexplorer/issues/49 normalmente, o PuppetExplorer deveria ser instalado apenas usando a declaração abaixo no arquivo site.pp.

node puppetserver.domain.com.br {
   include puppetexplorer
 }

Fonte:
https://groups.google.com/forum/#!topic/puppet-users/VDywEgW2Y54
https://forge.puppet.com/spotify/puppetexplorer
https://github.com/spotify/puppetexplorer

Instalando o PuppetBoard

Se você não quiser usar o PuppetExplorer, pode usar o PuppetBoard.

Os módulos Puppet de instalação do PuppetBoard e dependẽncias podem ser instalados no Puppet-Server usando os comandos abaixo.

puppet module install puppetlabs-apache
puppet module install puppetlabs-apt
puppet module install puppet-puppetboard 

Agora edite o aquivo /etc/puppetlabs/code/environments/production/manifests/site.pp e adicione o seguinte conteúdo:

node puppetserver.domain.com.br {
   class {'apache':
     default_vhost    => false,
     server_signature => 'Off',
     server_tokens    => 'Prod',
     trace_enable     => 'Off',
   }

   #Definindo a porta padrao do HTTP
   apache::listen { '80': }
   class { 'apache::mod::ssl':
     ssl_cipher    => 'HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1:!TLSv1.1',
     ssl_protocol  => [ 'all', '-SSLv2', '-SSLv3', '-TLSv1', '-TLSv1.1' ],
   }

   #Configure Apache on this server
   class { 'apache::mod::wsgi':
     wsgi_socket_prefix => '/var/run/wsgi',
   }

   #Configure Puppetboard
   class { 'puppetboard':
     manage_git          => 'latest',
     manage_virtualenv   => 'latest',
     reports_count       => 50
   }->
  python::pip { 'Flask':
    virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }->
  python::pip { 'Flask-WTF':
    virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }->
  python::pip { 'WTForms':
    virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }->
  python::pip { 'pypuppetdb':
    virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }

   #Configure Access Puppetboard
   class { 'puppetboard::apache::vhost':
     vhost_name => 'puppetserver.domain.com.br',
     port       => 443,
     ssl        => true,
   }
}

Agora execute o comando abaixo.

puppet agent -t

Ao final da instalação, o PuppetBoard ficará acessível em: https://puppetserver.domain.com.br

overview

 

É possível que você enfrente o problema abaixo na instalação do PuppetBoard no CentOS/Red Hat 7.

Erro:

Execution of '/usr/bin/rpm -e python-devel-2.7.5-34.el7.x86_64' returned 1: error: Failed dependencies:
python2-devel is needed by (installed) python-virtualenv-1.10.1-2.el7.noarch
Error: /Stage[main]/Python::Install/Package[python-dev]/ensure: change from 2.7.5-34.el7 to absent failed: Execution of '/usr/bin/rpm -e python-devel-2.7.5-34.el7.x86_64' returned 1: error: Failed dependencies:
python2-devel is needed by (installed) python-virtualenv-1.10.1-2.el7.noarch

Solução:

Edite o arquivo /etc/puppetlabs/code/environments/production/modules/python/manifests/install.pp. Altere todas as ocorrências de:

package { 'python-dev':
ensure => $dev_ensure,
name => $pythondev,
}

Para:

package { 'python-dev':
ensure => present,
#ensure => $dev_ensure,
name => $pythondev,
}

Depois execute:

puppet agent -t

Fonte:
https://forge.puppet.com/puppet/puppetboard

Configurando os Agentes Puppet

Em cada máquina que executa o Puppet-Agent, adicione no arquivo /etc/puppetlabs/puppet/puppet.conf o seguinte conteúdo:

[agent]
 report = true

Reinicie o Puppet-Agent com o comando abaixo:

service puppet restart

Opcional: instalando o PuppetBoard e PuppetExplorer através do projeto PCP

Alguns membros da comunidade Puppet-BR, desenvolveram o projeto PCP que facilita a criação de um servidor PuppetServer, PuppetDB com PuppetExplorer e PuppetBoard em uma VM gerenciada pelo Vagrant.

Para mais informações acesse: https://gitlab.com/puppet-br/pcp

OBS.: O PCP não é recomendado para ser usado em ambientes de produção. É indicado apenas em ambientes de desenvolvimento e testes com Puppet.

Cluster Ativo/Passivo com PostgreSQL 9.3, Red Hat 6, pcs, Pacemaker, Corosync e DRBD

Introdução

Para a execução deste tutorial foram criadas duas máquinas virtuais com as configurações abaixo.
  • Processador: 1 vCPU com clock acima de 2.0 GHz.
  • Memória: 1 GB.
  • HD1: 50 GB (com duas partições: / de 42 GB e swap de 8 GB).
  • HD2: 20 GB (mas este não foi configurado durante a instalação do S.O).
  • 2 placas de rede.
  • S.O: Red Hat 6.8 64 bits com idioma em Inglês-US (UTF-8).

Cada VM possui duas placas de rede, mas apenas uma das placas de rede de cada VM foi configurada com IP fixo (também pode ser usado IPs distribuídos pelo serviço DHCP, desde que os IPs sejam associados ao MAC de uma placa de rede de cada VM).

As VMs são identificadas da seguinte forma:
  • db1.domain.com.br: 10.0.0.1/24 na interface eth0
  • db2.domain.com.br: 10.0.0.2/24 na interface eth0

Estas informações foram adicionadas no arquivo /etc/hosts de cada máquina. Veja o ambiente do cluster na figura abaixo.

cluster_db2

 

 

Após a instalação do S.O, é necessário que ele esteja registrado para poder acessar os repositórios oficiais da Red Hat. Veja nesta página como registrar o sistema: https://access.redhat.com/documentation/en-US/Red_Hat_Network_Satellite/5.3/html/Reference_Guide/ch-register.html

Também foi configurado a autenticação via par de chaves RSA para o usuário root de cada máquina acessar a outra via SSH sem senha. Aqui está o tutorial: https://goo.gl/NdLkD4

Instalação dos pacotes

Aviso: Os passos abaixo devem ser executados nas duas máquinas.

1- Crie o arquivo /etc/yum.repos.d/centos.repo e adicione o seguinte conteúdo.

[centos-6-base]
name=CentOS-$releasever
Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.globo.com/centos/6.8/os/x86_64/
enabled=1

2- Execute os comandos abaixo para adicionar repositórios extras e autenticá-los.
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import http://mirror.globo.com/centos/6.8/os/x86_64/RPM-GPG-KEY-CentOS-6
rpm -ivh https://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-2.noarch.rpm

3- Execute o comando abaixo para instalar os pacotes que usaremos ao longo do tutorial.

yum -y install pacemaker cman pcs ccs resource-agents ntsysv kmod-drbd84 drbd84-utils postgresql93-contrib postgresql93 postgresql93-server

Cada nó terá os seguintes componentes de software, a fim de trabalhar como membro do o cluster HA (High-availability).

Pacemaker => É um gestor de recursos do cluster, que executa scripts no momento em que os nós do cluster são inicializados ou desligados ou quando os recursos relacionados falham. Além disso, pode ser configurado para verificar periodicamente o estado de cada nó do cluster. Em outras palavras, o pacemaker será encarregado de dar a partida e parada dos serviços (como um servidor web ou de banco de dados, para citar um exemplo clássico) e irá implementar a lógica para garantir que todos os serviços necessários estão rodando em apenas um local, ao mesmo tempo a fim de evitar a corrupção de dados.

Corosync: Trata-se de um serviço de mensagens que irá fornecer um canal de comunicação entre os nós do cluster. Ele é essencial e funciona como um marca-passo que checa a disponibilidade de cada nó.

PCS: É uma ferramenta de configuração do corosync e pacemaker que permite a visualização, edição e criação de clusters. Ele é opcional, mas é bom instalá-lo para ajudar na configuração do Cluster.

Desabilitando o Selinux e Iptables

Como este tutorial tem objetivo apenas de criar um ambiente de teste, desabilite o SELinux e o Iptables para não interferir na comunicação dos nodes do cluster e na configuração dos serviços.

Instruções para desabilitar o SELinux:https://goo.gl/4McGVw
Instruções para parar o Iptables:http://goo.gl/uE3PP9

Configurando os dois nós do cluster para sincronizar a configuração

OBS.: Durante a execução dos comandos, deve ser utilizado o usuário root ou outro que possa executado o comando sudo.

Em cada máquina virtual foram executados os comandos abaixo, para iniciar o serviço pcsd e definir uma senha para o usuário hacluster, que será usado futuramente para sincronizar a configuração do cluster nas duas VMs. A senha do usuário hacluster deve ser a mesma em cada máquina.
service pcsd start
passwd hacluster

Adicionando os nós do cluster


Na VM db1, foram executados os comandos abaixo para adicionar os nós do cluster.
pcs cluster auth db1 db2
pcs cluster setup --name cluster-db db1 db2
pcs cluster start --all

OBS.: Durante a execução dos comandos será solicitado o login e senha do usuário hacluster

Os comandos abaixo configuram algumas das propriedades principais do cluster.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
pcs resource defaults migration-threshold=1
Em máquinas virtuais não dá para usar o STONITH (Shoot    The    Other    Node    In The    Head), que um dispositivo responsável por  evitar que dois nós ou membros de um cluster atuem como nó primário em um cluster do tipo HA. Isso ajuda a evitar a corrupção de dados. Este dispositivo “chuta” o nó slave para ser o prímario, quando há uma falha no nó master atual. Por isso no primeiro comando acima, ele foi desabilitado. O Fence é um processo de isolamento, ou a separação, de um nó do cluster ao usar os recursos ou iniciar serviços. Ele ajuda a evitar que um nó com defeito execute os recursos de cluster. Em alguns casos, se um nó do cluster parar de responder, o mesmo deve ser colocado como offline antes de outro nó assumir a execução dos recursos. O fence também é um mecanismo do STONITH.

 

O segundo comando acima evita que os recursos sejam iniciados em mais nós do que o desejado. É usado quando você tem um cluster com vários pares de nós (veja http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/_perform_a_failover.html). Neste tutorial, a política de quorum foi desabilitada.

 

Já o terceiro comando acima, indica quantas falhas o cluster irá esperar que aconteça em um nó para mover os recursos para o próximo nó online.

 

Os comandos abaixo devem ser executados nas duas VMs para verificar o status do corosync e demais serviços do cluster.
corosync-cfgtool -s 
corosync-cpgtool
pcs status
Inicie os serviços dos cluster das duas máquinas.
service pcsd start
service corosync start
service cman start
service pacemaker start

Configure os serviços para serem inicializados no boot do S.O das duas máquinas

chkconfig pcsd on
chkconfig cman on
chkconfig pacemaker on
chkconfig corosync on

Visualizando a configuração do cluster

Quando quiser visualizar a configuração do cluster, use o comando abaixo.

pcs config

Comando para remoção da configuração do cluster

Se precisa remover a configuração do cluster, use os comandos abaixo nas duas VMs.

pcs cluster stop --force
pcs cluster destroy

Adicionando o IP do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar o IP do cluster.

pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.1 cidr_netmask=24 nic=eth1 op monitor interval=10s
Com o comando acima será atribuído o IP 192.168.0.1/24 na interface de rede eth1 (das duas máquinas) e o recurso ClusterIP será monitorado a cada 10s.
Este IP será automaticamente configurado apenas em uma das máquinas por vez. Por padrão, apenas a máquina MASTER conterá o IP definido acima na segunda placa de rede (identificada no Red Hat 6 como eth1). Se o db1 ficar indisponível, este IP será configurado na máquina db2. Quando o master voltar ao normal, o IP continuará no db2 e só será migrado para o db1 em caso de problema no db2.
 

Execute o comando abaixo para visualizar a configuração.

ifconfig

Testando a migração do IP do cluster para a máquina db2. Na máquina db1 execute:

pcs cluster stop db1 --force

Na máquina db2, execute o comando abaixo para visualizar a configuração.

ifconfig

Na máquina db1, inicie o cluster.

pcs cluster start db1

Novamente execute o comando abaixo para visualizar a configuração.

ifconfig

Adicionando uma rota de saída do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar a rota do cluster. É por essa rota que o cluster irá se comunicar com os hosts das demais redes.

pcs resource create DefRoute ocf:heartbeat:Route destination=default device=eth1 gateway=192.168.0.1 op monitor interval=10s

Adicionando um grupo de recursos

Para evitar que os recursos ClusterIP e DefRoute sejam iniciados em máquinas diferentes do cluster, podemos criar um grupo de recursos e incluí-los de forma que os dois sejam iniciados na mesma máquina. Para fazer isto, use os comandos abaixo:

pcs resource group add ClusterGrupoRecursos ClusterIP DefRoute
pcs resource manage ClusterIP DefRoute

Listando, atualizando e removendo um recurso

Se precisar listar os recursos ativos do cluster, use o comando abaixo.

pcs resource show
Se precisar atualizar um recurso. Use a opção update do comando pcs resource. Exemplo, o comando abaixo altera o IP do cluster.
 
pcs resource update ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.75 cidr_netmask=24 nic=eth1 op monitor interval=10s

Se precisar remover um recurso do cluster, use o comando abaixo.

pcs resource delete NOMERECURSO
pcs resource cleanup NOMERECURSO

Se precisar ver a inicialização de um recurso no modo debug (depuração), use o comando abaixo:

pcs resource debug-start NOMERECURSO --full

Fonte: http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/#ap-lsb

Se precisar consultar a lista de agentes do heartbeat, pacemaker ou LSB para configurar um recurso do cluster, use os comandos abaixo.

pcs resource agents ocf:heartbeat
pcs resource agents ocf:pacemaker
pcs resource agents lsb:

Configurando o DRBD nas duas máquinas

Os pacotes do DRBD já foram instalados no início do tutorial.

As duas VMs já possuem um segundo disco de 20 GB e que não foi usado durante a instalação. Esses discos serão usados pelo serviço DRBD para sincronizar os dados. O DRBD atuará como um cluster Ativo > Passivo. Os dados serão gravados apenas na máquina ativa do cluster. Na máquina passiva os dados serão sincronizados e o disco ficará apenas no modo leitura. O disco a ser usado pelo DRBD será montado no sistema como /database com o sistema de arquivos ext4 e será usado pelo PostgreSQL para armazenar os arquivos dos bancos de dados.

Em cada máquina, crie o arquivo /etc/drbd.d/disk_database.res com o conteúdo abaixo para configurar um recurso no DRBD que usará o disco disponível identificado no S.O como /dev/sdb1.

resource disk_database {
 protocol C;
 meta-disk internal;
 device /dev/drbd1;
 syncer {
   verify-alg sha1;
 }
 net {
   allow-two-primaries;
 }
 on db1 {
   disk   /dev/sdb;
   address  10.0.0.1:7789;
 }
 on db2 {
   disk   /dev/sdb;
   address  10.0.0.2:7789;
 }
}

O disco /dev/drdb1, configurado acima, é o disco DRBD que abstraí o uso do disco /dev/sdb1 de cada máquina.

Em cada máquina, ative o uso do recurso com os comandos abaixo.

drbdadm create-md disk_database
modprobe drbd
drbdadm up disk_database

Na máquina db1, force-a para ser o nó primário do DRBD.

drbdadm primary --force disk_database
Visualize a sincronização dos discos com o comandos abaixo.
 
 cat /proc/drbd
 A sincronização demorará alguns minutos.

Quando terminar a sincronização dos discos, execute o comando abaixo na máquina db1 para formatá-lo com o sistema de arquivos ext4.

mkfs.ext4 /dev/drbd1
Na máquina db1, teste o uso do disco /dev/drbd1.
 
mkdir /database
mount /dev/drbd1 /database
ls /database
mkdir /database/teste
touch /database/teste/a.txt

Configurando o DRBD para ser gerenciado pelo cluster

Na máquina db1, execute os comandos abaixo para configurar o recurso DRBD disk_database (configurado no arquivo /etc/drbd.d/disk_database.res) para ser gerenciado pelo Cluster.

pcs cluster cib drbd_cfg
pcs -f drbd_cfg resource create DBData ocf:linbit:drbd \
 drbd_resource=disk_database op monitor interval=60s
pcs -f drbd_cfg resource master DBDataClone DBData \
 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

Execute o comando abaixo para visualizar a configuração do recurso.

pcs -f drbd_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push drbd_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status

Habilite nas duas máquinas, o carregamento do módulo drbd no boot do S.O.

echo drbd > /etc/modprobe.d/drbd.conf

Configurando o Postgresql

O PostgreSQL já foi instalado no início do tutorial. Configure-o para usar o disco /dev/drbd1 montado na máquina db1 no diretório /database.
mkdir -p /database/pgsql
chown -R postgres:postgres /database/
chmod -R 0700 /database/
sudo -u postgres /usr/pgsql-9.3/bin/initdb -D /database/pgsql
Edite o script de inicialização do PostgreSQL, localizado em /etc/init.d/postgresql-9.3. No script mude apenas as variáveis citadas para conter os valores abaixo. Antes de editar o script, faça um backup do mesmo.
 
PGPORT=5433
PGDATA=/database/pgsql/
PGLOG=/database/pgsql/pgstartup.log
PGUPLOG=/database/pgsql/pgupgrade.log
Salve as alterações e copie-o para a máquina db2.
scp /etc/init.d/postgresql-9.3 root@db2:/etc/init.d/postgresql-9.3

Configurando recurso Postgresql no cluster

Na máquina db1, execute o comando abaixo para criar o recurso Postgresql que irá inicializar o serviço na máquina ativa do cluster, usando o script /etc/init.d/postgresql-9.3 (representado no comando abaixo por lsb:postgresql-9.3). É importante lembrar que ele não deve ser inicializado junto com o boot do sistema operacional. Apenas o cluster deve inicializá-lo.

pcs resource create Postgresql lsb:postgresql-9.3

Configurando a ordem de inicialização dos recursos no cluster

Configure o cluster para só inicializar o Postgresql depois de configurar o IP, a rota e montar o disco /dev/drbd1 em /database (usando o sistema de arquivos ext4) na máquina ativa. Execute os comandos abaixo apenas na máquina db1, pois a configuração será replicada para o db2.

pcs cluster cib fs_cfg
pcs -f fs_cfg resource create DBFS Filesystem \
 device="/dev/drbd1" directory="/database" fstype="ext4"
pcs -f fs_cfg constraint colocation add DBFS with DBDataClone INFINITY with-rsc-role=Master
pcs -f fs_cfg constraint order promote DBDataClone then start DBFS
pcs -f fs_cfg constraint colocation add ClusterIP with DefRoute INFINITY
pcs -f fs_cfg constraint order ClusterIP then DefRoute
pcs -f fs_cfg constraint colocation add DefRoute with DBFS INFINITY
pcs -f fs_cfg constraint order DefRoute then DBFS
pcs -f fs_cfg constraint colocation add Postgresql with DBFS INFINITY
pcs -f fs_cfg constraint order DBFS then Postgresql

Execute os comandos abaixo para revisar a configuração.

pcs -f fs_cfg constraint
pcs -f fs_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push fs_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status
 
Pronto! Agora é só realizar testes de funcionamento com o cluster.
 
OBS.: Para verificar o funcionamento do PostgreSQL, use o comando abaixo.
 
/etc/init.d/postgresql-9.3 status

Comandos úteis à gerência de configuração do cluster

Comandos para visualizar a configuração do cluster CIB (Cluster Information Base):
pcs cluster cib --config
pcs cluster cib
Comando para backup da configuração do cluster:
pcs config backup cluster_config_$(date +%Y-%m-%d)

Restaurando a configuração do cluster a partir do backup:1) Você precisa parar o serviço de cluster no nó, restaurar a configuração e iniciá-lo depois:

pcs cluster stop node --force
pcs config restore --local  cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Estes comandos restauram a configuração apenas no nó atual.
Para restaurar a configuração em todos os nós, use os comados abaixo.
pcs cluster stop node --force
pcs config restore cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Obtendo o relatório do cluster para análise de incidentes:
pcs cluster report [--from "YYYY-M-D  H:M:S"  [--to  "YYYY-M-D"  H:M:S"]]"  dest
Você também pode voltar a configuração do cluster para um determinado ponto. Para ver os pontos de configuração execute o comando:
pcs config checkpoint
Para visualizar a configuração de determinado ponto, use o comando abaixo:
pcs config  checkpoint view    <checkpoint_number>
Para voltar a usar a configuração de determinado ponto, use o comando:
pcs  config  checkpoint    restore    <checkpoint_number>
Para saber mais detalhes das sintaxes dos comandos e aprender mais sobre o assunto, recomendo a leitura das fontes e livros indicados no tutorial.

Fontes:

Sites:

http://blog.clusterlabs.org/blog/2010/pacemaker-heartbeat-corosync-wtf/

http://www.unixmen.com/configure-drbd-centos-6-5/

http://clusterlabs.org/quickstart-redhat-6.html

http://elrepo.org/tiki/tiki-index.php

http://drbd.linbit.com/en/doc/users-guide-84

http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/pdf/Clusters_from_Scratch/Pacemaker-1.1-Clusters_from_Scratch-en-US.pdf

CRMSH vs PCS: https://github.com/ClusterLabs/pacemaker/blob/master/doc/pcs-crmsh-quick-ref.md

http://www.picoloto.com.br/tag/mkfs-ext4

https://www.vivaolinux.com.br/artigo/Cluster-de-alta-disponibilidade-para-servidores-web-com-Debian-71-Corosync-Pacemaker-DRBD?pagina=1

http://asilva.eti.br/instalar-cluster-high-availbility-no-centos-7-com-pacemaker/

http://clusterlabs.org/quickstart-redhat.html

http://clusterlabs.org/wiki/Install

http://keithtenzer.com/2015/06/22/pacemaker-the-open-source-high-availability-cluster/

http://bigthinkingapplied.com/creating-a-linux-cluster-in-red-hatcentos-7/

https://bigthinkingapplied.com/tag/cluster/

http://www.tokiwinter.com/building-a-highly-available-apache-cluster-on-centos-7/

http://www.cloudera.com/documentation/enterprise/5-4-x/topics/admin_cm_ha_failover.html

http://jensd.be/156/linux/building-a-high-available-failover-cluster-with-pacemaker-corosync-pcs

Documentação Oficial sobre cluster no Red Hat 7:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Overview/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Reference/index.html

Documentação geral do Red Hat 7:

https://access.redhat.com/documentation/en/red-hat-enterprise-linux/7/

Configurando um ambiente Puppet-Server e Puppet-Agent no CentOS 6 e 7/Red Hat 6 e 7

Aviso:

Este tutorial foi atualizado para ensinar a montar o ambiente puppet usando o repositório da PuppetLabs para instalar pacotes do Puppet 4.x.

Se você ainda não sabe o que é Puppet, como funciona e para que serve, sugiro parar por aqui e começar a estudar os links que estão nesta página: http://blog.aeciopires.com/primeiros-passos-com-o-puppet/ ou se quiser instalar o Puppet-Server e o Puppet-Agent no Ubuntu Server 14.04/16.04 ou Debian 8, sugiro ler este tutorial: http://blog.aeciopires.com/configurando-um-ambiente-puppet/

Quando estiver se sentindo seguro no assunto, pode retomar a execução deste tutorial.

Entendendo o ambiente

Continuando… a figura abaixo mostra o ambiente usado para a execução deste tutorial.

arquitetura_puppet

O sistema operacional usado nas máquinas foram: CentOS 6 e 7 64 bits e Red Hat 6 e 7 64 bits. Os comandos mostrados a seguir funcionam nestas duas distribuições GNU/Linux.

Para a implementação do ambiente mostrado acima, foi configurado um servidor DHCP e um servidor DNS. Depois disso, foram criadas três máquinas virtuais para serem usadas pelo Puppet. As configurações de disco, memória e processador para as máquinas virtuais foram:

  • Memória: 768 MB
  • HD: 10 GB
  • Processador: 1 com clock de 2.0 GHz
  • 1 placa de rede

Preparando o ambiente

No servidor DHCP da sua rede, configure um IP e associe-o a cada endereço MAC da placa de rede de cada máquina que será usada.

Exemplos de configuração no arquivo do DHCP no GNU/Linux.

host puppetserver { 
  hardware ethernet 08:00:27:e7:09:48; 
  fixed-address 192.168.0.171; 
 } 
host puppet1 { 
  hardware ethernet 08:00:27:81:d7:5e; 
  fixed-address 192.168.0.172; 
 } 
host puppet2 { 
  hardware ethernet 08:00:27:d0:d9:66; 
  fixed-address 192.168.0.173; 
 }

Exemplos de configuração no arquivo de zona do domínio domain.com.br no Bind9 no GNU/Linux.

puppetserver    IN      A       192.168.0.171 
puppet1         IN      A       192.168.0.172 
puppet2         IN      A       192.168.0.173

Exemplos de configuração no arquivo de zona reversa do domínio domain.com.br no Bind9 no GNU/Linux.

171     IN      PTR     puppetserver.domain.com.br. 
172     IN      PTR     puppet1.domain.com.br. 
173     IN      PTR     puppet2.domain.com.br.

Em cada máquina, configure os nomes de host e de domínio editando os arquivos /etc/hosts, /etc/hostname e /etc/resolv.conf

Exemplos de configuração para cada arquivo

Puppet-Server

/etc/hostname 
 puppetserver.domain.com.br 
/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.171  puppetserver puppetserver.domain.com.br
192.168.0.172  puppet1 puppet1.domain.com.br
192.168.0.173  puppet2 puppet2.domain.com.br
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
/etc/resolv.conf 
 domain domain.com.br 
 search domain.com.br 
 nameserver IP-DNS-SERVER

Puppet-Agent 1

/etc/hostname 
 puppet1.domain.com.br
/etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.171  puppetserver puppetserver.domain.com.br
192.168.0.172  puppet1 puppet1.domain.com.br
192.168.0.173  puppet2 puppet2.domain.com.br
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
/etc/resolv.conf 
 domain domain.com.br 
 search domain.com.br 
 nameserver IP-DNS-SERVER

Puppet-Agent 2

/etc/hostname 
 puppet2.domain.com.br
/etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.171  puppetserver puppetserver.domain.com.br
192.168.0.172  puppet1 puppet1.domain.com.br
192.168.0.173  puppet2 puppet2.domain.com.br
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 /etc/resolv.conf 
 domain domain.com.br 
 search domain.com.br 
 nameserver IP-DNS-SERVER 

Aviso:
Procure manter a hora do sistema de cada máquina corretamente configurada utilizando NTP, para evitar problemas na assinatura de certificados, entre outros.

A porta 8140/TCP do servidor PuppetServer precisa estar acessível para as demais máquinas.

Para a execução deste tutorial, o firewall foi parado em todas as máquinas com os comandos abaixo.

No CentOS/Red Hat 6:

# service iptables save
# service ip6tables save
# service iptables stop
# service ip6tables stop
# chkconfig iptables off
# chkconfig ip6tables off

No CentOS/Red Hat 7:

systemctl stop firewalld
systemctl disable firewalld

Instalando os pacotes

   Adicionando o repositório da PuppetLabs no CentOS 6/Red Hat 6:

su -
yum install -y https://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm
    Adicionando o repositório da PuppetLabs no CentOS 7/Red Hat 7:
su -
yum install -y https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
 Na máquina que terá o Puppet-Server, instale os pacotes abaixo.
 
yum install -y puppet-agent puppetserver
export PATH=/opt/puppetlabs/bin:$PATH

  Nas máquinas que terá o Puppet-Agent, instale o pacote abaixo.

yum -y install puppet-agent
export PATH=/opt/puppetlabs/bin:$PATH

Verifique a versão do Puppet com o comando abaixo.

puppet --version

 

Aviso:

Os binários e libs do Puppet 4.x ficam, por padrão, dentro do diretório /opt/puppetlabs/bin.

Os arquivos de configuração ficam, por padrão, dentro do diretório /etc/puppetlabs/.

Configurando os serviços

  No arquivo /etc/puppetlabs/puppet/puppet.conf de cada máquina (Puppet-Agent), adicione as linhas abaixo e mude o intervalo de tempo (em segundos), que o agente se conectará ao server para atualização do catálogo de manifestos.

Exemplo para a máquina puppet1:

[main]
certname = puppet1.domain.com.br
server = puppetserver.domain.com.br
# intervalo em segundos
runinterval = 60 

Exemplo para a máquina puppet2:

[main]
certname = puppet2.domain.com.br
server = puppetserver.domain.com.br
# intervalo em segundos
runinterval = 60

No arquivo /etc/puppetlabs/puppet/puppet.conf da máquina (Puppet-Server), adicione as linhas abaixo.

Exemplo para a máquina puppetserver:

[master]
vardir = /opt/puppetlabs/server/data/puppetserver
logdir = /var/log/puppetlabs/puppetserver
rundir = /var/run/puppetlabs/puppetserver
pidfile = /var/run/puppetlabs/puppetserver/puppetserver.pid
codedir = /etc/puppetlabs/code

[main]
certname = puppetserver.domain.com.br
server = puppetserver.domain.com.br
#intervalo em segundos
runinterval = 60
strict_variables = true
Altere as configurações de memória do Java a ser usado pelo PuppetServer. Edite o arquivo /etc/sysconfig/puppetserver.
JAVA_ARGS="-Xms256m -Xmx512m"
Com esta configuração, será alocado  512 MB (no máximo) e 256 MB (no mínimo) para  uso exclusivo da JVM (Java Virtual Machine) usada pelo PuppetServer.

Gerando certificados e reiniciando os serviços

Na máquina PuppetServer, gere um certificado e reinicie os serviço com os comandos abaixo.

puppet cert generate puppetserver.domain.com.br
puppet resource service puppetserver ensure=running enable=true

Nas máquinas que possuem o puppet-agent, gere uma solicitação de assinatura de certificado com o comando abaixo.

puppet agent -t

    No servidor Puppet-Server aparecerá a solicitação de assinatura para cada máquina que tem apenas o Puppet-Agent.

puppet cert list 
   "puppet1.domain.com.br" (SHA256) C7:EC:72:6F:82:56:9E:15:C8:42:2D:A7:07:07:B7:B6:AC:41:45:DC:33:BA:09:B5:1A:3D:2C:14:31:32:D7:D4 
   "puppet2.domain.com.br" (SHA256) 49:0D:A2:2B:7E:4B:EE:2E:85:CC:B4:16:F9:C1:56:C8:75:63:0C:EF:C4:0E:96:FA:42:4E:09:32:CB:B2:E1:FF

    Assine cada certificado usando os comandos abaixo.

puppet cert sign puppet1.domain.com.br
puppet cert sign puppet2.domain.com.br

   

Aviso:
As solicitações de assinatura de certificados no Puppet-Server ficam em: /etc/puppetlabs/puppet/ssl/ca/requests/
No Puppet-Agent, os certificados assinados ficam em: /etc/puppetlabs/puppet/ssl/
Se precisar refazer a assinatura de certificados do host puppet-agent é só apagar os arquivos e sub-diretórios que ficam em: /etc/puppetlabs/puppet/ssl/.
Se precisar revogar os certificados assinados de um host cliente (puppet1, por exemplo) no Puppet-Server é só usar o comando: puppet cert clean puppet1.domain.com.br (por exemplo).
O log do puppetserver fica em /var/log/puppetlabs/puppetserver/puppetserver.log e /var/log/puppetlabs/puppetserver/puppetserver-daemon.log
O log do puppet-agent fica em /var/log/messages e /var/log/puppetlabs/puppet

  Agora execute o comando abaixo, em cada máquina (Puppet-Server e Puppet-Agent). Este comando irá iniciar o puppet-agent e habilitá-lo para ser executado após o boot do sistema operacional.

puppet resource service puppet ensure=running enable=true

 

Testando o funcionamento do ambiente

    No servidor PuppetServer, crie o arquivo /etc/puppetlabs/code/environments/production/manifests/site.pp com o conteúdo abaixo.

node "puppet1.domain.com.br" {
  package { 'nmap':
    ensure => present,
  }
}
node "puppet2.domain.com.br" {
  package { 'elinks':
    ensure => present,
  }
}
node "puppetserver.domain.com.br" {
  package { 'tcpdump':
    ensure => present,
  }
}

   Salve o arquivo e execute em todas as máquinas o comando abaixo.

puppet agent -t

  Verifique se pacotes foram realmente instalados conforme a configuração especificada no arquivo site.pp.

  • Na máquina puppet1 deve ser instalado o pacote “nmap”
  • Na máquina puppet2 deve ser instalado o pacote “elinks”
  • Na máquina puppetserver deve ser instalado o pacote “tcpdump”.

Pronto! O ambiente está configurado. Agora é só instalar os módulos e manifestos que você precisa.

Bons estudos!

Fonte:

http://gutocarvalho.net/octopress/2015/08/18/instalando-puppet-4-agent-and-master/

http://blog.aeciopires.com/configurando-um-ambiente-puppet/

http://instruct.com.br/static/apostila-puppet.pdf

http://techarena51.com/index.php/a-simple-way-to-install-and-configure-a-puppet-server-on-linux/

https://puppetlabs.com/blog/puppet-server-bringing-soa-to-a-puppet-master-near-you

https://github.com/puppetlabs/puppet-server/blob/master/documentation/install_from_packages.markdown

https://docs.puppetlabs.com/puppet/latest/reference/config_file_main.html

https://docs.puppetlabs.com/puppet/4.2/reference/install_pre.html

https://docs.puppetlabs.com/puppetserver/2.1/install_from_packages.html

https://docs.puppetlabs.com/puppetdb/latest/connect_puppet_master.html

https://docs.puppetlabs.com/puppet/4.2/reference/install_linux.html

https://docs.puppetlabs.com/puppetserver/2.1/configuration.html