Alisson Machado
04 November 2016

Puppet Agent e Server

Atualmente na área de T.I. tudo é DevOps e ferramentas de gerência de configuração são um pré-requisito para quem quer entrar para esse mundo, sendo assim nas linhas abaixo vou mostrar como é possível criar um servidor puppet master e um servidor node com o puppet agent para fazer a gerência de configuração. A primeira coisa a se fazer é a instalação do puppet master, o meu servidor master possui a seguinte configuração:
root@puppetmaster:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.4 LTS
Release:	14.04
Codename:	trusty
Não esquece que o puppet precisa estar com os dns configurados, no meu caso vou configurar através do /etc/hosts, sendo assim ficará da seguinte maneira:
vim /etc/hosts

10.100.0.147 puppetmaster.alissonmachado.com.br
10.100.0.132 node1.alissonmachado.com.br

Para instalar digite os seguintes comandos:
root@puppetmaster:~# apt-get clean all
root@puppetmaster:~# apt-get update
root@puppetmaster:~# apt-get -f install puppet -y
Em muitos tutoriais é baixado o arquivo .deb do puppet direto do repositório da puppetlabs com o seguinte comando:
root@puppetmaster:~# wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
e depois instalado da seguinte maneira:
root@puppetmaster:~# dpkg -i puppetlabs-release-trusty.deb
root@puppetmaster:~# apt-get update
root@puppetmaster:~# apt-get -f install puppet
Porém eu instalei direto do repositório tanto do Ubuntu 14.05 e do Debian 8.6 e ambos funcionaram normalmente. É uma boa prática após a instalação executar o seguinte comando:
root@puppetmaster:~# rm -rf /var/lib/puppet/ssl
Nesse diretório ficam guardados os certificados do puppet e durante a instalação pode ter sido gerado um certificado com hostname errado ou algo do tipo, sendo assim apagamos. Após isso é necessário definir o hostname do seu servidor master no arquivo do puppet, então execute o seguinte comando:
root@puppetmaster:~# vim /etc/puppet/puppet.conf
Esse é o arquivo de configuração do puppet, o arquivo é basicamente padrão, caso a sua versão do puppet seja menor que 3.8 provavelmente existirá uma tinha chamada templatedir=$confidir/templates, essa configuração já está depreciada sendo assim essa linha pode ser removida, caso a versão seja 3.8 ou acima ela não deve existir. No lugar dessa linha adicione duas linhas:
certname = puppetmaster
dns_alt_names = puppetmaster,puppetmaster.alissonmachado.com.br
Agora gere o certificado do seu servidor:
root@puppetmaster:~# puppet master --verbose
Agora para validar se o certificado já foi gerado e assinado você pode executar o seguinte comando:
root@puppetmaster:~# puppet cert list --all
Tudo certo com o Master, agora vamos instalar o agent. Essa é a configuração do meu agent:
root@node1:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.6 (jessie)
Release:	8.6
Codename:	jessie
Instalando o puppet:
root@puppetmaster:~# apt-get clean all
root@puppetmaster:~# apt-get update
root@puppetmaster:~# apt-get -f install puppet -y
Uma vez instalado você deve fazer com que o agent do puppet inicie sozinho durante o boot da máquina, para fazer isso você precisa criar o seguinte arquivo:
root@node1:~# vim  /etc/default/puppet 
E adicione o seguinte conteúdo: START=yes Agora é preciso alterar o arquivo de configuração do puppet:
root@node1:~# vim  /etc/puppet/puppet.conf
Dentro do arquivo você terá uma seção dessa maneira:
[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
Toda ela pode ser apagada e adicione o seguinte conteúdo:
[agent]
server = puppetmaster.alissonmachado.com.br
Agora você precisa gerar um certificado para esse node também, execute os seguintes comandos:
root@node1:~# rm -rf /var/lib/puppet/ssl
root@node1:~# puppet agent --enable
root@node1:~# puppet agent --test --server puppetmaster.alissonmachado.com.br

Info: Creating a new SSL key for node1.alissonmachado.com.br
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for node1.alissonmachado.com.br
Info: Certificate Request fingerprint (SHA256): B6:73:95:CF:58:97:98:0C:8C:97:DD:88:FD:82:C0:D3:F2:6B:2B:CE:25:77:F6:D6:16:91:20:1A:FF:69:B8:59
Info: Caching certificate for node1.alissonmachado.com.br
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for node1.alissonmachado.com.br
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for node1.alissonmachado.com.br
Info: Applying configuration version '147828151
De acordo com o log que apareceu na tela a chave foi gerada com sucesso e agora ela precisa ser aceita pelo servidor. Agora volte no puppet master e veja se a máquina está pendente com o seguinte comando:
root@puppetmaster:~# puppet cert list --all
E para aceitar o novo node utilize o seguinte comando:
root@puppetmaster:~# puppet cert sign node1.alissonmachado.com.br
Uma vez aceito, volte no servidor node1 e rode o seguinte comando:
root@node1:~# puppet agent --test

Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for node1.alissonmachado.com.br
Info: Applying configuration version '1478281511'
Se a saída for parecida com a mensagem acima está tudo funcionando corretamente. As vezes acontece do puppet reclamar de certificado inválido, não bate com o hostname da máquina ou alguma coisa assim. Se isso acontecer o certificado deve ser apagado com os seguintes comandos:
root@node1:~# find /var/lib/puppet/ssl -name node1.alissonmachado.com.br.pem -delete
root@node1:~# rm -rf /var/lib/puppet/ssl/
Eu coloquei os comandos de forma redundante pois quando o puppet da esse problema as vezes ele busca uns certificados que só ele sabe onde. Agora que foram removidos os certificados o node precisa ser removido do puppet master.
root@puppetmaster:~# puppet cert clean node1.alissonmachado.com.br
Agora volte no node1 e rode o comando de novo:
root@node1:~# puppet agent --test --server puppetmaster.alissonmachado.com.br
E repita todo o processo de ir no master e aceitar o node e assim por diante. Agora criando um Manifest só para testar. Vá no puppetmaster e execute os seguintes comando:
root@puppetmaster:~# cd /etc/puppet/manifests/
root@puppetmaster:~# vim apache.pp
Dentro do apache.pp adicione o seguinte conteúdo:
node "node1.alissonmachado.com.br"{
        package { "apache2":
                  ensure=>installed,
                }
        ->
        service { "apache2":
                   ensure=> "running",
                   enable => true
                }

}
Salve o arquivo, volte no servidor node1 e execute a instrução:
root@node1:~# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for node1.alissonmachado.com.br
Info: Applying configuration version '1478284402'

Notice: /Stage[main]/Main/Node[node1.alissonmachado.com.br]/Package[apache2]/ensure: ensure changed 'purged' to 'present'
Notice: Finished catalog run in 22.12 seconds
Essa saída mostra que o apache foi instalado com sucesso. Com relação ao manifest, eu defini a ordem dos recursos utilizando o operador -> pois era o mais rápido pra fazer o exemplo mas existem outros como: require,notify,subscribe e mais, porém isso fica pro próximo post. Valeu \o