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