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