Puppet 6: Instalando o PuppetDB e integrando ao PuppetServer e PuppetBoard no Ubuntu Server 18.04, Debian 9, CentOS/Red Hat 7

Aviso:

Este tutorial foi escrito para ensinar a montar um servidor Puppet usando os pacotes Puppet-Server e PuppetDB (da PuppetLabs) e PuppetBoard. Este ambiente usa pacotes do Puppet 6.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 18.04:
http://blog.aeciopires.com/configurando-um-ambiente-puppet-5

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

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

cd /tmp
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://puppet.com/docs/puppetdb/6.0/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]
 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

Por padrão, o PuppetDB usa 192 MB de memória RAM. Isso é suficiente para o ambiente de teste, mas se precisar alterar esta quantidade de memória, edite o arquivo /etc/default/puppetdb (no Debian/Ubuntu) ou /etc/sysconfig/puppetdb (no CentOS/Red Hat) e altere o valor na linha iniciado por JAVA_ARGS. Veja mais detalhes em: https://puppet.com/docs/puppetdb/6.0/configure.html#configuring-the-java-heap-size

Reinicie o PuppetDB e habilite-o para ser iniciado junto com o boot do Sistema Operacional 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 = puppetdb

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 e o PuppetDB com os comandos abaixo:

service puppetdb restart
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://puppet.com/docs/puppetdb/lastest/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. Este problema foi reportado à equipe de desenvolvimento no ticket #225.

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. Este problema já foi reportado à equipe de desenvolvimento no ticket #224.

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

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

10 comentários em “Puppet 6: Instalando o PuppetDB e integrando ao PuppetServer e PuppetBoard no Ubuntu Server 18.04, Debian 9, CentOS/Red Hat 7

  • Aecio, parabéns pela documentação, levantei os serviços como descreviam os passos indicados por você porém na hora que criei o arquivo route.yaml deu pau no meu puppet, ao verificar os logs constatei que esse arquivo é criado automaticamente pelo puppet e se criarmos ele dá erro ao reiniciarmos o serviço.

  • Boa noite, Leonardo! Muito obrigado pelo feedback. 🙂

    A criação do arquivo route.yaml deve ser uma novidade dos builds mais recentes do Puppet 6. Obrigado pelo aviso, eu vou testar novamente e atualizar o tutorial.

    Abraço e fica com Deus.

  • Boa tarde.

    Fiz todo o procedimento conforme o blog porem aqui não funcionou somente a parte do Puppet Board.

    O acesso ao site fica com 500 internal server Error.

    Tentei fazer as soluções ja conhecidas ensinadas aqui mas não funcionou 🙁

    Ja viu algo parecido?

  • Boa noite, Bruno! Eu não entendi exatamente o que não funcionou para subir o PuppetBoard… pode ser mais específico? Qual distro GNU/Linux e versão está usando? Qual versão do Puppet instalou? Olhou os logs dos serviços para tentar identificar a causa do problema? Qual a mensagem exata do erro? Tentou entender o que o erro diz?

    Este tutorial foi escrito há mais de 1 ano e de lá para cá o Puppet e os demais softwares tem evoluído, mas o Puppet Board é um projeto à parte que tem um ritmo de evolução diferente… pode ser que o tutorial precise ser ajustado, mas para isso preciso saber a causa do problema para tentar simular e ajustar.

    Abraço e fica com Deus.

  • Boa tarde Aécio muito obrigado pela atenção e pela resposta.
    Tentei com todas as distros do tutorial e o sintoma é o mesmo.

    Até a instalação do PuppetDB esta tudo ok, e o mesmo fica perfeitamente acessível conforme o procedimento.

    Porem ao seguir para o Puppet Board o mesmo finaliza a instalação sem erros, mas ao acessar o site na web, o navegador da a o error 500.

    Estou refazendo o procedimento para pegas os logs por completo.

  • Montei novamente o senário
    SO Debian 9 Puppet 6
    1 – Erro observado Puppet DB esta acessivel somente hoa HTTP na porta 8080, nao abre por HTTPS na porta 8081

    2 – após a instalação do puppet board o erro no navegador é o abaixo
    /**
    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at[no address given] to inform them of the time this error occurred,and the actions you performed just before this error.

    More information about this error may be available in the server error log

    **/

    Nos los aparecem abaixo:
    tail -f /var/log/apache2/srv03.geek.lab_access.log
    /**
    [Sat Feb 01 17:17:00.365979 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] mod_wsgi (pid=10103): Failed to exec Python script file ‘/srv/puppetboard/puppetboard/wsgi.py’.
    [Sat Feb 01 17:17:00.366039 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] mod_wsgi (pid=10103): Exception occurred processing WSGI script ‘/srv/puppetboard/puppetboard/wsgi.py’.
    [Sat Feb 01 17:17:00.366062 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] Traceback (most recent call last):
    [Sat Feb 01 17:17:00.366081 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] File “/srv/puppetboard/puppetboard/wsgi.py”, line 15, in
    [Sat Feb 01 17:17:00.366106 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] from puppetboard.app import app as application
    [Sat Feb 01 17:17:00.366119 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] File “/srv/puppetboard/puppetboard/puppetboard/app.py”, line 5, in
    [Sat Feb 01 17:17:00.366136 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] from urllib.parse import unquote, unquote_plus, quote_plus
    [Sat Feb 01 17:17:00.366192 2020] [wsgi:error] [pid 10103:tid 139902053619456] [remote 10.10.10.2:63280] ImportError: No module named parse
    **/

    Tentei resolver o erro que aparentemente é dependencia do mod_wsgi mas nao consegui ainda 🙁

  • Bom dia.

    Tive o mesmo erro, olhei no fórum indicado, porém não consegui resolver. Estou utilizando as mesmas versões to tutorial.
    Estou utilizando o CentoOS7. Poderia me auxiliar ?

  • Boa noite, Leandro!

    Já tem quase dois anos que não atuo com o Puppet, tenho focado em outras tecnologias… mas eu vou criar uma VM e executar o tutorial para tentar entender o problema e propor uma possível solução.

    Paralelo a isso, eu sugiro você pedir ajuda a outras pessoas na comunidade Puppet-BR, olha essa thread https://groups.google.com/forum/#!topic/puppet-users-br/mgwFCUD56kA

    Tem também a comunidade internacional de usuários Puppet em um ou mais canais listados nesta página: https://puppet.com/community/

    Abraço.

  • Boa noite.

    Agradeço a atenção desde já.

    Estou pesquisando para ver se acho alguma solução, tentando montar uma maquina zerada pra ver se pode ser alguma configuração que eu errei.

    Abraço

Deixe um comentário

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