L'install a été réalisée sur 2 vmwares debian-lenny . Un serveur dns local gère le domaine net.caen.

dbip63.net.caen : sera le serveur puppet
dbip64.net.caen : sera un client.

Le sources.list est commun aux 2 machines, dbip63 faisant office de proxy avec apt-cacher-ng

deb http://192.168.0.63:3142/mir2.ovh.net/debian/ lenny main non-free contrib
deb-src http://192.168.0.63:3142/mir2.ovh.net/debian/ lenny main non-free contrib
deb http://192.168.0.63:3142/security.debian.org/ lenny/updates main contrib non-free
deb-src http://192.168.0.63:3142/security.debian.org/ lenny/updates main contrib non-free



dbip63:/# hostname --fqdn
dbip63.net.caen

dbip63:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l

dbip63:/# uname -a
Linux dbip63 2.6.26-1-amd64 #1 SMP Sat Jan 10 17:57:00 UTC 2009 x86_64 GNU/Linux



dbip64:/# hostname --fqdn
dbip64.net.caen

dbip64:/# cat /etc/issue
Debian GNU/Linux 5.0 \n \l

dbip64:/# uname -a
Linux dbip64 2.6.26-1-amd64 #1 SMP Sat Jan 10 17:57:00 UTC 2009 x86_64 GNU/Linux



Je commence par installer le nécessaire sur le serveur:

dbip63:/# apt-get install puppetmaster
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  libmudflap0-dev libmudflap0 perl-doc
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés :
  facter irb irb1.8 javascript-common libbreakpoint-ruby1.8 libbuilder-ruby1.8 libcmdparse2-ruby1.8 libdaemons-ruby1.8 libjs-prototype liblog4r-ruby1.8
  libmmap-ruby1.8 libmocha-ruby1.8 libncurses-ruby1.8 libopenssl-ruby libopenssl-ruby1.8 libreadline-ruby1.8 libredcloth-ruby1.8 libruby libruby1.8
  libruby1.8-extras libshadow-ruby1.8 libsqlite3-0 libsqlite3-ruby1.8 libxml-simple-ruby libxmlrpc-ruby puppet rails rake rdoc rdoc1.8 ruby ruby1.8
  rubygems1.8 unzip wwwconfig-common zip
Paquets suggérés :
  apache2 nginx mongrel libapache2-mod-ruby libapache-mod-ruby libapache2-mod-fcgid libfcgi-ruby1.8 graphviz ruby1.8-examples ri1.8 ruby1.8-dev
  rubygems-doc mysql-client postgresql-client apache apache-ssl
Les NOUVEAUX paquets suivants seront installés :
  facter irb irb1.8 javascript-common libbreakpoint-ruby1.8 libbuilder-ruby1.8 libcmdparse2-ruby1.8 libdaemons-ruby1.8 libjs-prototype liblog4r-ruby1.8
  libmmap-ruby1.8 libmocha-ruby1.8 libncurses-ruby1.8 libopenssl-ruby libopenssl-ruby1.8 libreadline-ruby1.8 libredcloth-ruby1.8 libruby libruby1.8
  libruby1.8-extras libshadow-ruby1.8 libsqlite3-0 libsqlite3-ruby1.8 libxml-simple-ruby libxmlrpc-ruby puppet puppetmaster rails rake rdoc rdoc1.8 ruby
  ruby1.8 rubygems1.8 unzip wwwconfig-common zip
0 mis à jour, 37 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 7655ko dans les archives.
Après cette opération, 44,0Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?

