
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.
Exercice : 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.
À 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.