
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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.
Prérequis
Section intitulée « Prérequis »- Votre premier cookbook réussi.
- Comprendre les Policyfiles et le rôle du lock.
Où Chef trouve les cookbooks : default_source
Section intitulée « Où Chef trouve les cookbooks : default_source »Le Policyfile.rb déclare où 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.
name 'webstack_demo'default_source :supermarketrun_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.
Déclarer une dépendance et une contrainte
Section intitulée « Déclarer une dépendance et une contrainte »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.
name 'webstack_demo'version '0.1.0'depends 'logrotate', '= 3.0.28'La recette consomme ensuite ce cookbook communautaire :
include_recipe 'logrotate::default'Résoudre et verrouiller avec chef install
Section intitulée « Résoudre et verrouiller avec chef install »chef install lit les contraintes, résout les dépendances depuis la source, et écrit le résultat dans le Policyfile.lock.json.
chef installBuilding policy webstack_demoExpanded run list: recipe[webstack_demo::default]Caching Cookbooks...Installing webstack_demo >= 0.0.0 from pathInstalling logrotate 3.0.28Lockfile written to Policyfile.lock.jsonLe 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": "..." } } }}Mettre à jour une dépendance
Section intitulée « Mettre à jour une dépendance »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.
-
Assouplir la contrainte dans le
metadata.rb:depends 'logrotate', '~> 3.0' -
Re-résoudre avec
chef update:Fenêtre de terminal chef update -
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.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Unable to satisfy ... required by | Contrainte 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.rb | chef install respecte le lock existant | Lancer chef update pour re-résoudre |
chef update logrotate échoue | update attend un Policyfile, pas un nom de cookbook | Lancer chef update (sans argument) |
| Convergences divergentes entre machines | Lock non versionné dans Git | Committer Policyfile.lock.json et déployer ce lock partout |
À retenir
Section intitulée « À retenir »default_sourcedé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.0autorise les correctifs sans la majeure suivante.chef installrésout et fige les versions dans le lock ; il respecte un lock existant.chef updatere-résout après un changement de contrainte : c'est lui qui fait évoluer les versions.