Foreman è un software open source per la gestione delle macchine client e server.
Tramite Foreman è possibile effettuare il provisoning su bare metal o sui principali virtualizzatori, oltre che effettuare il monitoraggio delle risorse fisiche e virtuali.
È possibile estendere le funzionalità di Foreman tramite plugins e smart proxies.
I plugins vengono installati sul server di Foreman; esiste ad esempio un plugin per connettere Foreman a PuppetDB.
Gli smart proxies sono macchine fisiche o virtuali in cui viene installato un apposito servizio che comunica con Foreman.
Foreman, tramite lo smart proxy, è in grado di gestire alcuni servizi della macchina in cui è installato.
Lo smart proxy è integrabile con i principali software di gestione delle macchine (come Puppet, Ansible e Salt) e con altri servizi come TFTP, realm AD…
Le connessioni tra Foreman e i suoi smart proxy sono bidirezionali, perciò è necessario abilitare i flussi sul firewall in entrambe le direzioni.
ARCHITETTURA
Per l’installazione di Foreman verrà utilizzato un container LXC con Debian 11.
Sul Puppet master verrà installato e configurato lo smart proxy per Puppet e Puppet CA.
Come database di Foreman verrà utilizzata la stessa istanza di PostgreSQL che è stata utilizzata per PuppetDB.
Si sconsiglia di esporre Foreman su internet, essendo esso un servizio con il quale è facilmente possibile ottenere l’accesso remoto alle macchine.
PORTE UTILIZZATE
foreman01.pizza.local
: TCP/443 HTTPS Foreman
01.puppet.pizza.it: TCP/8140 HTTPS Puppet server e TCP/8443 HTTPS Foreman smart proxy
puppetdb01.pizza.local: TCP/8140 HTTPS PuppetDB
pgsql.pizza.local: TCP/5432 PostgreSQL
FLUSSI DA ABILITARE
foreman01.pizza.local -> 01.puppet.pizza.it: TCP/8140, TCP/8443
foreman01.pizza.local -> puppetdb01.pizza.it: TCP/8140
foreman01.pizza.local -> pgsql.pizza.local: TCP/5432
01.puppet.pizza.it -> foreman01.pizza.local: TCP/443
01.puppet.pizza.it -> puppetdb01.pizza.local: TCP/8140
puppetdb01.pizza.local -> 01.puppet.pizza.it: TCP/8140
puppetdb01.pizza.local -> pgsql.pizza.local: TCP/5432
pgsql.pizza.local -> 01.puppet.pizza.it: TCP/8140
PREREQUISITI
Si suppone che si abbia già installato e configurato Puppet server e PuppetDB seguendo la guida seguente
Se si fosse installato Puppet e i relativi servizi senza consultare la guida, si consiglia di prenderne visione, per avere una maggiore comprensione dell’architettura.
INSTALLAZIONE
Sull’host foreman01.pizza.local aggiornare il sistema operativo con i seguenti comandi:
0 1 2 |
apt update apt upgrade -y apt autoremove -y |
Aggiungere nel file hosts (in alternativa è possibile usare il DNS):
0 |
<ip_puppetserver> puppet.pizza.it ca.puppet.pizza.it |
INSTALLAZIONE DI PUPPET AGENT
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 pacchetto Puppet Agent con il comando:
0 |
apt install puppet-agent |
Aggiungere nel file /etc/puppetlabs/puppet/puppet.conf il seguente output:
0 1 2 3 4 5 6 |
[main] certname = foreman01.pizza.local server = puppet.pizza.it ca_server = ca.puppet.pizza.it dns_alt_names = foreman.pizza.local runinterval = 30m /opt/puppetlabs/bin/puppet agent -t |
A questo punto sarà necessario firmare il certificato dell’agent sulla CA di Puppet con i seguenti comandi:
0 1 |
/opt/puppetlabs/bin/puppetserver ca list --all /opt/puppetlabs/bin/puppetserver ca sign --cert foreman01.pizza.local |
Successivamente, eseguire l’agent su foreman01.pizza.local con il comando:
0 |
/opt/puppetlabs/bin/puppet agent -t |
INSTALLAZIONE DI FOREMAN
Aggiungere i repository di Foreman con i seguenti comandi:
0 1 2 3 |
wget https://deb.theforeman.org/foreman.asc -O /etc/apt/trusted.gpg.d/foreman.asc echo "deb http://deb.theforeman.org/ bullseye 3.5" | tee /etc/apt/sources.list.d/foreman.list echo "deb http://deb.theforeman.org/ plugins 3.5" | tee -a /etc/apt/sources.list.d/foreman.list apt update |
Sull’host pgsql.pizza.local eseguire i comandi:
0 1 2 3 |
apt install sudo sudo -u postgres psql CREATE USER foreman ENCRYPTED PASSWORD '<foreman_db_password>'; CREATE DATABASE foreman WITH OWNER = foreman; |
Sull’host 01.puppet.pizza.it eseguire il comando:
0 |
/opt/puppetlabs/bin/puppet module install theforeman-foreman --version 23.1.0 |
Creare il file /etc/puppetlabs/code/environments/production/manifests/foreman01.pizza.local.epp ed inserire il seguente output:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# # From: https://github.com/theforeman/puppet-foreman/blob/master/manifests/init.pp # node 'foreman01.pizza.local' { # Here we install and configure Foreman class { 'foreman': initial_admin_username => 'admin', initial_admin_password => '<admin_password>', initial_admin_first_name => '<admin_firstname>', initial_admin_last_name => '<admin_lastname>', initial_admin_email => '<admin_email>', db_manage => false, foreman_url => 'https://foreman.pizza.local', apache => true, servername => 'foreman01.pizza.local', serveraliases => ['foreman.pizza.local'], ssl => true, db_host => 'pgsqlvip.pizza.local', db_port => 5432, db_database => 'foreman', db_username => 'foreman', db_password => '<foreman_db_password', db_sslmode => 'require', db_root_cert => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', server_port => 80, server_ssl_port => 443, server_ssl_ca => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', server_ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/foreman01.pizza.local.pem', server_ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/foreman01.pizza.local.pem', server_ssl_crl => '/etc/puppetlabs/puppet/ssl/crl.pem', server_ssl_protocol => 'all -SSLv3 -TLSv1 -TLSv1.1', client_ssl_ca => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', client_ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/foreman01.pizza.local.pem', client_ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/foreman01.pizza.local.pem', oauth_active => true, oauth_map_users => false, oauth_consumer_key => '<oauth_random_string>', oauth_consumer_secret => '<oauth_longer_random_string>', oauth_effective_user => 'admin', websockets_encrypt => true, websockets_ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/foreman01.pizza.local.pem', websockets_ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/foreman01.pizza.local.pem', cors_domains => [], trusted_proxies => ['127.0.0.1/8', '::1'], } } |
Sull’host foreman01.pizza.local eseguire i comandi:
0 1 2 3 |
apt install ruby-foreman-puppet ruby-puppetdb-foreman -y groupadd puppet /opt/puppetlabs/bin/puppet resource service puppet ensure=running enable=true /opt/puppetlabs/bin/puppet agent -t |
A questo punto Foreman dovrebbe essere disponibile all’indirizzo: https://foreman.pizza.local
Accedere con le credenziali impostate tramite i parametri initial_admin_username e initial_admin_password.
Andare su Administer > Settings > General e configurare Foreman URL: https://foreman.pizza.local
INSTALLAZIONE DELLO SMART PROXY PER PUPPET
Sull’host 01.puppet.pizza.local eseguire i comandi:
0 1 2 3 |
touch /etc/puppetlabs/puppet/autosign.conf chown puppet:puppet /etc/puppetlabs/puppet/autosign.conf chmod 664 /etc/puppetlabs/puppet/autosign.conf /opt/puppetlabs/bin/puppet module install theforeman-foreman_proxy --version 25.1.0 |
Aggiungere le repository di Foreman con i seguenti comandi:
0 1 2 3 |
wget https://deb.theforeman.org/foreman.asc -O /etc/apt/trusted.gpg.d/foreman.asc echo "deb http://deb.theforeman.org/ bullseye 3.5" | tee /etc/apt/sources.list.d/foreman.list echo "deb http://deb.theforeman.org/ plugins 3.5" | tee -a /etc/apt/sources.list.d/foreman.list apt update |
Aggiungere nel file /etc/puppetlabs/puppetserver/conf.d/auth.conf il seguente output:
ATTENZIONE: La rule relativa a /puppet/v3/environments, dovrebbe già essere presente, aggiungere le altre due sotto di essa
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{ match-request: { path: "/puppet/v3/environments" type: path method: get } allow: "*" sort-order: 500 name: "puppetlabs environments" }, { match-request: { path: "/puppet/v3/environment_classes" type: path method: get } allow: "*" sort-order: 500 name: "puppetlabs environment classes" }, { match-request: { path: "/puppet/v3/resource_type" type: path method: [get, post] } allow: "*" sort-order: 500 name: "puppetlabs resource type" }, |
Aggiungere nel file /etc/puppetlabs/puppet/foreman.yaml il seguente output:
0 1 2 3 4 5 6 7 8 9 10 11 12 |
--- :url: "https://foreman.pizza.local" :ssl_ca: "/etc/puppetlabs/puppet/ssl/certs/ca.pem" :ssl_cert: "/etc/puppetlabs/puppet/ssl/certs/01.puppet.pizza.it.pem" :ssl_key: "/etc/puppetlabs/puppet/ssl/private_keys/01.puppet.pizza.it.pem" :puppetdir: "/opt/puppetlabs/server/data/puppetserver" :puppetuser: "puppet" :facts: true :fact_extension: "json" :timeout: 60 :report_timeout: 60 :report_retry_limit: 1 :threads: null |
Aggiugere i file necessari a Puppet per ricevere da Foreman i parametri della ENC ed inviargli i reports con i seguenti comandi:
0 1 2 3 |
curl https://raw.githubusercontent.com/theforeman/puppet-puppetserver_foreman/master/files/report.rb -o /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/reports/foreman.rb curl https://raw.githubusercontent.com/theforeman/puppet-puppetserver_foreman/master/files/enc.rb -o /etc/puppetlabs/puppet/node.rb chown puppet:puppet /etc/puppetlabs/puppet/node.rb chmod 550 /etc/puppetlabs/puppet/node.rb |
Aggiungere nel file /etc/puppetlabs/puppet/puppet.conf il seguente output:
0 1 2 3 4 5 6 7 |
[main] ... reports = log, foreman ... [master] ... external_nodes = /etc/puppetlabs/puppet/node.rb node_terminus = exec |
Riavviare il server con il comando:
0 |
systemctl restart puppetserver.service |
Aggiungere al file /etc/puppetlabs/code/environments/production/manifests/01.puppet.pizza.it.pp il seguente output:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
node '01.puppet.pizza.it' { # # ... # # Here we install and configure Foreman Proxy class { 'foreman_proxy': bind_host => ['0.0.0.0'], http => false, ssl => true, ssl_port => 8443, groups => ['puppet'], log => '/var/log/foreman-proxy/proxy.log', log_level => 'INFO', ssl_ca => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/01.puppet.pizza.it.pem', ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/01.puppet.pizza.it.pem', foreman_ssl_ca => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', foreman_ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/01.puppet.pizza.it.pem', foreman_ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/01.puppet.pizza.it.pem', ssl_disabled_ciphers => [], tls_disabled_versions => ['1.1'], trusted_hosts => ['foreman01.pizza.local'], puppetca => true, puppetca_listen_on => 'https', ssldir => '/etc/puppetlabs/puppet/ssl', puppetdir => '/etc/puppetlabs/puppet', puppet_group => 'puppet', autosignfile => '/etc/puppetlabs/puppet/autosign.conf', manage_puppet_group => true, puppet => true, puppet_listen_on => 'https', puppet_url => 'https://puppet.pizza.it:8140', puppet_ssl_ca => '/etc/puppetlabs/puppet/ssl/certs/ca.pem', puppet_ssl_cert => '/etc/puppetlabs/puppet/ssl/certs/01.puppet.pizza.it.pem', puppet_ssl_key => '/etc/puppetlabs/puppet/ssl/private_keys/01.puppet.pizza.it.pem', templates => false, registration => false, logs => true, tftp => false, dhcp => false, dns => false, bmc => false, realm => false, register_in_foreman => true, registered_name => '01.puppet.pizza.it', registered_proxy_url => 'https://01.puppet.pizza.it:8443', foreman_base_url => 'https://foreman.pizza.local', oauth_effective_user => 'admin', oauth_consumer_key => '<oauth_random_string>', oauth_consumer_secret => '<oauth_longer_random_string>', } } |
Sull’host puppet01.pizza.local eseguire il comando:
0 |
/opt/puppetlabs/bin/puppet agent -t |
CONFIGURAZIONE DI FOREMAN TRAMITE WEB GUI
Sulla web UI di Foreman andare su
Selezionare dal menù Administer > Settings > PuppetDB
Quindi configurare le impostazioni mostrate nell’immagine sovrastante
Andare su Monitor > PuppetDB Nodes
Quindi importare gli Host mancanti selezionando Actions quindi Import
Andare su Hosts > All Hosts
Impostare gli environments dei nodi importati come mostrato nell’immagine sovrastante
Quindi modificare l’environment e cliccare su Submit
Andare su Configure > Enviroments
Quindi importare le classi di Puppet cliccando Import Environments from 01.puppet.pizza.local
A questo punto Foreman è pronto per essere utilizzato come Puppet ENC, ricevere i reports e consultare i facts.
0 commenti