
Cookstyle relit vos cookbooks et signale erreurs de style, anti-patterns et code déprécié, avant même de converger. C'est un linter bâti sur RuboCop, enrichi de règles spécifiques à Chef, et déjà inclus dans CINC Workstation. Mieux : il corrige automatiquement la plupart des problèmes. Ce guide analyse un cookbook volontairement fautif, puis le nettoie d'une commande. Cookstyle est un outil statique : il tourne sur votre poste de travail, sans converger ni conteneur. Public visé : lecteur ayant structuré un cookbook. Testé avec Cookstyle 8.6.10 (CINC Workstation 26.1.0).
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lancer Cookstyle sur un cookbook.
- Lire et comprendre les avertissements.
- Corriger automatiquement avec
-a. - Intégrer Cookstyle dans votre flux de travail.
Prérequis
Section intitulée « Prérequis »- CINC Workstation installé (Cookstyle est fourni avec).
- Un cookbook, comme celui des guides précédents.
Cookstyle, le linter des cookbooks
Section intitulée « Cookstyle, le linter des cookbooks »Cookstyle repère deux familles de problèmes : le style (guillemets, indentation, syntaxe Ruby datée) et les spécificités Chef (modes de fichiers, propriétés dépréciées, anti-patterns de cookbook). Il ne modifie rien tant que vous ne le demandez pas : par défaut, il analyse et rapporte. Comme il ne fait qu'inspecter du code, il s'exécute instantanément sur votre poste, sans convergence ni machine cible.
Analyser un cookbook
Section intitulée « Analyser un cookbook »Prenons une recette qui accumule les défauts courants :
package "nginx" do action :installend
service "nginx" do action [:enable, :start] supports :status => true, :restart => trueend
file "/var/www/html/index.html" do content "Bonjour" mode 0644 owner "root"endLancez Cookstyle dans le dossier du cookbook :
cookstyle recipes/default.rbOffenses:
recipes/default.rb:1:9: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.package "nginx" do ^^^^^^^recipes/default.rb:7:12: C: [Correctable] Style/HashSyntax: Use the new Ruby 1.9 hash syntax. supports :status => true, :restart => true ^^^^^^^^^^recipes/default.rb:12:8: R: [Correctable] Chef/Style/FileMode: Use strings to represent file modes to avoid confusion between octal and base 10 integer formats mode 0644 ^^^^
1 file inspected, 8 offenses detected, 8 offenses autocorrectableChaque ligne indique où (fichier, ligne, colonne), la règle violée et un lien vers son explication. On y lit trois familles : Style/StringLiterals (préférer les guillemets simples), Style/HashSyntax (la syntaxe de hash moderne status: true), et surtout Chef/Style/FileMode, une règle propre à Chef qui refuse mode 0644 (ambigu entre octal et décimal). Le tag [Correctable] annonce que Cookstyle sait les réparer.
Corriger automatiquement
Section intitulée « Corriger automatiquement »L'option -a applique toutes les corrections sûres :
cookstyle -a recipes/default.rb1 file inspected, 8 offenses detected, 8 offenses correctedLa recette est réécrite proprement :
package 'nginx' do action :installend
service 'nginx' do action [:enable, :start] supports status: true, restart: trueend
file '/var/www/html/index.html' do content 'Bonjour' mode '644' owner 'root'endGuillemets simples, syntaxe de hash moderne, et mode '644' en chaîne. Relancez Cookstyle pour confirmer :
cookstyle recipes/default.rb1 file inspected, no offenses detectedConfigurer les règles
Section intitulée « Configurer les règles »Toutes les règles ne conviennent pas à tous les projets. Un fichier .rubocop.yml à la racine du cookbook ajuste le comportement, par exemple désactiver une règle ou exclure un dossier :
AllCops: NewCops: enable
Chef/Style/FileMode: Enabled: true
Style/StringLiterals: Enabled: falseGardez ces ajustements rares et justifiés : la configuration par défaut de Cookstyle encode les bonnes pratiques de l'écosystème Chef. Désactiver une règle doit rester l'exception.
Cookstyle dans le flux
Section intitulée « Cookstyle dans le flux »Cookstyle prend toute sa valeur en automatique, pas lancé à la main de temps en temps. La commande retourne un code non nul dès qu'il reste une offense, ce qui la rend idéale à deux endroits :
- en pre-commit : un hook lance
cookstyleavant chaque commit, bloquant le code fautif à la source ; - en CI : une étape
cookstyleéchoue la pipeline si un cookbook n'est pas propre.
Ainsi, le style n'est plus un débat en revue : la machine tranche, et chaque cookbook reste homogène.
Exercice : corriger votre cookbook
Section intitulée « Exercice : corriger votre cookbook »Mettez-le en pratique. Cherchez la solution avant d'ouvrir la réponse.
Dans une recette, écrivez volontairement une ressource file avec mode 0755 (entier octal) et des chaînes en guillemets doubles. Lancez Cookstyle, lisez les offenses, puis corrigez-les automatiquement. Vérifiez qu'il ne reste aucune offense.
Indice : deux commandes, cookstyle puis cookstyle -a.
Cookstyle signale d'abord Chef/Style/FileMode sur mode 0755 et Style/StringLiterals sur les guillemets doubles. La correction :
cookstyle -a recipes/default.rbAprès correction, mode '755' en chaîne et les guillemets simples partout. Un dernier cookstyle affiche no offenses detected. Vous venez d'automatiser ce qui, sinon, se discuterait en revue de code.
À retenir
Section intitulée « À retenir »- Cookstyle est le linter des cookbooks : style Ruby plus règles spécifiques à Chef, inclus dans la Workstation.
- Il est statique : il tourne sur le poste, sans converger ni conteneur.
cookstyleanalyse et rapporte ;cookstyle -aapplique les corrections sûres.- La règle
Chef/Style/FileModeimpose des modes en chaîne ('644'), pour éviter l'ambiguïté octal/décimal. - Automatisez-le en pre-commit et en CI : il retourne un code non nul tant qu'il reste une offense.