Puppet – Vamos instalar um servidor de puppet?

Bom dia a todos,

Continuando o nosso primero post sobre puppet, chegamos finalmente à altura de meter a mão na passa. Vamos instalar o nosso primeiro servidor de puppet.
Disclaimer: Este install é para RPM based distros. Para outros flavours, o procedimento é semelhante, mas utilizando o package manager da distro.

Puppet (software) - Wikipedia

 

Componente servidor:

Em primeiro lugar, instalar a componente server do software em si:

sudo yum install puppetserver

Em segundo lugar, é necessário configurarmos o nosso novo puppet server:

Abram o file/etc/puppetlabs/puppet/puppet.conf com o vim ou com um editor de texto da vossa escola e adicionem as seguintes linhas ao arquivo:

[master]
dns_alt_names = puppet.example.com # substituam pelo fqdn do vosso servidor.
ssl_client_header = SSL_CLIENT_S_DN 
ssl_client_verify_header = SSL_CLIENT_VERIFY
[main]
certname = puppetserver.example.com # substituam pelo fqdn do vosso servidor.
server = puppetserver.example.com # substituam pelo fqdn do vosso servidor.
environment = production

Gravem o ficheiro, e saiam do editor de texto.

Em seguida iniciem o serviço do nosso puppet server:

sudo systemctl start puppetserver

E configurem o mesmo  para iniciar automaticamente no arranque:

sudo systemctl enable puppetserver

Abram as portas do firewall para o Puppet:

sudo firewall-cmd --add-port=8140/tcp --permanent
sudo firewall-cmd --reload


How to Install Puppet Master and Slave in RHEL-Based Systems

Configurando os nossos clientes:

Agora que temos a componente de servidor instalada, podemos agora configurar os clientes puppet.

sudo yum install puppet-agent

É necessário igualmente configurarmos os nossos clientes. A semelhança do que foi feito no capitulo anterior abram o ficheiro /etc/puppetlabs/puppet/puppet.conf com o vosso editor de texto favorito e adicionem as seguintes linhas ao arquivo:

[main]
server = puppet.example.com # substituam pelo fqdn do vosso servidor
certname = client1.example.com # substituam pelo fqdn do vosso cliente / agente
server = puppetserver.example.com 
environment = production # substituam pelo fqdn do vosso servidor

Gravem e fechem o arquivo.

Inicie o serviço do Puppet Agent:

sudo systemctl start puppet

É necessário depois configurar o serviço de puppet agent para iniciar automaticamente no arranque:

sudo systemctl enable puppet

E abrir as portas do firewall para o agente de puppet:

sudo firewall-cmd --add-port=8140/tcp --permanent
sudo firewall-cmd --reload

Nota: podem e devem repetir os comandos acima por todos os clientes puppet que irão ser geridos pelo servidor instalado no primeiro capitulo.

Testando a ligação entre agentes e servidor.

Assumindo que todos os pré-requisitos de conectividade estão garantidos, e que os daemons clientes e servidor estão iniciados, no nosso servidor puppet, executem o seguinte comando para listar todos os agentes conectados:

sudo puppetserver ca list

A nossa lista irá estar vazia, pelo que  em cada um dos clientes puppet, executem o seguinte comando nos clientes para solicitar um certificado:

sudo puppet agent --test

Isto irá causar um pedido de autenticação ao servidor de puppet e como não existe um certificado válido e presente, o servidor iniciará um processo de onboarding automático.
Claro que este processo não é totalmente dumb e irá necessitar de passos de aprovação para o cliente efetivamente conseguir receber código desde o puppet server.

Em seguida e caso concordem com a adição do novo cliente ao vosso servidor de puppet, executem o seguinte comando para aprovar o certificado:

sudo puppetserver ca sign --certname <nome_do_cliente>

No cliente Puppet, execute novamente o seguinte comando para iniciar a configuração:

sudo puppet agent --test

