Instalando Puppet Agent 4 e Puppet Master 4 em CentOS 7 (v1.5)

Este é o primeiro post que escrevo sobre o Puppet 4, a ideia aqui é demonstrar a instalação e a configuração mínima para você ter um Puppet Agent e Puppet Server do Puppet 4.2 rodando na mesma VM.

Este post é resultado de um dia de hacklab que fiz com o Miguel Filho (@mciurcio).

1. Cenário do HackLab

O hacklab foi realizado no cenário abaixo:

Macbook Pro 11.1
- OSX 10.11 (El Capitan)
  - VAGRANT 1.7.4
    - BOX CentOS 7 da Puppet Labs 
  - VIRTUALBOX 5.0

2. Configurando Vagrant

Crie um diretório para seu projeto

$ mkdir -p ~/vagrant/projects/puppet4
$ cd ~/vagrant/projects/puppet4

Adicione a box ao vagrant

$ vagrant box add —-name centos7x64 https://atlas.hashicorp.com/puppetlabs/boxes/centos-7.0-64-puppet/versions/1.0.2/providers/virtualbox.box

Crie o arquivo Vagrantfile dentro do diretório do projeto

$ pwd
~/vagrant/projects/puppet4
$ vim Vagrantfile 

Adicione o conteúdo abaixo ao arquivo

# -*- mode: ruby -*-

# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
		config.vm.hostname = "puppetserver4.hacklab"
		config.vm.box = "centos7x64"
		config.vm.network "private_network", ip: "192.168.200.88"

		config.vm.provider "virtualbox" do |virtualbox|
			virtualbox.customize [ "modifyvm", :id, "--cpus", "2" ]
			virtualbox.customize [ "modifyvm", :id, "--memory", "4096" ]
	   end
end

Salve

:wq

Agora inicie a VM

$ vagrant up

Acesse a VM

$ vagrant ssh
[vagrant@puppetserver4 ~]$ sudo -i
[root@puppetserver4 ~]#

Pronto, agora podemos começar.

3. Instalando Repositório

3.1 Repositório

Instale o repositório da puppetlabs para o puppet 4

[root@puppetserver4 ~]# yum install http://yum.puppetlabs.com/el/7/PC1/x86_64/puppetlabs-release-pc1-0.9.2-1.el7.noarch.rpm -y

4. Instalando Agent

4.1 Removendo Puppet Agent 3

Remova o puppet 3 que vem na box

[root@puppetserver4 ~]# yum remove puppet -y

4.2 Pesquisando por pacotes

Pesquise por pacotes Puppet

[root@puppetserver4 ~]# yum search puppet

A saída da busca deve ser similar a esta

puppet-agent.x86_64 : The Puppet Agent package contains all of the elements needed to run puppet, including ruby,
                    : facter, hiera and mcollective.
puppetdb.noarch : Puppet Labs - puppetdb
puppetdb-termini.noarch : Termini for puppetdb
puppetdb-terminus.noarch : Metapackage to allow easy upgrades from PuppetDB 2
puppetlabs-release-pc1.noarch : Release packages for the Puppet Labs PC1 repository
puppetserver.noarch : Puppet Labs - puppetserver

Se viu uma saída similar, isto significa que a instalação do repositório teve sucesso.

4.3 Configurando Hosts

Ajuste o endereço localhost em s eu arquivo hosts

[root@puppetserver4 ~]# echo "127.0.0.1 localhost localhost.localdomain" > /etc/hosts

Ajuste o endereço do servidor puppet

[root@puppetserver4 ~]# echo "192.168.200.88 puppetserver4.hacklab puppetserver4 puppet" >> /etc/hosts

4.4 Configurando Hostname

Vamos ajustar hostname do OS para gerar certificados mais adiante

[root@puppetserver4 ~]# echo "puppetserver4.hacklab" > /etc/hostname

Por default o certificados do agente tem o mesmo nome do conteúdo desse arquivo.

4.5 Instalando Puppet Agent 1.2.2 do Puppet 4.2

Instale puppet agent 1.2.2

[root@puppetserver4 ~]# yum install puppet-agent -y

4.6 Ajustando Path para binários

Teste o puppet agent

[root@puppetserver4 ~]# puppet
-bash: puppet: command not found

Corrija o path para utilizar os recursos do Puppet 4.2

[root@puppetserver4 ~]# echo "export PATH=/opt/puppetlabs/bin:$PATH" > /etc/profile.d/puppet_path.sh
[root@puppetserver4 ~]# source /etc/profile.d/puppet_path.sh

4.7 Corrigindo locales

Após definir o path rode o puppet

[root@puppetserver4 ~]# puppet

