Facts

En mi último post, vimos como instalar Puppet en la arquitectura master-agent y la creación de un módulo para declarar algunos recursos. En este, quiero mostrar cómo configurar un parámetro utilizando la aplicación Facter y despues, cómo extender Facter para tomar ese parámetro desde un archivo que lo contenga, creado «a mano» en el agente. Utilizaré la configuración del post anterior de la serie automatizaciones para el ejemplo un servicio PHP-FPM

Modulo «zona horaria»

El modulo que crearemos se llamará zonahoraría. Tomará la zona horaria desde un parámetro del sistema y en la segunda parte del post modificaré el manifiesto para lea desde un fact a medida.

Instalando PHP

Instalamos el módulo de PHP:

cd /etc/puppetlabs/code/environment/test/modules
/opt/puppetlabs/bin/puppet module install mayflower-php --version 4.0.0-beta1

 Creando módulo «zonahoraria»

En el directorio de módulos:

/opt/puppetlabs/bin/puppet module generate enredadera-zonahoraria

 Creando init.pp

El init.pp del módulo utilizará la clase del módulo recién instalado (podéis encontar más información acerca del módulo en este enlace).

class zonahoraria::setup {

}

 Configuración global

class { '::php::globals':
    php_version			=> '7.0',
    config_root			=> '/etc/php/7.0',
}

 Configuración de PHP

class { '::php':
      ensure               => latest,
      manage_repos         => true,
      fpm                  => true,
      dev                  => true,
      composer             => true,
      pear                 => true,
      phpunit              => false,
      settings             =>	{
            'PHP/max_execution_time'  => '90',
            'PHP/max_input_time'      => '300',
            'PHP/memory_limit'        => '64M',
            'PHP/post_max_size'       => '32M',
            'PHP/upload_max_filesize' => '32M',
            'Date/date.timezone'      => $timezone,
            },
      extensions    => {
                          imagick   => {
                                           provider => pecl,
                         }
      }
}

La variable $timezone tiene el valor (en el agente):

/opt/puppetlabs/bin/facter timezone

CET

Precendecia

La clase ::php::global debe ejecutarse antes de la clase ::php, por lo que ha de utilizarse algún parámetro como require para garantizar el orden de ejecución o un operador de precedencia.

En el post anterior utilizamos el operador -> de un modo que en esta clase podríamos usar:

Class[::php::global] -> Class['::php]

No obstante, puede definirse la precedencia en las propias declaraciones de los recursos y, de este modo, la clase «zonahoraria» mostraría la siguiente estructura:

class zonahoraria::setup {

  class { '::php::globals':
            
            ...

 	}->
  class { '::php':
            
            ...

        }
}

Ejecutando el manifiesto

Pedimos el manifiesto desde el agente para su ejecución:

/opt/puppetlabs/bin/puppet agent -t

 Comprobación

Comprobamos que parámetro timezone.

cat /etc/php/7.0/fpm/php.ini | grep timezone

; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date.timezone =CET

 Leyendo el parámetro desde un archivo en el agente

Para ello hay que escribir un archivo a mano en la máquina del agente y ampliar las funcionalidades de Facter para que lea este archivo.

Archivo con parámetro

Creamos el archivo con la zona horaria:

echo " Europe/Madrid" > /usr/local/etc/timezone

 Montaje del directorio

Editamos de nuevo el archivo fileserver.conf  y añadimos el punto de montaje /usr/local/etc:

[files]
  path /usr/local/bin:/usr/local/etc
  allow *

 Ampliando el comportamiento facter

Facter permite añadir nuevos «hechos», que pueden escribirse en Ruby, y utilizarse en los manifiestos.

Creamos un fact en el módulo «zonahoraria»:

mkdir -p /etc/puppetlabs/code/environments/test/modules/zonahoraria/lib/facter
vim /etc/puppetlabs/code/environments/test/modules/zonahoraria/lib/facter/zonahoraria.rb

 Fact

Facter.add(:zonahoraria) do
  setcode do
    if File.exists? '/usr/local/etc/timezone'
      zone = File.readlines('/usr/local/etc/timezone')
      zone[0]
    end
  end
end

 Cambiando el fact en el manifiesto

Con la siguiente línea reemplazmos la variable de facter timezone por la que hemos creado, zonahoraria:

find modules/zonahoraria/manifests/init.pp | xargs perl -pi -e 's/timezone/zonahoraria/g'

 Actualizando el parámetro en el agente

Pedimos el manifiesto al master:

/opt/puppetlabs/bin puppet agent -t

 Por ultimo

Comprobamos que el parámetro leído del archivo se haya actualizado:

cat /etc/php/7.0/fpm/php.ini | grep timezone
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date.timezone = Europe/Madrid

Esta es la idea básica de declaración de facts en Puppet. Por supuesto, hay mucho más. Una lista completa de los facts del sistema pueden obtenserse con el comando /opt/puppetlabs/bin/facter

Hi, I’m Gustavo Moreno