Puppet permet, d’origine, de remonter ses logs dans par exemple le dashboard. Voici une méthode plus “classique” qui consiste à utiliser rsyslog sur les clients pour envoyer les logs concernant Puppet sur votre serveur de log centralisé (un loghost rsyslog). Le loghost est souvent une brique disponible dans une architecture. Il peut donc être intéressant d’en profiter pour centraliser les logs Puppet et peut-être les intégrer à un outil, déjà présent, de gestion de logs.

Je propose ici deux méthodes pour l’installation et la configuration du loghost et des clients Puppet : une version classique et la version Puppet.

Le loghost rsyslog

Installer rsyslog sur votre serveur qui fera office de loghost :

apt-get install rsyslog

Pour la partie configuration, il va falloir activer la réception via UDP de vos logs, désactiver la résolution DNS pour les logs reçus et configurer un log pour votre serveur Puppet ainsi qu’un log pour chaque client Puppet.

Configuration de rsyslog : /etc/rsyslog.conf

Ajouter ou décommenter les lignes :

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

Configuration de /etc/default/rsyslog

Modifier la valeur de RSYSLOGD_OPTIONS :

RSYSLOGD_OPTIONS="-c5 -x"
  • -c : c’est le mode compatibilité de rsyslog. Remplacez 5 par la version de votre rsyslog si vous n’êtes pas en version 5.
  • -x : on peut croire cette option obsolète mais non. Elle permet de désactiver la résolution DNS pour les messages reçus via UDP.

Séparation des logs serveur/clients

Pour le serveur : /etc/rsyslog.d/puppet.conf

:app-name, isequal, "puppet-master" /logs/puppet-master.log
& ~

Pour les clients, on aura un fichier de log par client Puppet au format puppet-$HOSTNAME.log. /etc/rsyslog.d/puppet-clients.conf :

$template AgentLogs,"/logs/puppet-%HOSTNAME%.log"
:app-name, isequal, "puppet-agent" ?AgentLogs
& ~

Les clients Puppet

Au niveau des clients Puppet, il faut que votre rsyslog envoie les logs Puppet à votre loghost. Après avoir installé rsyslog, créez le fichier de configuration /etc/rsyslog.d/puppet-agent.conf avec pour contenu :

:app-name, isequal, "puppet-agent" @loghost
& ~
  • Remplacer “loghost” par votre serveur de log.

Le serveur Puppet

L’appname du serveur Puppet est différent des clients. La configuration diffère donc un petit peu. Le fichier /etc/rsyslog.d/puppet-server.conf pour le serveur Puppet à le contenu suivant. Remplacez là aussi “loghost” par votre serveur de log.

:app-name, isequal, "puppet-master" @loghost
& ~

C’est fini pour la partie manuelle ! Votre loghost va recevoir les logs Puppet de tous vos serveurs dans le répertoire /logs. A vous d’imaginer la suite et d’adapter selon votre besoin.

Module puppet_rsyslog

Voici la même chose mais via Puppet. A adapter selon vos besoins et à tester.

Arborescence du module :

puppet_rsyslog/
|-- manifests
|   |-- client.pp
|   |-- init.pp
|   |-- master.pp
|   `-- server.pp
`-- templates
    |-- client
    |   |-- puppet-agent.conf
    |   `-- puppet-master.conf
    `-- server
        |-- default_rsyslog
        |-- puppet-client.conf
        |-- puppet-master.conf
        |-- puppet.conf
        `-- udp.conf

init.pp

class puppet_rsyslog {
  # Votre serveur de log
  $rsyslog_server = 'loghost';

  package { 'rsyslog':
    ensure => present,
  }

  service { 'rsyslog':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
  }
}

client.pp

class puppet_rsyslog::client inherits puppet_rsyslog {
  file { '/etc/rsyslog.d/puppet-agent.conf':
    owner   => 'root',
    group   => 'root',
    mode    => '640',
    content => template('puppet_rsyslog/client/puppet-agent.conf'),
  }

  Package['rsyslog'] -> File['/etc/rsyslog.d/puppet-agent.conf'] ~> Service['rsyslog']
}

master.pp

class puppet_rsyslog::master inherits puppet_rsyslog {
  file { '/etc/rsyslog.d/puppet-master.conf':
    content => template('puppet_rsyslog/client/puppet-master.conf'),
    owner   => 'root',
    group   => 'root',
    mode    => '640',
  }
  Package['rsyslog'] -> File['/etc/rsyslog.d/puppet-master.conf'] ~> Service['rsyslog']
}

server.pp

class puppet_rsyslog::server inherits puppet_rsyslog {
  file { '/etc/rsyslog.d/udp.conf':
    content => template('puppet_rsyslog/server/udp.conf'),
    owner   => 'root',
    group   => 'root',
    mode    => '0640'
  }

  file { '/etc/rsyslog.d/puppet.conf':
    content => template('puppet_rsyslog/server/puppet.conf'),
    owner   => 'root',
    group   => 'root',
    mode    => '0640',
  }

  file { '/etc/rsyslog.d/puppet-client.conf':
    content => template('puppet_rsyslog/server/puppet-client.conf'),
    owner   => 'root',
    group   => 'root',
    mode    => '0640',
  }

  file { '/etc/default/rsyslog':
    content => template('puppet_rsyslog/server/default_rsyslog'),
    owner   => 'root',
    group   => 'root',
    mode    => '0640',
  }

  Package['rsyslog'] -> File['/etc/rsyslog.d/udp.conf'] ~> Service['rsyslog']
  Package['rsyslog'] -> File['/etc/rsyslog.d/puppet.conf'] ~> Service['rsyslog']
  Package['rsyslog'] -> File['/etc/rsyslog.d/puppet-client.conf'] ~> Service['rsyslog']
  Package['rsyslog'] -> File['/etc/default/rsyslog'] ~> Service['rsyslog']
}

Template client/puppet-agent.conf

# Gere par Puppet
:app-name, isequal, "puppet-agent" <%= scope.lookupvar('puppet\_rsyslog::rsyslog\_server') >
& ~

Template client/puppet-master.conf

# Gere par Puppet
:app-name, isequal,"puppet-master" <%= scope.lookupvar('puppet\_rsyslog::rsyslog\_server') >
& ~

Template server/default_rsyslog

# Gere par Puppet
RSYSLOGD_OPTIONS="-c5 -x"

Template server/puppet-client.conf

# Gere par Puppet
$template AgentLogs,"/logs/puppet-%HOSTNAME%.log"
:app-name, isequal, "puppet-agent" ?AgentLogs
& ~

Template server/puppet.conf

# Gere par Puppet
:app-name, isequal, "puppet-master" /logs/puppet-master.log
& ~

Template server/udp.conf

# Gere par Puppet
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

Pour utiliser le module, faites un include de la classe puppet_rsyslog::server sur votre serveur rsyslog et puppet_rsyslog::client sur vos clients. Pour les logs du serveur Puppet, rajoutez la classe puppet_rsyslog::master. Bons tests !