Aller au contenu
Infrastructure as Code medium

Gérer les dépendances de cookbooks avec les Policyfiles

6 min de lecture

logo chef

Un cookbook réutilise rarement du code seul : il dépend de cookbooks communautaires. Sans verrouillage, deux convergences peuvent tirer des versions différentes de ces dépendances et diverger en silence. Les Policyfiles règlent le problème : vous déclarez une source et des contraintes de version, chef install résout tout et fige les versions exactes dans le Policyfile.lock.json. Ce guide montre comment déclarer une dépendance du Supermarket, poser une contrainte, et mettre à jour proprement. Testé avec CINC Workstation 26.1.0.

  • Déclarer une source de cookbooks (Supermarket, Git, chemin local).
  • Poser une contrainte de version sur une dépendance.
  • Verrouiller les versions résolues avec chef install.
  • Mettre à jour une dépendance avec chef update.

Le Policyfile.rb déclare chercher les cookbooks externes avec default_source. La source la plus courante est le Supermarket, le dépôt public de cookbooks communautaires, mais on peut aussi pointer un dépôt Git ou un chemin local.

Policyfile.rb
name 'webstack_demo'
default_source :supermarket
run_list 'webstack_demo::default'
cookbook 'webstack_demo', path: '.'

Ici, default_source :supermarket va chercher les dépendances sur le Supermarket, tandis que cookbook 'webstack_demo', path: '.' force l'usage du code local pour le cookbook en cours de développement.

Une dépendance se déclare dans le metadata.rb du cookbook, avec le mot-clé depends. On y ajoute une contrainte de version pour éviter qu'une montée de version majeure ne casse silencieusement la convergence.

metadata.rb
name 'webstack_demo'
version '0.1.0'
depends 'logrotate', '= 3.0.28'

La recette consomme ensuite ce cookbook communautaire :

recipes/default.rb
include_recipe 'logrotate::default'

chef install lit les contraintes, résout les dépendances depuis la source, et écrit le résultat dans le Policyfile.lock.json.

Fenêtre de terminal
chef install
Building policy webstack_demo
Expanded run list: recipe[webstack_demo::default]
Caching Cookbooks...
Installing webstack_demo >= 0.0.0 from path
Installing logrotate 3.0.28
Lockfile written to Policyfile.lock.json

Le lock épingle chaque cookbook à une version et une source précises. On y lit que logrotate vient du Supermarket (artifactserver) et que le cookbook local vient du chemin (path) :

{
"cookbook_locks": {
"webstack_demo": { "version": "0.1.0", "source_options": { "path": "." } },
"logrotate": { "version": "3.0.28", "source_options": { "artifactserver": "..." } }
}
}

Quand vous voulez faire évoluer les versions, vous relâchez la contrainte puis lancez chef update, qui re-résout et réécrit le lock.

  1. Assouplir la contrainte dans le metadata.rb :

    depends 'logrotate', '~> 3.0'
  2. Re-résoudre avec chef update :

    Fenêtre de terminal
    chef update
  3. Vérifier que le lock a bougé. La dépendance passe de la version épinglée à la plus récente compatible :

    3.0.28 -> 3.0.30

Le revision_id du lock change aussi : c'est un nouvel artefact de politique, à retester avant de le promouvoir en production. chef update sans argument re-résout toutes les dépendances ; c'est l'équivalent d'un rafraîchissement complet du lock.

SymptômeCause probableSolution
Unable to satisfy ... required byContrainte impossible (version inexistante)Vérifier les versions publiées sur le Supermarket, ajuster la contrainte
Le lock ne change pas après édition du metadata.rbchef install respecte le lock existantLancer chef update pour re-résoudre
chef update logrotate échoueupdate attend un Policyfile, pas un nom de cookbookLancer chef update (sans argument)
Convergences divergentes entre machinesLock non versionné dans GitCommitter Policyfile.lock.json et déployer ce lock partout
  • default_source déclare où trouver les cookbooks : Supermarket, Git ou chemin local.
  • Les dépendances et leurs contraintes se déclarent dans le metadata.rb (depends).
  • = X.Y.Z épingle une version exacte, ~> 3.0 autorise les correctifs sans la majeure suivante.
  • chef install résout et fige les versions dans le lock ; il respecte un lock existant.
  • chef update re-résout après un changement de contrainte : c'est lui qui fait évoluer les versions.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn