Puppet


Cos’è Puppet

Puppet è uno strumento di configuration management (gestione della configurazione) che automatizza il provisioning, la configurazione e la gestione dei server.

In pratica, Puppet:

  • definisce lo stato desiderato di un sistema (es. pacchetti installati, servizi attivi, file di configurazione);

  • verifica periodicamente lo stato reale e applica automaticamente le modifiche necessarie per far combaciare realtà e desiderio.


Architettura base

Ci sono due modalità principali:

1. Puppet Master/Agent

  • Puppet Master (Server): contiene le configurazioni (manifest) e le distribuisce ai client.

  • Puppet Agent (Nodo): installato su ogni macchina da gestire, si collega al master, riceve la configurazione e la applica.

2. Puppet Apply (Standalone)

  • Si usa su una singola macchina, senza master.

  • Esegue i manifest direttamente in locale (utile per test o container).


Installazione passo passo (esempio su Ubuntu/Debian)

1. Aggiungere repository Puppet ufficiale

wget https://apt.puppet.com/puppet7-release-$(lsb_release -cs).deb
sudo dpkg -i puppet7-release-$(lsb_release -cs).deb
sudo apt update

2. Installare Puppet Server (sul Master)

sudo apt install puppetserver -y

Verificare:

sudo systemctl enable puppetserver
sudo systemctl start puppetserver

3. Installare Puppet Agent (sui nodi)

sudo apt install puppet-agent -y

Modificare il file /etc/puppetlabs/puppet/puppet.conf sul nodo per indicare il master:

[main]
server = puppetmaster.example.com
certname = nodo1.example.com

Poi avviare l’agente:

sudo systemctl enable puppet
sudo systemctl start puppet

Gestione dei certificati

Quando un agente si collega la prima volta, il Master deve firmare il certificato:

Sul master:

sudo puppetserver ca list
sudo puppetserver ca sign --certname nodo1.example.com

Ora l’agente potrà applicare la configurazione:

sudo puppet agent -t

Esempio di configurazione (Manifest)

I manifest di Puppet hanno estensione .pp e si trovano in /etc/puppetlabs/code/environments/production/manifests.

Esempio: site.pp

node default {
  package { 'nginx':
    ensure => installed,
  }

  service { 'nginx':
    ensure => running,
    enable => true,
  }

  file { '/var/www/html/index.html':
    ensure  => file,
    content => "Server configurato da Puppet!\n",
    mode    => '0644',
  }
}

Questo manifest assicura che:

  • nginx sia installato,

  • il servizio sia avviato e abilitato,

  • la homepage sia presente con il contenuto definito.


Esecuzione in modalità standalone (senza master)

Per testare Puppet rapidamente (per esempio dentro un container Docker):

  1. Installare puppet-agent.

  2. Creare un file manifest.pp:

    package { 'nginx': ensure => installed }
  3. Eseguire:

    sudo /opt/puppetlabs/bin/puppet apply manifest.pp

Puppet installerà automaticamente nginx.


Puppet in Docker (esempio veloce)

Per un laboratorio locale, si può usare un container Puppet master:

docker run --name puppet --hostname puppet -d puppet/puppetserver

Poi si può collegare un agente in un altro container:

docker run --name agent --hostname agent --link puppet:puppet -d puppet/puppet-agent

Integrazione Puppet + Prometheus/Grafana

Prometheus può raccogliere metriche da Puppet:

  • Puppet Server esporta metriche su http://localhost:8140/metrics/v2.

  • Si può configurare Prometheus per leggere questi endpoint e visualizzarli in Grafana.

Esempio di job Prometheus:

- job_name: 'puppetserver'
  static_configs:
    - targets: ['puppet:8140']

Comandi utili Puppet

Comando
Descrizione

puppet agent -t

Esegue immediatamente una sincronizzazione

puppet resource service nginx

Mostra lo stato della risorsa

puppet apply file.pp

Applica un manifest locale

puppetserver ca list

Mostra i certificati in attesa

puppetserver ca sign --certname nodo

Firma un certificato


Riassunto finale

Elemento
Descrizione

Puppet Server

Contiene manifest, moduli e firma certificati

Puppet Agent

Applica la configurazione ricevuta

Manifest

File .pp che descrive lo stato desiderato

Modulo

Raccolta di manifest e file riutilizzabili

Catalogo