Você provavelmente vai receber esta saída

terminate called after throwing an instance of 'std::runtime_error' what():  locale::facet::_S_create_c_locale name not valid
Aborted

Defina o valor para a variável LC_ALL globalmente para resolver isto até que o bug seja corrijido.

[root@puppetserver4 ~]# echo "export LC_ALL=en_US.UTF-8" > /etc/profile.d/puppet_locale.sh

Carregue a configuração de locale

[root@puppetserver4 ~]# source /etc/profile.d/puppet_locale.sh

Teste novamente

[root@puppetserver4 ~]# puppet --version
4.2.1

Há um ticket aberto para corrigir o problema, vote e acompanhe.

https://tickets.puppetlabs.com/browse/SERVER-779

4.8 Testando o novo facter

Verificando informações de uptime

[root@puppetserver4 production]# facter system_uptime
{
  days => 0,
  hours => 0,
  seconds => 2546,
  uptime => "0:42 hours"
}

Verificando informações de ruby

[root@puppetserver4 production]# facter ruby
{
  platform => "x86_64-linux",
  sitedir => "/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.1.0",
  version => "2.1.6"
}

Verificando informações de OS

[root@puppetserver4 production]# facter os
{
  architecture => "x86_64",
  family => "RedHat",
  hardware => "x86_64",
  name => "CentOS",
  release => {
    full => "7.0.1406",
    major => "7",
    minor => "0"
  },
  selinux => {
    enabled => false
  }
}

Verificando informações de load average

[root@puppetserver4 production]# facter load_averages
load_averages => {
  15m => 0.09,
  1m => 0.09,
  5m => 0.07
}

Verificando informações de networking

[root@puppetserver4 production]# facter networking
{
  dhcp => "10.0.2.2",
  domain => "hacklab",
  fqdn => "puppetserver4.hacklab",
  hostname => "puppetserver4",
  interfaces => {
    enp0s3 => {
      dhcp => "10.0.2.2",
      ip => "10.0.2.15",
      ip6 => "fe80::a00:27ff:fe19:cd16",
      mac => "08:00:27:19:cd:16",
      mtu => 1500,
      netmask => "255.255.255.0",
      netmask6 => "ffff:ffff:ffff:ffff::",
      network => "10.0.2.0",
      network6 => "fe80::"
    },
    enp0s8 => {
      dhcp => "192.168.56.100",
      ip => "192.168.200.88",
      ip6 => "fe80::a00:27ff:fe7a:5943",
      mac => "08:00:27:7a:59:43",
      mtu => 1500,
      netmask => "255.255.255.0",
      netmask6 => "ffff:ffff:ffff:ffff::",
      network => "192.168.200.0",
      network6 => "fe80::"
    },
    lo => {
      ip => "127.0.0.1",
      ip6 => "::1",
      mtu => 65536,
      netmask => "255.0.0.0",
      netmask6 => "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
      network => "127.0.0.0",
      network6 => "::1"
    }
  },
  ip => "10.0.2.15",
  ip6 => "fe80::a00:27ff:fe19:cd16",
  mac => "08:00:27:19:cd:16",
  mtu => 1500,
  netmask => "255.255.255.0",
  netmask6 => "ffff:ffff:ffff:ffff::",
  network => "10.0.2.0",
  network6 => "fe80::"
}

Veja que puppet 4 já usa novo facter (projeto cfacter), esse novo facter traz todos os fatos de forma estruturada e organizada, permitindo um uso muito mais simples dessas informações em nossos manifests.

Se voce quer referenciar o fato fqdn do agrupamento networking faça isso

[root@puppetserver4 production]# facter networking.fqdn

Se voce quer referenciar o mesmo fato em um manifest faça assim

$::networking['fqdn']

4.9 Novos Paths

Agora o puppet é instalado em modo AIO (all in one), isto significa que ele é um pacote único que já traz tudo o que você precisa, incluindo ai neste pacote binários, libs, confs, é tudo independente do OS. E tem um novo diretório também

/opt/puppetlabs

As configurações ficam em

/etc/puppetlabs
/etc/puppetlabs/puppet
/etc/puppetlabs/mcollective

Agora o mcollective já vem junto no pacote como parte integrante e permanente do agente.

5 Puppet Server

5.1 Instalando o pacote

Agora vamos instalar o Puppet Server novo

[root@puppetserver4 ~]# yum install puppetserver -y

5.2 Gerando certificados

Antes de iniciar o Puppet Server, rode o comando abaixo para gerar os certificados, os certificados deveriam ser gerados na inicialização do serviço, mas no momento isto não está ocorrendo, então você vai gerá-los com os comandos abaixo

