Aller au contenu
Infrastructure as Code medium

Les ressources Chef, la brique de base

9 min de lecture

logo chef

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.

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

On repart d'un cookbook neuf, avec la même configuration dokken que dans le premier guide.

  1. Générer le cookbook :

    Fenêtre de terminal
    cd ~/chef-webserver/cookbooks
    cinc generate cookbook siteweb
    cd siteweb
  2. Remplacer kitchen.yml par la configuration dokken (identique au premier guide) :

    ---
    driver:
    name: dokken
    chef_version: "19.3.14"
    chef_image: cincproject/cinc
    provisioner:
    name: dokken
    product_name: cinc
    transport:
    name: dokken
    verifier:
    name: inspec
    platforms:
    - name: ubuntu-24.04
    driver:
    image: dokken/ubuntu-24.04
    suites:
    - name: default
    run_list:
    - recipe[siteweb::default]

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_chose
end
  • 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 pour file et directory).

Vous ne décrivez jamais « comment » : Chef choisit le bon outil (apt, systemd...) selon la machine.

Vous n'aurez besoin que d'une poignée de ressources au quotidien. Les voici, avec ce qu'elles gèrent.

RessourceGèreExemple de nom
packageUn paquet système"nginx"
directoryUn répertoire"/var/www/site"
fileUn fichier et son contenu"/etc/motd"
serviceUn service système"nginx"
templateUn fichier généré depuis un modèle"/etc/nginx/nginx.conf"
executeUne commande ponctuelle"reload-sysctl"
user / groupUn 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.

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

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

Appliquez la recette :

Fenêtre de terminal
kitchen converge
Converging 4 resources
Recipe: 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 seconds

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

Fenêtre de terminal
kitchen exec -c "stat -c '%a %U:%G %n' /var/www/site /var/www/site/index.html"
755 www-data:www-data /var/www/site
644 www-data:www-data /var/www/site/index.html

Relancez la convergence : rien ne doit changer.

Fenêtre de terminal
kitchen converge
Infra Phase complete, 0/5 resources updated in 01 seconds

C'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.

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

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

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