
Un attribut est une valeur nommée, rangée hors des recettes, que celles-ci lisent via node['...']. Coder un port ou un chemin en dur dans une recette la rend rigide : impossible de la réutiliser sans l'éditer. Les attributs externalisent ces valeurs, et un système de priorités permet de les surcharger sans toucher au code. Ce guide définit des attributs par défaut, les lit dans une recette, puis les surcharge depuis le Policyfile. Public visé : lecteur ayant compris les recettes et le DSL. Testé avec CINC Client 19.3.14 et kitchen-dokken sur Ubuntu 24.04.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Définir des attributs par défaut dans
attributes/default.rb. - Lire un attribut dans une recette avec
node['...']. - Comprendre les niveaux de priorité des attributs.
- Surcharger un attribut proprement, sans éditer les recettes.
Prérequis
Section intitulée « Prérequis »- Les recettes et le DSL Ruby compris.
- Un cookbook avec la configuration dokken des guides précédents (
cinc generate cookbook siteweb, puis lekitchen.ymldokken).
Pourquoi des attributs
Section intitulée « Pourquoi des attributs »Reprenez une recette qui installe un site : le titre de la page et le chemin racine y sont écrits en dur. Le jour où vous voulez un second site, il faut dupliquer et éditer la recette. C'est exactement ce que les attributs évitent : la recette décrit la logique (créer un répertoire, y déposer une page), les attributs portent les valeurs (quel chemin, quel titre). On réutilise la même recette avec des valeurs différentes.
Définir des attributs par défaut
Section intitulée « Définir des attributs par défaut »Les attributs par défaut vivent dans attributes/default.rb. Créez ce fichier :
default['siteweb']['titre'] = "Mon site"default['siteweb']['racine'] = "/var/www/siteweb"default['siteweb']['port'] = 8080Chaque ligne déclare un attribut au niveau default, le plus bas. On les groupe sous une clé (siteweb) pour éviter les collisions avec d'autres cookbooks. Les clés sont des chaînes : gardez node['siteweb']['titre'] partout, jamais un mélange de chaînes et de symboles.
Lire un attribut dans une recette
Section intitulée « Lire un attribut dans une recette »Dans recipes/default.rb, remplacez les valeurs en dur par des lectures de node. La recette ne contient plus aucune valeur métier.
package "nginx"
directory node['siteweb']['racine'] do mode "0755"end
file "#{node['siteweb']['racine']}/index.html" do content "#{node['siteweb']['titre']}\n" mode "0644"end
service "nginx" do action [:enable, :start]endnode['siteweb']['racine'] fournit le chemin, node['siteweb']['titre'] le contenu. Convergez :
kitchen convergeConverging 4 resourcesRecipe: siteweb::default * apt_package[nginx] action install * directory[/var/www/siteweb] action create - create new directory /var/www/siteweb * file[/var/www/siteweb/index.html] action create - update content in file /var/www/siteweb/index.html from none to eab375 +Mon site * service[nginx] action enable (up to date) * service[nginx] action startInfra Phase complete, 4/5 resources updated in 03 secondsLe répertoire et le contenu proviennent bien des attributs. Vérifiez la page :
kitchen exec -c "cat /var/www/siteweb/index.html"Mon siteSurcharger un attribut
Section intitulée « Surcharger un attribut »Tout l'intérêt : changer une valeur sans éditer la recette ni le fichier d'attributs du cookbook. Le Policyfile est l'endroit propre pour ça. Ajoutez une ligne à la fin de Policyfile.rb :
default['siteweb']['titre'] = 'Site de production'Reconvergez : seule la page change, car seul son contenu voulu a changé.
kitchen converge * file[/var/www/siteweb/index.html] action create - update content in file /var/www/siteweb/index.html from eab375 to dbaa2b -Mon site +Site de productionInfra Phase complete, 1/5 resources updated in 01 secondsLa recette n'a pas bougé, seule la valeur a changé. C'est la promesse des attributs : un cookbook générique, des valeurs par déploiement.
Les niveaux de priorité
Section intitulée « Les niveaux de priorité »Un attribut peut être défini à plusieurs endroits. Chef applique un ordre de priorité ; en cas de conflit, le niveau le plus fort gagne. Les niveaux utiles au quotidien :
| Niveau | Où | Rôle |
|---|---|---|
default | attributes/default.rb, Policyfile | La valeur de base, la plus courante. |
override | Policyfile, recette | Forcer une valeur au-dessus des default. |
automatic | Ohai (collecté sur la machine) | Les faits du système, en lecture seule, toujours prioritaires. |
Un point pratique explique l'exemple précédent : au même niveau default, les attributs du Policyfile sont appliqués après ceux du cookbook, donc ils l'emportent. On surcharge donc proprement depuis le Policyfile sans jamais toucher attributes/default.rb.
Exercice : votre propre titre
Section intitulée « Exercice : votre propre titre »Surchargez une valeur vous-même. Cherchez la solution avant d'ouvrir la réponse.
Sans toucher à attributes/default.rb ni à la recette, faites afficher un titre de votre choix sur la page. Puis :
- convergez : une ressource doit être mise à jour ;
- convergez à nouveau : zéro ressource mise à jour.
Indice : tout se passe dans Policyfile.rb.
On surcharge l'attribut titre dans le Policyfile :
default['siteweb']['titre'] = 'Mon super site'À la convergence suivante, seule la page est réécrite :
* file[/var/www/siteweb/index.html] action create - update content in file /var/www/siteweb/index.htmlInfra Phase complete, 1/5 resources updated in 01 secondsUn second passage affiche 0/5 resources updated. La recette est restée générique : vous n'avez changé qu'une valeur.
À retenir
Section intitulée « À retenir »- Un attribut externalise une valeur hors des recettes ; la recette la lit via
node['...']. - Les attributs par défaut vivent dans
attributes/default.rb, au niveaudefault. - Groupez vos attributs sous une clé (
node['siteweb'][...]) et utilisez des clés chaînes partout. - L'ordre de priorité va de
defaultàoverridepuisautomatic(les faits Ohai, toujours prioritaires). - On surcharge proprement depuis le Policyfile : sa valeur
defaultl'emporte sur celle du cookbook, sans éditer les recettes.