Esta pagina se ve mejor con JavaScript habilitado

Servidor Puppetmaster, Foreman, PuppetDB en un solo server

 ·  🎃 kr0m

Hace un tiempo explicamos como montar Puppet y Foreman en un servidor bajo Gentoo, tras mucho dolor y lagrimas conseguimos que la cosa andase pero la forma mas sencilla de instalarlo es bajo Ubuntu-Trusty.

En este manual explico los pasos a seguir para obtener el mismo resultado, pero además en esta ocasión instalaremos PuppetDB que nos permitirá hacer uso de los exported resources.

Primero aclarar que vamos a utilizar Ubuntu/Trusty ya que Xenial no funciona todo lo bien que debería.

Actualizamos el SO:

apt-get update && apt-get dist-upgrade

Instalamos algunas utilidades básicas:

apt install bash-completion openssh-server

Configuramos la zona horaria:

dpkg-reconfigure tzdata

Generamos las locales para España:

echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
echo "es_ES.UTF-8 UTF-8" » /etc/locale.gen
locale-gen

Nos aseguramos de tener instalado Ruby v2

apt install ruby2.0

La selección de la versión de ruby a utilizar por defecto se intentó por update-alternatives pero:

update-alternatives --config ruby
update-alternatives: error: no alternatives for ruby

Así que lo haremos manualmente:

cd /usr/bin/
rm /usr/bin/ruby
ln -s ruby2.0 ruby

Añadimos los repos de puppetlabs y foreman:

apt-get -y install ca-certificates wget
wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
dpkg -i puppetlabs-release-trusty.deb

echo "deb http://deb.theforeman.org/ trusty 1.11" > /etc/apt/sources.list.d/foreman.list
echo "deb http://deb.theforeman.org/ plugins 1.11" » /etc/apt/sources.list.d/foreman.list
wget -q http://deb.theforeman.org/pubkey.gpg -O- | apt-key add -

apt-get update && apt-get dist-upgrade

Para PuppetDB vamos a utilizar PostgreSQL como backend:

apt-get install postgresql
apt-get install puppetdb puppetdb-terminus

Procedemos con la instalación del asistente que nos hará la vida mas fácil:

apt-get install foreman-installer

Nos aseguramos de que tanto foreman, puppet, puppetmaster como puppetdb resuelvan a la ip del server en cuestión:

vi /etc/hosts

A.B.C.D foreman.alfaexploit.com foreman puppet puppet.alfaexploit.com puppetmaster puppetmaster.alfaexploit.com puppetdb puppetdb.alfaexploit.com

Iniciamos el instalador:

export LANG=en_US.UTF-8
foreman-installer -i -v

Ready to start? (y/n)
18. [n] Configure foreman_plugin_puppetdb

Module foreman_plugin_puppetdb configuration
1. Enable/disable foreman_plugin_puppetdb module, current value: false
2. Back to main menu
Choose an option from the menu... 1
Enable foreman_plugin_puppetdb module? (y/n) y

Module foreman_plugin_puppetdb configuration
1. Enable/disable foreman_plugin_puppetdb module, current value: true
2. Set package, current value: ruby-puppetdb-foreman
3. Set address, current value: https://localhost:8081/v2/commands
4. Set dashboard_address, current value: http://localhost:8080/dashboard
5. Back to main menu
Choose an option from the menu... 5

41. Save and run

 Success!
 * Foreman is running at https://foreman.alfaexploit.com
 Initial credentials are admin / XXXXXXXXXXXX
 * Foreman Proxy is running at https://foreman.alfaexploit.com:8443
 * Puppetmaster is running at port 8140
 The full log is at /var/log/foreman-installer/foreman.log

Habilitamos foreman:

vi /etc/default/foreman

START=yes
/etc/init.d/foreman start
puppet agent --test

Configuramos puppetdb:

su - postgres
createuser -DRSP puppetdb
createdb -O puppetdb puppetdb

psql -h 127.0.0.1 -p 5432 -U puppetdb -W puppetdb
Ctrl+d

vi /etc/puppetdb/conf.d/database.ini
classname = org.postgresql.Driver
subprotocol = postgresql
subname = //127.0.0.1:5432/puppetdb
username = puppetdb
password = XXXXXXXX
log-slow-statements = 10
vi /etc/puppet/puppetdb.conf
[main]
server = foreman.alfaexploit.com
port = 8081
vi /etc/puppet/routes.yaml
---
master:
  facts:
      terminus: puppetdb
      cache: yaml