Traduzione del manifest per ogni nodo

Report

Stato dell’applicazione delle configurazioni


Si può decidere se:

  • configurare un ambiente completo Puppet Master + Agent (in VM o Docker),

  • oppure provare la versione standalone (puppet apply) per imparare la sintassi e testare moduli.


ESERCITAZIONE :

Procediamo con la configurazione passo-passo di un laboratorio Puppet completo in Docker: avremo 1 Puppet Server (Master) e 2 Agent, tutti in rete privata Docker.


Obiettivo del laboratorio

Alla fine si avrà:

Servizio
Container
Porta
Ruolo

Puppet Server

puppet

8140

Master

Agent 1

agent1

Client gestito

Agent 2

agent2

Client gestito


Struttura dei file

Creare una cartella chiamata puppet-lab:

puppet-lab/
└─ docker-compose.yml

File docker-compose.yml

Copiare questo contenuto:

version: "3.8"

services:
  puppet:
    image: puppet/puppetserver:latest
    container_name: puppet
    hostname: puppet
    environment:
      - PUPPETSERVER_JAVA_ARGS=-Xms512m -Xmx512m
    ports:
      - "8140:8140"
    networks:
      - puppetnet

  agent1:
    image: puppet/puppet-agent:latest
    container_name: agent1
    hostname: agent1
    depends_on:
      - puppet
    command: >
      bash -c "
        sleep 10 &&
        /opt/puppetlabs/bin/puppet config set server puppet &&
        /opt/puppetlabs/bin/puppet config set certname agent1 &&
        /opt/puppetlabs/bin/puppet agent -t --waitforcert 60
      "
    networks:
      - puppetnet

  agent2:
    image: puppet/puppet-agent:latest
    container_name: agent2
    hostname: agent2
    depends_on:
      - puppet
    command: >
      bash -c "
        sleep 10 &&
        /opt/puppetlabs/bin/puppet config set server puppet &&
        /opt/puppetlabs/bin/puppet config set certname agent2 &&
        /opt/puppetlabs/bin/puppet agent -t --waitforcert 60
      "
    networks:
      - puppetnet

networks:
  puppetnet:
    driver: bridge

Avvio del laboratorio

Eseguire nella cartella puppet-lab:

docker-compose up -d

Controllare che i container siano partiti:

docker ps


Firma dei certificati

I due agent si connetteranno al master e chiederanno di essere autenticati. Entrare nel container del master:

docker exec -it puppet bash

Verificare le richieste pendenti:

puppetserver ca list

Firmare i certificati:

puppetserver ca sign --certname agent1
puppetserver ca sign --certname agent2

Controllare che siano stati firmati:

puppetserver ca list --all

Creare un semplice Manifest

Nel container puppet, modificare il manifest principale:

vi /etc/puppetlabs/code/environments/production/manifests/site.pp

E incollare:

node default {
  file { '/tmp/puppet-test.txt':
    ensure  => file,
    content => "Questo file è stato creato da Puppet!\n",
  }
}

Salvare e uscire.


Applicare la configurazione sugli agenti

Ora da ogni agente, forzare la sincronizzazione:

docker exec -it agent1 /opt/puppetlabs/bin/puppet agent -t
docker exec -it agent2 /opt/puppetlabs/bin/puppet agent -t

Dovresti vedere output tipo:

Notice: /Stage[main]/Main/File[/tmp/puppet-test.txt]/ensure: created
Notice: Applied catalog in X.XX seconds

Verifica dentro un agente:

docker exec -it agent1 cat /tmp/puppet-test.txt

Output:

Questo file è stato creato da Puppet!

Funziona! Ora il Master distribuisce configurazioni agli agenti in automatico.


Step
Azione

1️⃣

Creazione del docker-compose.yml

2️⃣

Avvio dei container (docker-compose up -d)

3️⃣

Firma dei certificati sul master

4️⃣

Creazione del manifest site.pp

5️⃣

Esecuzione degli agenti (puppet agent -t)

6️⃣

Verifica del file creato


Per test più avanzati

Puoi poi:

  • creare nodi specifici nel manifest (node 'agent1' { ... });

  • installare pacchetti con Puppet:

    package { 'nginx': ensure => installed }
  • gestire servizi:

    service { 'nginx': ensure => running, enable => true }
  • aggiungere moduli (es. puppet module install puppetlabs-apache).


Last updated