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):
Installare
puppet-agent
.Creare un file
manifest.pp
:package { 'nginx': ensure => installed }
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
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
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 :
Obiettivo del laboratorio
Alla fine si avrà:
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
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
Dovresti vedere puppet
, agent1
, agent2
.
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.
Riepilogo
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