
Une configuration qui varie selon la machine ne peut pas être un fichier figé : un template la génère à partir des attributs. Chef distingue deux ressources : cookbook_file dépose un fichier statique tel quel, template génère un fichier à partir d'un modèle ERB et de variables. Et grâce à notifies, on recharge le service uniquement quand sa configuration a changé. Ce guide construit une config nginx dynamique de bout en bout. Public visé : lecteur ayant compris les attributs Chef. 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époser un fichier statique avec
cookbook_file. - Générer une configuration avec la ressource
templateet des variables. - Injecter des valeurs dans un template ERB.
- Recharger le service uniquement quand la configuration change.
Prérequis
Section intitulée « Prérequis »- Les attributs Chef compris.
- Le cookbook
sitewebdes guides précédents, avec ses attributs et sa configuration dokken.
Fichier statique ou configuration dynamique ?
Section intitulée « Fichier statique ou configuration dynamique ? »Deux ressources déposent un contenu dans un fichier, pour deux besoins différents.
| Ressource | Contenu | Cas d'usage |
|---|---|---|
cookbook_file | Un fichier statique, copié tel quel | Un robots.txt, un script, un certificat public |
template | Un fichier généré depuis un modèle ERB | Une config qui dépend d'attributs (port, chemins) |
La règle : si le contenu est toujours le même, cookbook_file ; s'il dépend du node, template.
Déposer un fichier statique avec cookbook_file
Section intitulée « Déposer un fichier statique avec cookbook_file »Les fichiers statiques se rangent dans le dossier files/ du cookbook. Créez files/robots.txt :
User-agent: *Disallow:Puis, dans recipes/default.rb, déposez-le avec cookbook_file. La propriété source désigne le fichier dans files/, le nom de la ressource est le chemin de destination :
cookbook_file "#{node['siteweb']['racine']}/robots.txt" do source "robots.txt" mode "0644"endGénérer une configuration avec template
Section intitulée « Générer une configuration avec template »Les modèles se rangent dans le dossier templates/. Créez templates/nginx-siteweb.conf.erb, une config nginx où le port et la racine sont des trous à remplir :
server { listen <%= @port %>; server_name _; root <%= @racine %>; index index.html;}<%= @port %> et <%= @racine %> sont de l'ERB : <%= ... %> insère la valeur d'une variable. Ces variables ne sont pas magiques, on les passe explicitement à la ressource template :
template "/etc/nginx/conf.d/siteweb.conf" do source "nginx-siteweb.conf.erb" variables(port: node['siteweb']['port'], racine: node['siteweb']['racine']) notifies :reload, "service[nginx]", :delayedendLa propriété variables transmet un couple clé-valeur ; dans le template, la clé port devient @port. On alimente donc le template avec les attributs vus au guide précédent.
Recharger le service au changement
Section intitulée « Recharger le service au changement »La ligne clé est notifies :reload, "service[nginx]", :delayed. Elle dit : « quand cette ressource change, recharge le service nginx, à la fin du run ». Le :delayed regroupe les rechargements en une seule fois, après toutes les modifications. Déclarez la ressource service que le template notifie :
service "nginx" do action [:enable, :start]endConverger et vérifier
Section intitulée « Converger et vérifier »Appliquez la recette complète :
kitchen convergeConverging 6 resourcesRecipe: siteweb::default * apt_package[nginx] action install * directory[/var/www/siteweb] action create * file[/var/www/siteweb/index.html] action create * template[/etc/nginx/conf.d/siteweb.conf] action create - create new file /etc/nginx/conf.d/siteweb.conf +server { + listen 8080; + server_name _; + root /var/www/siteweb; + index index.html; +} * cookbook_file[/var/www/siteweb/robots.txt] action create - create new file /var/www/siteweb/robots.txt * service[nginx] action enable (up to date) * service[nginx] action start * service[nginx] action reload - reload service service[nginx]Infra Phase complete, 7/8 resources updated in 03 secondsLe template a rendu les attributs (listen 8080, root /var/www/siteweb), le fichier statique est déposé, et le service a été rechargé parce que la config a changé. Vérifiez que la page répond sur le port généré :
kitchen exec -c "curl -s localhost:8080"Mon siteLe reload ne se déclenche qu'au changement
Section intitulée « Le reload ne se déclenche qu'au changement »Relancez la convergence :
kitchen convergeInfra Phase complete, 0 resources updated in 01 secondsAucune ressource mise à jour, et surtout aucun reload : le template n'a pas changé, donc notifies n'a rien déclenché. C'est tout l'intérêt de la notification : on ne redémarre un service que lorsque c'est réellement nécessaire, jamais à chaque exécution.
Ranger fichiers et templates
Section intitulée « Ranger fichiers et templates »Chef sait où chercher grâce à deux dossiers conventionnels du cookbook.
siteweb/├── attributes/│ └── default.rb # les valeurs (port, racine...)├── files/│ └── robots.txt # source de cookbook_file├── templates/│ └── nginx-siteweb.conf.erb # source de template└── recipes/ └── default.rb # les ressourcesLa propriété source d'un cookbook_file se cherche dans files/, celle d'un template dans templates/. Vous n'indiquez que le nom du fichier, jamais le chemin complet dans le cookbook : Chef le résout tout seul.
Exercice : changer le port et déclencher un reload
Section intitulée « Exercice : changer le port et déclencher un reload »Prouvez que la notification fait bien son travail. Cherchez la solution avant d'ouvrir la réponse.
Faites passer le site sur le port 8090 sans toucher au template ni à la recette. Convergez : le template doit être réécrit et le service rechargé.
Indice : le port est un attribut ; surchargez-le comme au guide précédent.
On surcharge l'attribut port dans Policyfile.rb :
default['siteweb']['port'] = 8090À la convergence, le template change et le service est rechargé :
* template[/etc/nginx/conf.d/siteweb.conf] action create - listen 8080; + listen 8090; * service[nginx] action reload - reload service service[nginx]Infra Phase complete, 2/8 resources updated in 01 secondsUne seule valeur a changé, le template s'est régénéré, et notifies a rechargé nginx. C'est la chaîne complète : attribut, template, service.
À retenir
Section intitulée « À retenir »cookbook_filedépose un fichier statique (dansfiles/) ;templategénère un fichier depuis un modèle ERB (danstemplates/).- En ERB,
<%= valeur %>affiche,<% code %>exécute sans afficher. - La propriété
variablespasse les valeurs au template ; la cléportdevient@portdans le modèle. notifies :reload, "service[nginx]", :delayedrecharge le service seulement quand la ressource change.- L'idempotence tient : un second passage ne recharge pas un service dont la config n'a pas bougé.