Aller au contenu
Infrastructure as Code medium

Les attributs Chef

8 min de lecture

logo chef

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.

  • 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.
  • Les recettes et le DSL Ruby compris.
  • Un cookbook avec la configuration dokken des guides précédents (cinc generate cookbook siteweb, puis le kitchen.yml dokken).

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.

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'] = 8080

Chaque 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.

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]
end

node['siteweb']['racine'] fournit le chemin, node['siteweb']['titre'] le contenu. Convergez :

Fenêtre de terminal
kitchen converge
Converging 4 resources
Recipe: 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 start
Infra Phase complete, 4/5 resources updated in 03 seconds

Le répertoire et le contenu proviennent bien des attributs. Vérifiez la page :

Fenêtre de terminal
kitchen exec -c "cat /var/www/siteweb/index.html"
Mon site

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é.

Fenêtre de terminal
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 production
Infra Phase complete, 1/5 resources updated in 01 seconds

La 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.

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 :

NiveauRôle
defaultattributes/default.rb, PolicyfileLa valeur de base, la plus courante.
overridePolicyfile, recetteForcer une valeur au-dessus des default.
automaticOhai (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.

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.

  • 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 niveau default.
  • Groupez vos attributs sous une clé (node['siteweb'][...]) et utilisez des clés chaînes partout.
  • L'ordre de priorité va de default à override puis automatic (les faits Ohai, toujours prioritaires).
  • On surcharge proprement depuis le Policyfile : sa valeur default l'emporte sur celle du cookbook, sans éditer les recettes.

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