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:
Instalamos algunas utilidades básicas:
Configuramos la zona horaria:
Generamos las locales para España:
echo "es_ES.UTF-8 UTF-8" » /etc/locale.gen
locale-gen
Nos aseguramos de tener instalado Ruby v2
La selección de la versión de ruby a utilizar por defecto se intentó por update-alternatives pero:
update-alternatives: error: no alternatives for ruby
Asà que lo haremos manualmente:
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 puppetdb puppetdb-terminus
Procedemos con la instalación del asistente que nos hará la vida mas fácil:
Nos aseguramos de que tanto foreman, puppet, puppetmaster como puppetdb resuelvan a la ip del server en cuestión:
A.B.C.D foreman.alfaexploit.com foreman puppet puppet.alfaexploit.com puppetmaster puppetmaster.alfaexploit.com puppetdb puppetdb.alfaexploit.com
Iniciamos el instalador:
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:
START=yes
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
classname = org.postgresql.Driver
subprotocol = postgresql
subname = //127.0.0.1:5432/puppetdb
username = puppetdb
password = XXXXXXXX
log-slow-statements = 10
[main]
server = foreman.alfaexploit.com
port = 8081
---
master:
facts:
terminus: puppetdb
cache: yaml
Copiamos los certificados del Foreman a los directorios de PuppetDB:
chown -R puppet:puppet ` puppet config print confdir`
Reiniciamos servicios:
/etc/init.d/foreman restart
update-rc.d puppetdb defaults
Comprobamos que PuppetDB está a la escucha:
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:
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:
emerge -av puppet
apt-get install puppet
En PuppetMaster firmamos el certificado:
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:
:locations_enabled: true
/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.
[main]
storeconfigs = true
storeconfigs_backend = puppetdb
Comprobamos que la config esté:
async_storeconfigs = false
storeconfigs = true
storeconfigs_backend = puppetdb
thin_storeconfigs = false
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