
Une ressource déclare un état voulu : un paquet installé, un dossier présent, un fichier avec le bon contenu, un service démarré. Tout Chef repose là-dessus : vous décrivez ce qui doit être, jamais la suite de commandes pour y arriver. Ce guide présente les ressources les plus courantes (package, directory, file, service), la différence entre propriétés et actions, et prouve que chacune est idempotente. Public visé : débutant ayant réussi son premier cookbook. 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 »- Comprendre l'anatomie d'une ressource : type, nom, propriétés, actions.
- Utiliser les ressources courantes :
package,directory,file,service. - Distinguer ce qui est une propriété de ce qui est une action.
- Vérifier l'idempotence ressource par ressource.
Prérequis
Section intitulée « Prérequis »- Votre premier cookbook réussi (vous savez lancer
kitchen converge). - CINC Workstation et Docker installés.
Préparer le cookbook
Section intitulée « Préparer le cookbook »On repart d'un cookbook neuf, avec la même configuration dokken que dans le premier guide.
-
Générer le cookbook :
Fenêtre de terminal cd ~/chef-webserver/cookbookscinc generate cookbook sitewebcd siteweb -
Remplacer
kitchen.ymlpar la configuration dokken (identique au premier guide) :---driver:name: dokkenchef_version: "19.3.14"chef_image: cincproject/cincprovisioner:name: dokkenproduct_name: cinctransport:name: dokkenverifier:name: inspecplatforms:- name: ubuntu-24.04driver:image: dokken/ubuntu-24.04suites:- name: defaultrun_list:- recipe[siteweb::default]
L'anatomie d'une ressource
Section intitulée « L'anatomie d'une ressource »Toute ressource suit la même forme : un type, un nom, un bloc de propriétés, et une ou plusieurs actions.
type "nom" do propriété valeur action :quelque_choseend- Le type dit quoi gérer :
package,file,service... - Le nom identifie la cible : un nom de paquet, un chemin de fichier.
- Les propriétés décrivent l'état voulu : le contenu, le mode, le propriétaire.
- L'action dit quoi faire : installer, créer, démarrer. Chaque ressource a une action par défaut (installer pour
package, créer pourfileetdirectory).
Vous ne décrivez jamais « comment » : Chef choisit le bon outil (apt, systemd...) selon la machine.
La palette de ressources courantes
Section intitulée « La palette de ressources courantes »Vous n'aurez besoin que d'une poignée de ressources au quotidien. Les voici, avec ce qu'elles gèrent.
| Ressource | Gère | Exemple de nom |
|---|---|---|
package | Un paquet système | "nginx" |
directory | Un répertoire | "/var/www/site" |
file | Un fichier et son contenu | "/etc/motd" |
service | Un service système | "nginx" |
template | Un fichier généré depuis un modèle | "/etc/nginx/nginx.conf" |
execute | Une commande ponctuelle | "reload-sysctl" |
user / group | Un compte ou un groupe | "www-data" |
Les ressources template et execute ont leurs propres subtilités, traitées dans des guides dédiés. Concentrons-nous sur les quatre premières.
Écrire une recette avec plusieurs ressources
Section intitulée « Écrire une recette avec plusieurs ressources »Ouvrez recipes/default.rb et enchaînez un paquet, un répertoire, un fichier et un service. Remarquez les propriétés owner, group, mode sur le répertoire et le fichier.
package "nginx"
directory "/var/www/site" do owner "www-data" group "www-data" mode "0755"end
file "/var/www/site/index.html" do content "Bienvenue sur mon site\n" owner "www-data" group "www-data" mode "0644"end
service "nginx" do action [:enable, :start]endDeux points importants. Le mode est entre guillemets ("0755") : un mode non quoté serait interprété en décimal par Ruby et donnerait de mauvaises permissions. Et le service déclare deux actions d'un coup, [:enable, :start] : activer au démarrage, puis démarrer maintenant.
Converger et lire le résultat
Section intitulée « Converger et lire le résultat »Appliquez la recette :
kitchen convergeConverging 4 resourcesRecipe: siteweb::default * apt_package[nginx] action install - install version 1.24.0-2ubuntu7.13 of package nginx * directory[/var/www/site] action create - create new directory /var/www/site - change mode from '' to '0755' - change owner from '' to 'www-data' - change group from '' to 'www-data' * file[/var/www/site/index.html] action create - create new file /var/www/site/index.html - change mode from '' to '0644' - change owner from '' to 'www-data' - change group from '' to 'www-data' * service[nginx] action enable (up to date) * service[nginx] action start - start service service[nginx]Infra Phase complete, 4/5 resources updated in 03 secondsChaque ligne - change ... montre ce que Chef a corrigé pour atteindre l'état voulu : le mode, le propriétaire, le groupe. Vérifiez les permissions réelles :
kitchen exec -c "stat -c '%a %U:%G %n' /var/www/site /var/www/site/index.html"755 www-data:www-data /var/www/site644 www-data:www-data /var/www/site/index.htmlL'idempotence, ressource par ressource
Section intitulée « L'idempotence, ressource par ressource »Relancez la convergence : rien ne doit changer.
kitchen convergeInfra Phase complete, 0/5 resources updated in 01 secondsC'est le cœur du modèle : Chef évalue chaque ressource séparément, compare l'état courant à l'état voulu, et n'agit que sur l'écart. Au premier passage, le service affichait déjà enable (up to date) : il était activé par l'installation du paquet, Chef ne l'a pas retouché. Une ressource déjà conforme est laissée telle quelle, toujours.
Contrôler la version d'un paquet
Section intitulée « Contrôler la version d'un paquet »Par défaut, package "nginx" installe la version la plus récente proposée par le dépôt. En production, on veut souvent figer une version précise pour que toutes les machines soient identiques et qu'une mise à jour ne surgisse pas par surprise. La propriété version de la ressource package sert exactement à ça.
La valeur attendue est la chaîne de version exacte du gestionnaire de paquets, pas un simple numéro. Trouvez-la avec apt-cache madison (Debian/Ubuntu) ou dnf list (RHEL) :
apt-cache madison treetree | 2.2.1-1 | ... trixie/main amd64 PackagesOn reporte cette chaîne dans la ressource. Chef installe alors cette version-là, ni plus récente ni plus ancienne :
package "tree" do version "2.2.1-1" action :installendLa convergence confirme la version posée, et le second passage ne touche à rien :
* apt_package[tree] action install - install version 2.2.1-1 of package treeInfra Phase complete, 1/1 resources updated in 02 secondsEmpêcher une mise à jour : le hold
Section intitulée « Empêcher une mise à jour : le hold »Figer la version à l'installation ne suffit pas : un apt upgrade lancé à la main écraserait votre version. Pour la verrouiller durablement, on pose un hold apt. Chef n'a pas de ressource dédiée, on passe par execute gardé par not_if pour rester idempotent :
execute "figer tree" do command "apt-mark hold tree" not_if "apt-mark showhold | grep -qx tree"endLe not_if est essentiel : sans lui, la commande se relancerait à chaque convergence et la ressource ne serait jamais « à jour ». Avec le garde, une fois le paquet en hold, Chef saute la commande. La preuve sur la machine :
apt-mark showhold# treeExercice : ajouter un répertoire de logs
Section intitulée « Exercice : ajouter un répertoire de logs »Étendez la recette. Cherchez la solution avant d'ouvrir la réponse.
Ajoutez un répertoire /var/www/site/logs, appartenant à www-data, en mode 0750 (lecture réservée au propriétaire et au groupe). Puis :
- convergez : une ressource doit être mise à jour ;
- convergez à nouveau : zéro ressource mise à jour.
Indice : c'est une ressource directory, comme celle du site.
On ajoute une ressource directory avec un mode plus strict :
directory "/var/www/site/logs" do owner "www-data" group "www-data" mode "0750"endPremière convergence après l'ajout :
* directory[/var/www/site/logs] action create - create new directory /var/www/site/logsInfra Phase complete, 1/6 resources updated in 01 secondsSeconde convergence : 0/6 resources updated. Le répertoire est créé une fois, puis plus rien. Chaque ressource ajoutée suit la même règle d'idempotence.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Une ressource déclare un état voulu, jamais une commande.
- Sa forme est toujours
type "nom" do ... end, avec des propriétés et une action. - Les quatre ressources du quotidien :
package,directory,file,service. - Une propriété décrit l'état (
mode,owner,content) ; une action décrit l'opération (:create,:start). - Quotez toujours le
mode("0644"), sinon Ruby le lit en décimal. - Chaque ressource est idempotente : Chef n'agit que sur l'écart, prouvé par un second passage à 0 ressource mise à jour.
- La propriété
versiondepackageépingle une version exacte ; unapt-mark hold(gardé parnot_if) empêche sa mise à jour.