dbip63:/# ps ax  (extrait)
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 init [2]  
    2 ?        S<     0:00 [kthreadd]
    3 ?        S<     0:00 [migration/0]
 ..........
 1896 ?        Ss     0:00 /usr/sbin/sshd
 1906 ?        Ssl    0:00 /usr/sbin/apt-cacher-ng -c /etc/apt-cacher-ng pidfile=/var/run/apt-cacher-ng/pid SocketPath=/var/run/apt-cacher-ng/socket foreg
 1968 ?        Rs     0:01 sshd: root@pts/0
 1970 pts/0    Ss     0:00 -bash
 2580 ?        Ssl    0:01 ruby /usr/sbin/puppetd -w 5
 2629 ?        Ssl    0:00 ruby /usr/sbin/puppetmasterd --masterport=8140
 2709 pts/0    R+     0:00 ps ax

 

On voit que le client puppet a été également installé et que le serveur tourne déjà sur le port 8140.

dbip63:/# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:8140            0.0.0.0:*               LISTEN      2629/ruby       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1896/sshd       
tcp        0      0 192.168.0.63:22         192.168.0.22:46817      ESTABLISHED 1968/0          
tcp6       0      0 :::3142                 :::*                    LISTEN      1906/apt-cacher-ng
tcp6       0      0 :::22                   :::*                    LISTEN      1896/sshd       

Je vais commencer par stopper puppet-client et puppetmaster et dévalider le client.

dbip63:/var/log# /etc/init.d/puppet stop
Stopping puppet configuration management tool.

dbip63:/var/log# /etc/init.d/puppetmaster stop

dbip63:/var/log# update-rc.d -f puppet remove
 Removing any system startup links for /etc/init.d/puppet ...
   /etc/rc0.d/K21puppet
   /etc/rc1.d/K21puppet
   /etc/rc2.d/S21puppet
   /etc/rc3.d/S21puppet
   /etc/rc4.d/S21puppet
   /etc/rc5.d/S21puppet
   /etc/rc6.d/K21puppet


Je passe sur le client pour installer puppet-client:

dbip64:/# apt-get install puppet
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
  facter host irb1.8 libopenssl-ruby libopenssl-ruby1.8 libreadline-ruby1.8 libruby libruby1.8 libshadow-ruby1.8 libxmlrpc-ruby rdoc rdoc1.8 ruby
  ruby1.8
Paquets suggérés :
  graphviz ruby1.8-examples ri1.8
Les NOUVEAUX paquets suivants seront installés :
  facter host irb1.8 libopenssl-ruby libopenssl-ruby1.8 libreadline-ruby1.8 libruby libruby1.8 libshadow-ruby1.8 libxmlrpc-ruby puppet rdoc rdoc1.8 ruby
  ruby1.8
0 mis à jour, 15 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 3980ko dans les archives.
Après cette opération, 13,1Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ?

dbip64:/# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 init [2]  
    2 ?        S<     0:00 [kthreadd]
.......
 2031 pts/0    Ss     0:00 -bash
 2364 ?        Ssl    0:00 ruby /usr/sbin/puppetd -w 5
 2372 pts/0    R+     0:00 ps ax

Là aussi le démon puppet a été automatiquement lancé mais pour les tests je vais le stopper.

dbip64:/# /etc/init.d/puppet stop
Stopping puppet configuration management tool.


Je paramètre ensuite le fichier de config du client en ajoutant simplement la directive server et la section [puppetd]


dbip64:/etc/puppet# ll
total 16
drwxr-xr-x  3 root root 4096 jan 22 15:52 .
drwxr-xr-x 52 root root 4096 jan 22 15:52 ..
drwxr-xr-x  2 root root 4096 jan  7 21:17 files
-rw-r--r--  1 root root  202 jan  5 21:26 puppet.conf

dbip64:/etc/puppet# cat puppet.conf


[puppetd]
server = dbip63.net.caen

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
pluginsync=true

[puppetmasterd]
templatedir=/var/lib/puppet/templates


