Puppet 5: Instalando o PuppetDB e integrando ao PuppetServer e PuppetBoard no Ubuntu Server 16.04/18.04, Debian 9, CentOS 7 e Red Hat 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 5.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 pelo livro que publiquei pela Novatec https://novatec.com.br/livros/puppet/, pelos 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 9 e Ubuntu Server 16.04/18.04:
http://blog.aeciopires.com/configurando-um-ambiente-puppet-3

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

Instale o PostgreSQL no PuppetServer

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

No CentOS/RedHat 7 64 bits:

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

No Debian 9:

su -
echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-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

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

No Ubuntu Server 18.04:

echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-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

Edite o arquivo /etc/postgresql/*/main/pg_hba.conf (no Debian/Ubuntu) ou /var/lib/pgsql/*/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      all         127.0.0.1/32   md5 
host      all      all         ::1/128        md5 

Depois:

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

 Outro arquivo que precisa ser editado é o /etc/postgresql/*/main/postgresql.conf (no Debian/Ubuntu) ou /var/lib/pgsql/*/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-10 restart

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

su postgres
createdb puppetdb
psql puppetdb
CREATE EXTENSION pg_trgm;
\q
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

Instale 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

Configure 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
puppet resource service puppetdb ensure=running enable=true

Fonte:

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

Configure 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 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

Instale 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        => true,
     manage_virtualenv => true,
     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',
  }->
  python::pip { 'requests':
  virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }->
  python::pip { 'CommonMark':
  virtualenv => '/srv/puppetboard/virtenv-puppetboard',
  }
  #Configure Access Puppetboard 
  class { 'puppetboard::apache::vhost': 
    vhost_name => 'puppetserver.domain.com.br', 
    port       => 80,
  } 
}

Agora execute o comando abaixo.

puppet agent -t

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

overview

 

 

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

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

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

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

Depois::


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

Erro 2: Duplicação no gerenciamento do pacote virtualenv entre os módulos python e puppetboard.

Error: Failed to apply catalog: Cannot alias Package[virtualenv] to ["python-virtualenv", :yum] at 
(file: /etc/puppetlabs/code/environments/production/modules/python/manifests/install.pp, line: 54);
 resource ["Package", "python-virtualenv", :yum] already declared 
(file: /etc/puppetlabs/code/environments/production/modules/puppetboard/manifests/init.pp, line: 269)

Solução: Edite o arquivo /etc/puppetlabs/code/environments/production/modules/python/manifests/install.pp. Comente o trecho de código a seguir.

Antes:

package { 'virtualenv':
 ensure => $venv_ensure,
 require => Package['python'],
}

Depois:


#package { 'virtualenv':
#  ensure  => $venv_ensure,
#  require => Package['python'],
#}

Erro 3: Declaração duplicada da variável report_counts no módulo puppetboard.

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: The parameter 'reports_count' is declared more
than once in the parameter list (file: /etc/puppetlabs/code/environments/production/modules/puppetboard/manifests/init.pp, line: 165, 
column: 3) on node puppetserver.domain.com.br

Solução: Edite o arquivo /etc/puppetlabs/code/environments/production/modules/puppetboard/manifests/init.pp e comente a linha 165 que começa com report_counts, pois está duplicada com a linha 160. Este é um bug do PuppetBoard, que pode ser solucionado em uma nova versão do mesmo.

Depois execute:

puppet agent -t

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

Configure 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
 pluginsync = true

Reinicie o Puppet-Agent com o comando abaixo:

service puppet restart

Opcional: instale o PuppetBoard 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.

Para aprender mais sobre o Puppet, veja o livro que publiquei pela editora Novatec: https://novatec.com.br/livros/puppet/

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *