Puppet : contain vs include

Si votre code Puppet s’organise avec des rôles et des profiles (ce qui est très fortement recommandé), il y a de fortes chances que vous ayez du code ressemblant à ceci :

class roles::webserver {
   include profiles::base
   include profiles::apache
}

A l’exécution, surprise, l’ordre d’exécution n’est pas forcément celui attendu. Dans l’exemple ci-dessus, profiles::apache pourrait très bien passer avant.

Pour forcer l’ordre, on va donc utiliser des chaining arrows :

class roles::webserver {
   include profiles::base
   include profiles::apache

   Class['profiles::base'] ->
   Class['profiles::apache']
}

Cette approche se voit régulièrement et pose pourtant un problème de taille : l’ordre ne pas récursif, autrement dit il ne s’applique pas aux include que contiennent profiles::base et profiles::apache.

Ainsi, si profiles::apache inclut lui-même apache, il est tout fait possible que apache vienne s’exécuter avant ce qu’il y a dans profiles::base.

La bonne approche est d’utiliser le mot-clé contain qui, couplé avec les chaining arrows, garanti l’ordre d’exécution comme attendu (d’abord profiles::base puis profiles::apache) :

class roles::webserver {
   contain profiles::base
   contain profiles::apache

   Class['profiles::base'] ->
   Class['profiles::apache']
}

Note : si votre code est bien fait, la question de l’ordre d’exécution ne devrait pas se poser. Lorsque vous écrivez votre code, pensez à bien mettre un require/notify sur toutes les ressources qui dépendent de quelque chose.

Petite astuce pour vérifier que les dépendances (require et notify) sont correctement définies, exécuter Puppet avec l’option ordering à random. Avec cette option, Puppet « secoue tout » et, à chaque exécution, change l’ordre (en tenant compte des dépendances, heureusement :)). rspec-puppet a aussi un réglage pour activer ce comportement.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s