Puppet è un software per la gestione della configurazione delle macchine client e server.
Esiste una versione enterprise di Puppet ed una versione open source.
Puppet funziona tramite un agent che viene installato sulle macchine e che periodicamente (di default ogni 30 minuti) applica le configurazioni distribuite dal server per mezzo di cataloghi.
I cataloghi sono composti da classi scritte in un “declarative language” specifico di Puppet.
Le classi sono raggruppate in moduli. È possibile scaricare dei moduli open source da Puppet Forge oppure sviluppare i propri tramite Puppet PDK.
All’interno di ogni classe vengono dichiarate delle risorse e lo stato di quest’ultime.
Le risorse possono essere di diversa natura ed in base al tipo di risorsa vengono intraprese diverse azioni dall’agent per mantenere lo stato richiesto.
ARCHITETTURA
Per la seguente installazione verranno utilizzati tre containers LXC uno per Puppet server, uno per PuppetDB e uno per il database PostgreSQL.
È possibile installare i due componenti di Puppet e il DB su un unico server, in base alle necessità, tuttavia la configurazione presa in considerazione in questa guida permette una maggiore scalabilità.
Tutti i container sono stati installati con Debian 11.
Se è necessario che Puppet server venga esposto su internet, si consiglia di collocare il container 01.puppet.pizza.it in DMZ.
PORTE UTILIZZATE
01.puppet.pizza.it:
TCP/8140 HTTPS Puppet server
puppetdb01.pizza.local: TCP/8140 HTTPS PuppetDB
pgsql.pizza.local: TCP/5432 PostgreSQL
FLUSSI DA ABILITARE
pgsql.pizza.local -> 01.puppet.pizza.it: TCP/8140
puppetdb01.pizza.local -> 01.puppet.pizza.it: TCP/8140
puppetdb01.pizza.local -> pgsql.pizza.local: TCP/5432
01.puppet.pizza.it -> puppetdb01.pizza.local: TCP/8140
INSTALLAZIONE
Collegarsi all’host 01.puppet.pizza.local.
Aggiornare il sistema operativo con i seguenti comandi:
0
1
2
|
apt update
apt upgrade -y
apt autoremove -y
|
Modificare l’entry relativa al localhost nel file hosts:
0 |
127.0.0.1 puppet.pizza.it 01.puppet.pizza.it ca.puppet.pizza.it puppet localhost
|
Aggiungere nel file hosts (in alternativa è possibile usare il DNS):
0 |
<ip_puppetdb> puppetdb.pizza.local
|
INSTALLAZIONE DI PUPPET SERVER
Aggiungere le repository di Puppet
0
1
2
3
|
cd /dev/shm
wget https://apt.puppet.com/puppet7-release-bullseye.deb
dpkg -i puppet7-release-bullseye.deb
apt update
|
Installare il pacchetto Puppet Server con il comando:
0 |
apt install puppetserver -y
|
Decidere quanta memoria allocare per il server.
Ref: Puppet Site
Modificare in /etc/default/puppetserver i seguenti parametri:
Decommentare le seguenti righe in /etc/puppetlabs/puppetserver/conf.d/puppetserver.conf
Modificare la seguente riga in /etc/puppetlabs/puppetserver/conf.d/ca.conf
Aggiungere in /etc/puppetlabs/puppet/puppet.conf il seguente output:
0
1
2
3
4
5
|
[main]
certname = 01.puppet.pizza.it
server = puppet.pizza.it
ca_name = ca.puppet.pizza.it
ca_server = ca.puppet.pizza.it
dns_alt_names = puppet.pizza.it,ca.puppet.pizza.it,puppet
|
Configurare la CA ed il catalogo del nodo di default con i seguenti comandi in sequenza:
0
1
2
3
|
/opt/puppetlabs/bin/puppetserver ca setup
echo -e "# Default node class (mandatory)\nnode default {\n}" > /etc/puppetlabs/code/environments/production/manifests/default.pp
systemctl start puppetserver.service
systemctl enable puppetserver.service
|
Successivamente sarà necessario configurare PostgreSQL e PuppetDB.
Verrà utilizzato un modulo open source, scaricato da Puppet Forge, per installare PostgreSQL e configurare PuppetDB.
INSTALLAZIONE DI PUPPETDB
Collegarsi agli host pgsql.pizza.local e puppetdb01.pizza.local
Aggiornare il sistema operativo con i seguenti comandi:
0
1
2
|
apt update
apt upgrade -y
apt autoremove -y
|
Aggiungere le repository di Puppet con i seguenti comandi:
0
1
2
3
|
cd /dev/shm
wget https://apt.puppet.com/puppet7-release-bullseye.deb
dpkg -i puppet7-release-bullseye.deb
apt update
|
Installare il Puppet agent con il comando:
0 |
apt install puppet-agent
|
Aggiungere nel file hosts (in alternativa è possibile usare il DNS):
0 |
<ip_puppetserver> puppet.pizza.it ca.puppet.pizza.it
|
Collegarsi all’host pgsql.pizza.local ed aggiungere al file /etc/puppetlabs/puppet/puppet.conf il seguente output:
0
1
2
3
4
5
|
[main]
certname = pgsql.pizza.local
server = puppet.pizza.it
ca_server = ca.puppet.pizza.it
dns_alt_names = pgsqlvip.pizza.local
runinterval = 30m
|
Collegarsi all’host puppetdb01.pizza.local ed aggiungere al file /etc/puppetlabs/puppet/puppet.conf il seguente output:
0
1
2
3
4
5
|
[main]
certname = puppetdb01.pizza.local
server = puppet.pizza.it
ca_server = ca.puppet.pizza.it
dns_alt_names = puppetdb.pizza.local
runinterval = 30m
|
Aggiungere nel file hosts (in alternativa è possibile usare il DNS):
0 |
<ip_pgsqlserver> pgsqlvip.pizza.local
|
Sugli hosts pgsql.pizza.local e puppetdb01.pizza.local eseguire l’agent con i seguenti comandi:
0
1
|
/opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true
/opt/puppetlabs/bin/puppet agent -t
|
A questo punto gli agents sono correttamente installati su entrambe le macchine.
Sarà possibile continuare l’installazione sul Puppet master.
Collegarsi all’host 01.puppet.pizza.local e firmare i certificati dei due nuovi agents con i seguenti comandi:
0
1
|
/opt/puppetlabs/bin/puppetserver ca list --all
/opt/puppetlabs/bin/puppetserver ca sign --cert puppetdb01.pizza.local,pgsql.pizza.local
|
Installare il modulo necessario alla configurazione di PuppetDB con il comando:
0 |
/opt/puppetlabs/bin/puppet module install puppetlabs-puppetdb
|
Aggiungere il file /etc/puppetlabs/code/environments/production/manifests/pgsql.pizza.local.pp con il seguente output:
0
1
2
3
4
5
6
7
8
9
10
|
node 'pgsql.pizza.local' {
# Here we install and configure PostgreSQL and the PuppetDB
# database instance, and tell PostgreSQL that it should
# listen for connections to the `$postgres_host`
class { 'puppetdb::database::postgresql':
listen_addresses => 'pgsql.pizza.local',
database_password => 'mysafepassword',
postgresql_ssl_on => true,
puppetdb_server => 'puppetdb01.pizza.local',
}
}
|
Eseguire il Puppet agent su pgsql.pizza.local con il comando:
0 |
/opt/puppetlabs/bin/puppet agent -t
|
Aggiungere il file /etc/puppetlabs/code/environments/production/manifests/puppetdb01.pizza.local.pp con il seguente output:
ATTENZIONE: modificare le java args in base alla memoria da allocare per PuppetDB.
Ref: Puppet Site
0
1
2
3
4
5
6
7
8
9
10
11
|
node 'puppetdb01.pizza.local' {
# Here we install and configure PuppetDB, and tell it where to
# find the PostgreSQL database.
class { 'puppetdb::server':
cipher_suites => 'TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384',
database_host => 'pgsqlvip.pizza.local',
database_password => 'mysafepassword',
java_args => { '-Xmx' => '512m', '-Xms' => '256m' },
postgresql_ssl_on => true,
ssl_protocols => 'TLSv1.2, TLSv1.3',
}
}
|
Eseguire il Puppet agent su puppetdb01.pizza.local con il comando:
0 |
/opt/puppetlabs/bin/puppet agent -t
|
Aggiungere il file /etc/puppetlabs/code/environments/production/manifests/01.puppet.pizza.local.pp con il seguente output:
0
1
2
3
4
5
6
|
node '01.puppet.pizza.it' {
# Here we configure the Puppet master to use PuppetDB,
# telling it the hostname of the PuppetDB node
class { 'puppetdb::master::config':
puppetdb_server => 'puppetdb.pizza.local',
}
}
|
Eseguire il Puppet agent su 01.puppet.pizza.it con il comando:
0 |
/opt/puppetlabs/bin/puppet agent -t
|
A questo punto Puppet, Puppet CA e PuppetDB sono pronti e sarà possibile installare l’agent su nuovi nodi, tuttavia è tipico utilizzare Puppet insieme ad una ENC come Foreman.
0 Comments