Estes passos deverão configurar corretamente o servidor puppet e os vossos clientes puppet.

Observem que, ao executar o comando sudo puppet agent –test, o cliente enviará uma solicitação ao servidor Puppet para obter as configurações atuais e aplicá-las. Se fizerm alterações na configuração do Puppet, precisará executar esse comando novamente para aplicar as alterações.

Ainda sobre configurações:

Agora que temos todos os nossos clientes e o server a falar puppet entre si, temos que observar o código, ou como o puppet irá executar através do nosso datacenter.
A localização do nosso código, molulos, etc, é configurado dentro do ficheiro /etc/puppetlabs/puppet/puppet.conf  no nosso  servidor de puppet, e a seção [master] deve ser configurada para especificar as configurações do servidor.

Deixo aqui alguns exemplos de configurações que podem ser definidas nesta secção:

  • dns_alt_names: especifica uma lista separada por vírgulas de nomes de domínio alternativos para o servidor Puppet. Isto é muito útil se o nosso servidor servidor for acedido através  de um nome de domínio diferente do nome do host. Por exemplo: dns_alt_names = puppet.example.com, puppet.
  • reports: Especifica um ou mais tipos de relatórios que devem vão ser gerados pelo servidor Puppet. Por exemplo, para gerar relatórios no formato YAML e enviar para um servidor de relatórios, você pode definir: reports = yaml, my_report_server.
  • certname: especifica o nome do certificado do servidor Puppet. Por padrão, o certificado é gerado a partir do nome do host do servidor, mas pode-se definir manualmente um nome alternativo. Por exemplo: certname = puppet.example.com.
  • modulepath: Especifica uma lista separada por vírgulas de diretórios onde os módulos Puppet podem ser encontrados (recordam-se no post anterior a nossa conversa sobre a forge?). Por norma, o Puppet procura por módulos em /etc/puppetlabs/code/environments/production/modules, mas podem adicionar outros diretórios aqui, se necessário.
    Por exemplo: modulepath = /etc/puppetlabs/code/environments/production/modules:/usr/share/puppet/modules.

E em relação ao nosso código? Como é executado?

Quando instalamos puppet em ambiente servidor, ele procura o código a executar no diretório /etc/puppetlabs/code no host servidor.
Dentro deste diretório, existem vários subdiretórios que contêm os diferentes componentes do seu código Puppet:

  • environments: Este diretório contém subdiretórios para cada ambiente no qual nos iremos gerir o código do Puppet em si. O ambiente padrão é denominado produção (production), mas podemos criar ambientes adicionais conforme necessário. Cada diretório de ambiente contém seu próprio conjunto de manifestos, módulos e outros snippets de código ou ficheiros.
  • manifests: Este diretório contém os manifestos do site, que são o ponto de entrada para o nosso código puppet. Por convenção, o arquivo de manifesto do site principal é denominado site.pp, mas podemos configurar o Puppet para usar um nome de arquivo diferente, se for este o nosso desejo.
  • modules: Este diretório contém os módulos Puppet que criamos ou descarregarmos do Puppet Forge. Cada módulo deve ter seu próprio subdiretório dentro do diretório modules, e o subdiretório deve ter o mesmo nome do módulo.

Quando o puppet é inicializado, ele lê o arquivo site.pp no ​​diretório de manifestos para determinar como irá configurar o sistema. Esse arquivo geralmente inclui definições de nó, que especificam a configuração de cada sistema gerenciado pelo Puppet. Essas definições de nó podem incluir referências a um ou mais módulos Puppet, que são armazenados no diretório de módulos.

E assim chegamos ao fim deste artigo de como configurar um servidor de puppet para orquestração do nosso datacenter. No próximo iremos construir código que servirá para configurar automaticamente os dns servers nos nossos clientes, e definir um como servidor web e pela definição, instalar automaticamente o pacote apache nele.

Até lá, se tiverem duvidas sabem onde me encontrar.

Um abraço,
Nuno