Sur le client, il va falloir récupérer un certificat signé par le serveur (le fait de passer l'option --test empêche la daemonisation de puppetd)


dbip64:/etc/puppet# puppetd --test --waitforcert 60
warning: peer certificate won't be verified in this SSL session
notice: Did not receive certificate
notice: Set to run 'one time'; exiting with no certificate

Les logs côté serveur pendant cette requête:

dbip63:/var/log# tail -f daemon.log
Jan 22 15:59:57 dbip63 puppetmasterd[2629]: Allowing unauthenticated client dbip64.net.caen(192.168.0.64) access to puppetca.getcert
Jan 22 15:59:57 dbip63 puppetmasterd[2629]: Host dbip64.net.caen has a waiting certificate request

Je liste le certificat en attente:

dbip63:/var/log# puppetca --list
dbip64.net.caen

Et je le signe:

dbip63:/var/log# puppetca --sign dbip64.net.caen
Signed dbip64.net.caen

Je relance le test côté client:

dbip64:/etc/puppet# puppetd --test --waitforcert 60
warning: peer certificate won't be verified in this SSL session
notice: Got signed certificate
info: Retrieving plugins
err: /File[/var/lib/puppet/lib]: Failed to generate additional resources during transaction: Cannot access mount[plugins]
err: /File[/var/lib/puppet/lib]: Failed to retrieve current state of resource: Cannot access mount[plugins] Could not describe /plugins: Cannot access mount[plugins]
err: Could not retrieve catalog: Could not parse for environment production: Could not find file /etc/puppet/manifests/site.pp
warning: Not using cache on failed catalog

Quelques messages d'erreurs dont on va se débarasser par la suite mais aupravant je modifie le fichier fileserver.conf sur le serveur:

dbip63:/etc/puppet# cat fileserver.conf |egrep -v '^#|^$'
[files]
  path /etc/puppet/files
allow 192.168.0.0/24
[plugins]
allow 192.168.0.0/24

Et je vais créer un premier manifest toujours sur le serveur pour faire quelques tests:

dbip63:/etc/puppet/manifests# cat site.pp
# fichier /etc/puppet/manifests/site.pp sur puppetmaster

class miseajour_class {
    Exec { path => "/usr/bin:/bin:/usr/sbin:/sbin" }
    exec { "apt-get update && apt-get dist-upgrade > /tmp/maj": }
}

node "dbip64.net.caen" {
    include miseajour_class
}

On retrouve un peu la syntaxe de cfengine avec les déclarations de classes. Dans ce cas seul le client dbip64 est concerné mais on peut faire plus fort:

On peut par exemple définir un node allmachines qui inclue par défaut certaines classes :

node allmachines {
 # includes generic classes
 include miseajour_class, autreclasse, etc
}

Et réutiliser celui-ci pour un node spécifique:

node "dbip64.net.caen" inherits allmachine {
 include une_classe_specifique_a_la_machine
}


Je redémarre le serveur pour prise en compte des modifs:


dbip63:/etc/puppet/manifests# /etc/init.d/puppetmaster restart
Restarting puppet configuration management tool master server.


Côté client je corrige quelques droits et je lance le test:

dbip64:/var/lib/puppet# ll
total 20
drwxr-xr-x  5 puppet puppet 4096 jan 22 15:52 .
drwxr-xr-x 16 root   root   4096 jan 22 15:52 ..
drwxr-xr-x  2 root   root   4096 jan 22 15:52 lib
drwxrwx--x  6 root   root   4096 jan 22 15:52 ssl
drwxr-xr-t  2 root   root   4096 jan 22 16:20 state

dbip64:/var/lib/puppet# chown -R puppet:puppet *


dbip64:/var/lib/puppet# puppetd --test
info: Retrieving plugins
err: /File[/var/lib/puppet/lib]: Failed to retrieve current state of resource: can't convert nil into String Could not describe /plugins: can't convert nil into String
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/miseajour_class/Exec[apt-get update && apt-get dist-upgrade > /tmp/maj]/returns: executed successfully
notice: Finished catalog run in 13.77 seconds

A priori tout se passe bien, je vérifie:

dbip64:/var/lib/puppet# cat /tmp/maj
Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


Je vais améliorer la procédure: un mail incluant le nom de la machine sera envoyé suite à la simulation de la mise à jour:

dbip63:/etc/puppet/manifests# cat site.pp
# fichier /etc/puppet/manifests/site.pp sur puppetmaster

class miseajour_class {
    Exec { path => "/usr/bin:/bin:/usr/sbin:/sbin" }
    exec { "apt-get update && apt-get dist-upgrade -s | mail -s 'rapport $machine' postmaster@net.caen": }
}

node "dbip64.net.caen" {
    $machine="dbip64.net.caen"
    include miseajour_class
}

Je redémarre le serveur et vais lancer le test sur le client:

dbip64:/tmp# puppetd --test
info: Retrieving plugins
err: /File[/var/lib/puppet/lib]: Failed to retrieve current state of resource: can't convert nil into String Could not describe /plugins: can't convert nil into String
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/miseajour_class/Exec[apt-get update && apt-get dist-upgrade -s | mail -s 'rapport dbip64.net.caen' postmaster@net.caen]/returns: executed successfully
notice: Finished catalog run in 5.02 seconds

Ca semble correct et je vais vérifier la boite mail de postmaster@net.caen  :

From: root <root@dbip64.net.caen>
To: postmaster@net.caen
Subject: rapport dbip64.net.caen

Reading package lists...
Building dependency tree...
Reading state information...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Ok ça fonctionne bien MAIS je n'aime pas le message d'erreur: Failed to retrieve ....


Première solution: vu que le message est lié aux plugins, il y a de fortes chances qu'en mettant la directive pluginsync=false ça se calme.

Effectivement plus de message d'erreurs après avoir modifié /etc/puppet/puppet.conf sur le client et le serveur:

dbip64:/var/lib/puppet/lib# puppetd --test -v
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/miseajour_class/Exec[apt-get update && apt-get dist-upgrade -s | mail -s 'rapport dbip64.net.caen' postmaster@net.caen]/returns: executed successfully
notice: Finished catalog run in 3.55 seconds

Idem côté serveur (extrait de /var/log/syslog):

Avant modif:
Jan 22 17:03:20 dbip63 puppetmasterd[3192]: Starting Puppet server version 0.24.5
Jan 22 17:43:57 dbip63 puppetmasterd[3192]: Could not call: can't convert nil into String
Jan 22 17:43:58 dbip63 puppetmasterd[3192]: Compiled catalog for dbip64.net.caen in 0.00 seconds
Jan 22 17:50:50 dbip63 puppetmasterd[3192]: Reparsing /etc/puppet/puppet.conf
Jan 22 17:50:53 dbip63 puppetmasterd[3192]: Caught TERM; shutting down
Jan 22 17:50:53 dbip63 puppetmasterd[3192]: Shutting down

Après modif:
Jan 22 17:50:55 dbip63 puppetmasterd[3245]: Reopening log files
Jan 22 17:50:55 dbip63 puppetmasterd[3245]: Starting Puppet server version 0.24.5
Jan 22 17:51:14 dbip63 puppetmasterd[3245]: Compiled catalog for dbip64.net.caen in 0.02 seconds


Reste que cette directive n'est pas là pour faire joli et qu'il faudra se pencher un peu plus sur le problème. Je verrais plus tard...

Continuons un peu: on peut définir des environnements et des scripts spécifiques à chacun de ceux-ci:

exemple: côté serveur:

dbip63:/etc/puppet/manifests/# mkdir dev prod


dbip63:/etc/puppet/manifests/dev# cat /etc/puppet/puppet.conf
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#pluginspath=$vardir/lib/plugins
#pluginsync=true
environments=production,development

[puppetmasterd]

templatedir=/var/lib/puppet/templates

[production]
manifest = /etc/puppet/manifests/prod/site.pp

[development]
manifest = /etc/puppet/manifests/dev/site.pp

J'ai donc créé 2 sous-répertoires dans /etc/puppet/manifests dans lesquels j'ai recopié le script site.pp en modifiant simplement le sujet du mail.

dbip63:/etc/puppet/manifests/prod# cat site.pp |grep mail
exec { "apt-get update && apt-get dist-upgrade -s | mail -s 'rapport prod $machine' postmaster@net.caen": }

dbip63:/etc/puppet/manifests/dev# cat site.pp |grep mail
exec { "apt-get update && apt-get dist-upgrade -s | mail -s 'rapport dev $machine' postmaster@net.caen": }


Côté client, je vais déclarer dbip64 en environnement production. (attention il n'y a pas de faute de frappe et il faut bien lire environment)

dbip64:/etc/puppet# cat puppet.conf
[puppetd]
server = dbip63.net.caen

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#pluginsync=true
environment=production

[puppetmasterd]
templatedir=/var/lib/puppet/templates



Je teste:


dbip64:/var/lib/puppet/lib# puppetd --test
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/miseajour_class/Exec[apt-get update && apt-get dist-upgrade -s | mail -s 'rapport prod dbip64.net.caen' postmaster@net.caen]/returns: executed successfully
notice: Finished catalog run in 5.66 seconds

Je vois que le sujet du mail contient bien prod, donc c'est bien le script /etc/puppet/manifests/prod/site.pp qui a été exécuté sur le serveur.

Je modifie puppet.conf sur le client en mettant la directive : environments=development

dbip64:/etc/puppet# puppetd --test
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/miseajour_class/Exec[apt-get update && apt-get dist-upgrade -s | mail -s 'rapport dev dbip64.net.caen' postmaster@net.caen]/returns: executed successfully
notice: Finished catalog run in 3.53 seconds

C'est bon.

Je vais maintenant télédistribuer un fichier: je déclare donc une nouvelle classe tarball_class. (Pour la suite je reste dans l'environnement dev)

dbip63:/etc/puppet/manifests/dev# cat site.pp
# fichier /etc/puppet/manifests/site.pp sur puppetmaster

class miseajour_class {
    Exec { path => "/usr/bin:/bin:/usr/sbin:/sbin" }
    exec { "apt-get update && apt-get dist-upgrade -s | mail -s 'rapport dev $machine' postmaster@net.caen": }
}

class tarball_class {
    file { "fichier.tgz":
    name => $operatingsystem? {
        default => "/usr/local/src/fichier.tgz"
    },
    owner => root,
    mode => 440,
    source => "puppet://dbip63.net.caen/files/tarballs/fichier.tgz"
    }
}

node "dbip64.net.caen" {
    $machine="dbip64.net.caen"
    #include miseajour_class
    include tarball_class
}

Pour éviter de balancer des mails et un apt-get update à chaque fois, je mets en remarque la classe miseajour_class et je crée le fichier suivant sur le serveur:

dbip63:/etc/puppet/files# ll tarballs/
total 16
drwxr-xr-x 2 root root 4096 jan 22 18:45 .
drwxr-xr-x 3 root root 4096 jan 22 18:44 ..
-rw-r--r-- 1 root root 5360 jan 22 18:45 fichier.tgz

Côté client je relance puppet:

dbip64:/etc/puppet# cd /usr/local/src

dbip64:/usr/local/src# ll
total 288
drwxrwsr-x  2 root staff   4096 mai  8  2008 .
drwxrwsr-x 11 root staff   4096 mai  8  2008 ..
-rw-r--r--  1 root staff 279331 mai  8  2008 open-iscsi-2.0-869.1.tar.gz

dbip64:/usr/local/src# puppetd --test
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
notice: //Node[dbip64.net.caen]/tarball_class/File[fichier.tgz]/ensure: created
notice: Finished catalog run in 0.24 seconds

dbip64:/usr/local/src# ll
total 296
drwxrwsr-x  2 root staff   4096 jan 22 18:57 .
drwxrwsr-x 11 root staff   4096 mai  8  2008 ..
-r--r-----  1 root root    5360 jan 22 18:57 fichier.tgz
-rw-r--r--  1 root staff 279331 mai  8  2008 open-iscsi-2.0-869.1.tar.gz

Impec: le fichier est bien arrivé avec les bons droits (440).


Il est également possible de travailler avec des templates ce qui se révèle très utile si on a besoin de télédistribuer un fichier presque identique sur chaque machine à quelques variables près.

Sur le serveur, je vais créer une classe comme ceci dans le fichier /etc/puppet/manifests/dev/site.pp

class majme_class {
    file { "/usr/local/me":
    owner => root,
    group => root,
    mode => 644,
    content => template("me.erb")
    }
}


et modifier la classe du node en passant un tableau de variables en paramètre ($values)



node "dbip64.net.caen" {
    $machine="dbip64.net.caen"
    $values = [valeur1, valeur2]
    #include miseajour_class
    include tarball_class
    include majme_class
}

Le template sera écrit comme suit:

dbip63:/etc/puppet/manifests/dev# cat /var/lib/puppet/templates/me.erb

<% values.each do |val| -%>
Valeur variable  <%= val %>               
<% end -%>


Résultat:

dbip64:/usr/local# puppetd --test
info: Caching catalog at /var/lib/puppet/state/localconfig.yaml
notice: Starting catalog run
warning: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/checksum: File /usr/local/me does not exist -- cannot checksum
notice: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/checksum: defined 'checksum' as '{md5}18372187b5c7008c2719b6865fa56486'
notice: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/content: created file with contents {md5}76f22fcd36b92a081aef0316564c1a59
notice: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/owner: defined 'owner' as 'root'
notice: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/group: defined 'group' as 'root'
notice: //Node[dbip64.net.caen]/majme_class/File[/usr/local/me]/mode: defined 'mode' as '644'
notice: Finished catalog run in 0.19 seconds

dbip64:/usr/local# cat me
 
Valeur variable  valeur1
 
Valeur variable  valeur2


Je peux également utiliser les valeurs retournées par la commande facter (par exemple le nom d'hôte fqdn est donnée par la variable réservée ... fqdn oui oui :)

dbip63:/etc/puppet/manifests/dev# cat /var/lib/puppet/templates/me.erb
<% values.each do |val| -%>
Valeur variable  <%= val %> <%= fqdn %>
<% end -%>

A l'arrivée:

dbip64:/usr/local# puppetd --test
...
dbip64:/usr/local# cat me
 
Valeur variable  valeur1 dbip64.net.caen
 
Valeur variable  valeur2 dbip64.net.caen


La mise en route définitive s'effectuera en démarrant puppetd en temps que démon sur le client qui ira vérifier à intervalle régulier (environ 30 mn) sur le serveur s'il existe une modification.


Voilà c'est fini pour aujourd'hui. Je n'ai, bien sûr, couvert dans cet article qu'une infime partie des possibilités offertes par cet outil vraiment bien pensé mais je vous laisse le soin de développer.


Quelques liens et définitions:

http://blogpmenier.dynalias.net/index.php?post/2007/07/01/134-cfengine-installation-debian-etch

http://www.cfengine.org/
http://www.it-sudparis.eu/s2ia/user/procacci/Doc/cfengine/cfengine.html


http://reductivelabs.com/trac/puppet/

http://www.octopuce.fr/Puppet-Administration-systeme-centralisee


ERB — Ruby Templating

Introduction

ERB provides an easy to use but powerful templating system for Ruby. Using ERB, actual Ruby code can be added to any plain text document for the purposes of generating document information details and/or flow control.

How does Puppet compare to cfengine?

Puppet could be said to be the next-generation cfengine. The overall design is heavily influenced by cfengine, but the language is more powerful than cfengine's and the library is more flexible. In addition, Puppet's client and server use standard protocols like XMLRPC and are easy to enhance with new functionality, so they are well-positioned to become the platform for the network applications of the future, while cfengine's client and server rely entirely on cfengine-specific protocols and are quite difficult to enhance.