Copiamos los certificados del Foreman a los directorios de PuppetDB:

puppetdb-ssl-setup -f
chown -R puppet:puppet ` puppet config print confdir`

Reiniciamos servicios:

/etc/init.d/puppetdb restart
/etc/init.d/foreman restart
update-rc.d puppetdb defaults

Comprobamos que PuppetDB está a la escucha:

root@foreman:~# netstat -nputa|grep java

tcp6       0      0 127.0.0.1:8080          :::*                    LISTEN 5299/java       
tcp6       0      0 :::8081                 :::*                    LISTEN 5299/java     

Ejecutamos puppet y debería de aparecernos en la interfaz web:

puppet agent --test

NOTA: Pueden aparecer mensajes de advertencia: Puppet 3+ will show a warning the first time that the node can’t be found, this can be ignored.

En los clientes debemos modificar el fichero de hosts, instalar el puppet y hacer la petición de firma del certificado:

echo “A.B.C.D foreman.alfaexploit.com foreman puppet puppet.alfaexploit.com puppetmaster puppetmaster.alfaexploit.com puppetdb puppetdb.alfaexploit.com” » /etc/hosts

emerge -av puppet
apt-get install puppet
puppet agent -t --waitforcert 10

En PuppetMaster firmamos el certificado:

puppet cert list
puppet cert sign CERT_NAME

Otro aspecto de Foreman realmente interesante son las localizaciones, de este modo podremos aplicar clases en base a la localización del server:

vi /etc/foreman/settings.yaml

:locations_enabled: true
/etc/init.d/foreman restart
/etc/init.d/apache2 restart

https://foreman.alfaexploit.com/locations

Como podréis recordar hemos instalado PuppetDB para disponer de los exported resources que no son ni mas ni menos que anotaciones de config en la base de datos, de este modo un servidor genera la config en la DB y otro la lee al ejecutar puppet agent, esto es realmente útil para realizar configuraciones dinámicas.

vi /etc/puppet/puppet.conf

[main]
    storeconfigs   = true
    storeconfigs_backend = puppetdb

Comprobamos que la config esté:

puppet master --configprint all|grep storeconfig

async_storeconfigs = false
storeconfigs = true
storeconfigs_backend = puppetdb
thin_storeconfigs = false
/etc/init.d/foreman restart

Configuramos en la interfaz de Foreman los datos de acceso a la PuppetDB:
https://foreman.alfaexploit.com/settings

Puppetdb
puppetdb_address: https://foreman.alfaexploit.com:8081/v2/commands
puppetdb_dashboard_address: http://foreman.alfaexploit.com:8080/dashboard

Un buen ejemplo de configuración dinámica es Bacula, cuando instalemos un cliente queremos que nos genere la config del cliente en el bacula director, para ello podemos utilizar en la clase del fd:

  @@file { "/etc/bacula/client.d/${hostname}.conf":
    mode    => 0644,
    owner   => root,
    group   => root,
    ensure  => present,
    content => template("bacula/client.conf.erb"),
    tag     => "${bacula_server}-client",
  }

NOTA: Estamos tageando el fichero para que se inserte en PuppetDB como exported resource.

En la clase del director:

  File <<| tag == "${bacula_server}-client" |>> {
    require => File['/etc/bacula/client.d'],
    notify  => Service["$bacula_service_name"],
  }

Con esto cuando se instale un server y se aplique la clase del fd se guardará la config correspondiente en PuppetDB, cuando el director ejecute el agente de puppet detectará que hay configuración pendiente, generará la config y reiniciará el servicio bacula-dir.

Si queremos profundizar podemos consultar los siguientes enlaces:
http://codingbee.net/tutorials/puppet/puppet-what-is-puppet/
http://puppetlunch.com/contents/
http://garylarizza.com/
http://puppetlabs.github.io/geppetto/faq.html#/2011/06/04/about-geppetto
https://www.youtube.com/channel/UCCo7AZ1oG6TbG0-dwjRqCmw

Si te ha gustado el artículo puedes invitarme a un RedBull aquí