Puppet: alte Reports automatisch aufraeumen

Puppet legt in dem Verzeichnis /var/lib/puppet/reports/ fuer jeden node fuer jede Abfrage eine .yaml Datei als Report ab. Diese werden nicht automatisch aufgeraeumt. Damit die Festplatte nicht voll laeuft ergibt es Sinn dieses automatisch zu tun. Am einfachsten geht das mit einem kleinen Skript das per Cron aufgerufen wird. In meinem Fall die folgende Datei:

  • /etc/cron.d/puppet-cleanreports
PATH=/usr/bin:/bin:/usr/sbin/
#
# Cron job to clean puppet reports older than 31 days
#
 
 
0 23  * * *     root    find /var/lib/puppet/reports/ -type f -name "*.yaml" -mtime +31 -exec rm -f {} ;

Puppet: ein Modul mit Template, Variablen und Bedingung (/etc/apt/sources.list)

Vor kurzem erst hatte ich darueber geschrieben, wie man in puppet ein eigenes Modul definiert.
Heute moechte ich zeigen, wie in einem Modul mit Templates, Variablen und if-Bedingung gearbeitet werden kann. Ich habe mir dafuer die Datei /etc/apt/sources.list ausgesucht in die ich – je nach Host – unterschiedliche Mirror eintragen moechte. Dafuer habe ich das Verzeichnis /etc/puppet/modules/apt/ mit der folgenden Ordnerstruktur angelegt:

├── manifests
│   └── init.pp
└── templates
    └── sources.list.erb

Mein Template fuer die sources.list sieht wie folgt aus:

#############################################################################
#                                                                           #
# !!! This file is managed by puppet, all manual changes will be lost !!!   #
#                                                                           #
#############################################################################
 
 
 
deb     <%= mirror %>  <%= release %>  main
<% if source -%>
deb-src <%= mirror %>  <%= release %>  main
<% end -%>
 
deb     http://security.debian.org/  <%= release %>/updates  main
<% if source  -%>
deb-src http://security.debian.org/  <%= release %>/updates  main
<% end -%>

In dem Template kann man zwei Variablen erkennen. Diese sollen bei Bedarf ueberschrieben werden koennen <%= mirror -%> und <%= release %>. Ausserdem gibt es eine Bedingung, wenn die Variable source Wahr ist, wird auch die deb-src Zeile eingefuegt.

Die apt/manifests/init.pp fuer das Modul sieht wie folgt aus:

class apt (
  $mirror = 'http://ftp.de.debian.org',
  $release = 'wheezy',
  $source = false ) {
 
  file { '/etc/apt/sources.list':
    ensure  => 'present',
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    content => template('apt/sources.list.erb'),
    }
}

Neu ist, dass in der Klassendefinition die Variablen mit entsprechenden Standardwerten definiert wurden. Das Bild wird komplett, wenn nun ein neuer Node in der sites.pp definiert wird:

node default {
  class { 'motd': }
}
 
node 'client02.example.org' inherits default {
  class { 'apt':
    mirror => 'http://debianmirror.example.org/pub/linux/debian/debian/',
    source => true
  }
}

Hier ist neu, dass der Node „client02.example.org“ explizit angegeben wurde. Er erbt die Einstellungen des default Node. Erweiternd ist die Klasse apt definiert, bei der die Variablen mirror und source einen anderen Wert annehmen als der Standartwert.

Ich bin mir dessen bewusst, dass es ein apt Modul auf puppetforge gibt, zum Lernen finde ich das hier gerade aber einfacher.

Informationen habe ich auch aus dem Blogeintrag „Puppet templates and default values for variables„.

Puppet: Ueberwachen von puppet agent und puppet master mit Nagios

puppet agent

Man kann mit Nagios gut pruefen ob der puppet agent sich regelmaessig mit dem puppet master abgeglichen hat. Das Plugin dafuer ist check_puppet_agent und ist auf NagiosExchange zu finden.

Eingebunden zum Beispiel per NSCA gibt es einem eine Warnung sobald etwas nicht mehr laeuft.

Bildschirmfoto vom 2014-04-26 14:15:13

puppet master

Auch kann man von extern pruefen ob der puppet master erreichbar ist. Das geht am besten ueber HTTP mit der REST API. Auf dem Nagios Server habe ich dafuer das folgende Kommando definiert:

define command{
command_name    check_puppetmaster
command_line    $USER1$/check_http -H $ARG1$ -S -p 8140 -u /production/status/puppetclient --header="Accept: yaml"
}

Den Check habe ich wie folgt eingerichtet:

define service{
use                             my-service
host_name                       server.example.org
service_description             puppet master
check_command                   check_puppetmaster!puppetmaster.example.org
}

Zu guter Letzt muss dem Nagios Server gestattet werden die Abfrage ueber die REST API auch durchzufuehren. Dafuer auf dem puppet master Server in der /etc/puppet/auth.conf die folgenden Zeilen hinzufuegen:

path /status/puppetclient
auth any
method find
allow 1.2.3.4

Und schon steht auch dem Monitoring des puppet masters nichts mehr im Wege:

Bildschirmfoto vom 2014-04-26 14:40:58

Puppet: Syntaxpruefung mit puppet-lint

Mit dem Tool puppet-lint kann man die Syntax seiner puppet manifest Dateien pruefen. Die Installation erfolgt aus den Repositories:

sudo aptitude install puppet-lint

Die Syntaxpruefung geht dann mit dem Aufruf:

puppet-lint --with-filename /etc/puppet/modules

Falls es Auffaelligkeiten gibt werden diese auf der Kommandozeile ausgegeben:

root@host:~# puppet-lint --with-filename /etc/puppet/modules/
foo/manifests/init.pp - WARNING: line has more than 80 characters on line 5
foo/manifests/init.pp - ERROR: tab character found on line 34
foo/manifests/init.pp - WARNING: => on line isn't properly aligned for resource on line 23
root@host:~#