[root@puppetserver4 ~]# puppet cert list -a
[root@puppetserver4 ~]# puppet cert generate puppetserver4.hacklab --dns_alt_names=puppet

A saída esperada é esta

Notice: puppetserver4.hacklab has a waiting certificate request
Notice: Signed certificate request for puppetserver4.hacklab
Notice: Removing file Puppet::SSL::CertificateRequest puppetserver4.hacklab at '/etc/puppetlabs/puppet/ssl/ca/requests/puppetserver4.hacklab.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppetserver4.hacklab at '/etc/puppetlabs/puppet/ssl/certificate_requests/puppetserver4.hacklab.pem'

Há um ticket aberto para corrigir o problema, vote e acompanhe.

https://tickets.puppetlabs.com/browse/SERVER-528

5.3 Parametrização JVM

Veja os parâmetros de memória da JVM, ajuste conforme sua necessidade

[root@puppetserver4 ~]# cat /etc/sysconfig/puppetserver|grep JAVA_ARGS
JAVA_ARGS="-Xms2g -Xmx2g -XX:MaxPermSize=256m"

5.4 Parametrização do Systemd

Dependendo do HW de sua VM e da quantidade de recursos, o serviço puppetserver pode demorar a subir, o systemd tem um timeout padrão que pode ser atingido antes do puppetserver iniciar, se isto acontecer o próprio systemd mata o processo, para resolver isto temos que aumentar esse timeout default do systemd.

echo "START_TIMEOUT=300" >> /etc/sysconfig/puppetserver

Inicie o puppet server (isto pode demorar)

[root@puppetserver4 ~]# systemctl start puppetserver

Verifique se o processo subiu

[root@puppetserver4 ~]# ps afxwww|grep java

A saída esperada será similar a esta

 3277 ?        Ssl    0:53 /usr/bin/java -Xms2g -Xmx2g -XX:MaxPermSize=256m -XX:OnOutOfMemoryError=kill -9 %p -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/puppetlabs/puppetserver -Djava.security.egd=/dev/urandom -cp /opt/puppetlabs/server/apps/puppetserver/puppet-server-release.jar clojure.main -m puppetlabs.trapperkeeper.main --config /etc/puppetlabs/puppetserver/conf.d -b /etc/puppetlabs/puppetserver/bootstrap.cfg

Há um ticket aberto para corrigir o problema, vote e acompanhe.

 https://tickets.puppetlabs.com/browse/SERVER-557   

5.5 Ajustando o puppet.conf

Edite o arquivo puppet.conf

[root@puppetserver4 ~]# yum install vim -y
[root@puppetserver4 ~]# vim /etc/puppetlabs/puppet/puppet.conf

Adicione a configuração abaixo no puppet.conf ao final do arquivo

[agent]
certname = puppet4server.hacklab

Salve

:wq!

Essa configuração se faz necessária para o agente não regerar o certificado caso algo no /etc/hostname mude, isso poderia quebrar o master e o agent.

5.6 Testando Puppet Server

Uma vez que temos o Puppet Agent e Server instalados, podemos agora empurrar uma configuração para validar o ambiente, vale informar que o diretório dos environments mudou para

 /etc/puppetlabs/code/environments

Verifque o fato fqdn

[root@puppetserver4 puppetlabs]# facter networking.fqdn
 puppetserver4.hacklab

Agora crie uma configuração simples

[root@puppetserver4 ~]# vim /etc/puppetlabs/code/environments/production/manifests/site.pp

Adicione o conteúdo abaixo

node "puppetserver4.hacklab" {

  package { 'nmap':
    ensure => present,
  }

  notify { "O FQDN desta VM eh ${::networking['fqdn']}": }

}

Salve

:wq

Rode o agente

[root@puppetserver4 puppetlabs]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetserver4.hacklab
Info: Applying configuration version '1440097652'
Notice: /Stage[main]/Main/Node[puppetserver4.hacklab]/Package[nmap]/ensure: created
Notice: O FQDN desta VM eh puppetserver4.hacklab
Notice: /Stage[main]/Main/Node[puppetserver4.hacklab]/Notify[O FQDN desta VM eh puppetserver4.hacklab]/message: defined 'message' as 'O FQDN desta VM eh puppetserver4.hacklab'
Notice: Applied catalog in 4.74 seconds

6. Amarrando as pontas

Você empurrou uma configuração com sucesso utilizando Puppet Server/Agent do Puppet 4.2 e já utilizou um fato - em hash - do novo cfacter.

Esse post foi direto ao ponto, há muito ainda para ler, ver, estudar, aprender e compartilhar.

Bons estudos!

[s]
Guto