Aller au contenu
Infrastructure as Code medium

Cookstyle : linter ses cookbooks Chef

8 min de lecture

logo chef

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

  • Lancer Cookstyle sur un cookbook.
  • Lire et comprendre les avertissements.
  • Corriger automatiquement avec -a.
  • Intégrer Cookstyle dans votre flux de travail.

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.

Prenons une recette qui accumule les défauts courants :

package "nginx" do
action :install
end
service "nginx" do
action [:enable, :start]
supports :status => true, :restart => true
end
file "/var/www/html/index.html" do
content "Bonjour"
mode 0644
owner "root"
end

Lancez Cookstyle dans le dossier du cookbook :

Fenêtre de terminal
cookstyle recipes/default.rb
Offenses:
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 autocorrectable

Chaque ligne indique (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.

L'option -a applique toutes les corrections sûres :

Fenêtre de terminal
cookstyle -a recipes/default.rb
1 file inspected, 8 offenses detected, 8 offenses corrected

La recette est réécrite proprement :

package 'nginx' do
action :install
end
service 'nginx' do
action [:enable, :start]
supports status: true, restart: true
end
file '/var/www/html/index.html' do
content 'Bonjour'
mode '644'
owner 'root'
end

Guillemets simples, syntaxe de hash moderne, et mode '644' en chaîne. Relancez Cookstyle pour confirmer :

Fenêtre de terminal
cookstyle recipes/default.rb
1 file inspected, no offenses detected

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

Gardez 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 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 cookstyle avant 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.

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 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.
  • cookstyle analyse et rapporte ; cookstyle -a applique les corrections sûres.
  • La règle Chef/Style/FileMode impose 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.

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