Aller au contenu
Infrastructure as Code medium

Survivre dans un parc Chef legacy : roles, environments, Berkshelf

10 min de lecture

Logo Chef

Vous n'apprendrez pas Chef pour démarrer un projet neuf : dans neuf cas sur dix, vous héritez d'un parc existant. Et ce parc n'est pas écrit avec des Policyfiles : il utilise des roles, des environments et Berkshelf, trois mécanismes que les tutoriels modernes ne mentionnent même plus. Ce module vous apprend à les lire, à éviter leurs pièges (dont celui qui fait perdre une après-midi à tout le monde), et à décider s'il faut migrer ou cohabiter. Public visé : intermédiaires qui reprennent un dépôt Chef existant.

  • Lire un role et un environment.
  • Comprendre pourquoi une nouvelle version ne part pas.
  • Situer Berkshelf face aux Policyfiles.
  • Choisir entre migrer et cohabiter.

Avant les Policyfiles, Chef répartissait la configuration entre trois mécanismes, et un dépôt historique les mélange tous.

MécanismeCe qu'il porteSon remplaçant moderne
roleUn run-list et des attributs, par fonction de machineLe run_list du Policyfile
environmentDes contraintes de version de cookbooks, par étapeLe policy group
BerkshelfLa résolution des dépendances de cookbookschef install et le lock

Tout ce que faisaient ces trois mécanismes, le Policyfile le fait aujourd'hui seul, dans un fichier et un verrou. Mais tant que le parc n'est pas migré, il faut savoir les lire.

Un role décrit une fonction de machine : « un serveur web, c'est ce run-list et ces attributs ». Il vit dans un JSON.

{
"name": "web",
"chef_type": "role",
"run_list": ["recipe[webstack::default]"],
"default_attributes": {
"webstack": { "message": "posé par le rôle web" }
}
}

On le publie, puis on l'assigne à un nœud :

Fenêtre de terminal
knife role from file roles/web.json
knife node run_list set db-srv1 'role[web]'

Le nœud ne porte alors plus une recette, mais un rôle :

Run List: role[web]

À la convergence, Chef déplie le rôle. Regardez la première ligne, c'est elle qui explique tout :

Resolving cookbooks for run list: ["webstack::default"]

Le role[web] a disparu : il s'est transformé en la recette qu'il contenait. Un rôle n'est donc rien d'autre qu'un alias vers un run-list, plus des attributs.

L'environment : le piège qui coûte une après-midi

Section intitulée « L'environment : le piège qui coûte une après-midi »

Un environment porte les contraintes de version des cookbooks pour une étape donnée (recette, production).

{
"name": "production",
"chef_type": "environment",
"cookbook_versions": {
"webstack": "= 1.0.0"
}
}

Voici maintenant le scénario qui piège tout le monde. Vous corrigez un cookbook, vous le publiez, vous convergez... et rien ne change.

Fenêtre de terminal
knife cookbook upload webstack
knife cookbook list
webstack: 1.1.0

Le serveur a bien la 1.1.0. Pourtant, sur le nœud :

Synchronizing cookbooks:
- webstack (1.0.0)

Il continue d'appliquer la 1.0.0. Aucune erreur, aucun avertissement. Vous allez relire votre cookbook, vider des caches, douter de votre santé mentale.

La coupable est l'environment, qui épingle la version en silence :

Fenêtre de terminal
knife environment show production
cookbook_versions:
webstack: = 1.0.0

La sortie de secours consiste à desserrer la contrainte :

"cookbook_versions": { "webstack": "~> 1.1" }
Fenêtre de terminal
knife environment from file environments/production.json

À la convergence suivante, le nœud reçoit enfin la nouvelle version :

Synchronizing cookbooks:
- webstack (1.1.0)

Notez le glissement de responsabilité : dans le modèle historique, c'est l'environment qui décide de ce qui part en production. Avec un policy group, c'est une révision entière que l'on promeut, cookbooks compris. Le second est bien plus lisible.

Berkshelf résolvait les dépendances de cookbooks avant que chef install ne le fasse. Vous le reconnaîtrez à son Berksfile :

source 'https://supermarket.chef.io'
cookbook 'logrotate', '= 3.0.30'
Fenêtre de terminal
berks install
Resolving cookbook dependencies...
Fetching cookbook index from https://supermarket.chef.io...
Installing logrotate (3.0.30)

Il produit un Berksfile.lock, dont la parenté avec le Policyfile.lock.json saute aux yeux :

DEPENDENCIES
logrotate (= 3.0.30)
GRAPH
logrotate (3.0.30)

Même idée (résoudre puis verrouiller), même bénéfice. La différence est que le Policyfile verrouille tout en une fois (cookbooks et run-list et attributs) et produit une révision identifiable, là où Berkshelf ne verrouillait que les cookbooks.

La tentation du nouveau venu est de tout réécrire en Policyfiles dès la première semaine. C'est presque toujours une mauvaise idée : vous casseriez un parc qui marche, sans bien le comprendre.

La question à trancher est simple : qu'est-ce qui vous fait mal aujourd'hui ?

Si vous ne savez plus ce qu'une machine exécute (arbre de rôles imbriqués), ou si vous vous êtes déjà fait avoir par une contrainte d'environment silencieuse, la migration vers les Policyfiles vous rendra la vie meilleure. C'est exactement ce qu'ils sont venus corriger.

Si le parc tourne et que personne ne s'en plaint, la migration peut attendre. Elle se fait d'ailleurs progressivement : un Policyfile peut coexister avec des nœuds encore pilotés par des rôles, puisque le choix se fait nœud par nœud.

Les symptômes du modèle historique sont déroutants parce qu'ils sont silencieux.

SymptômeCause probableSolution
J'ai publié un cookbook, rien ne changeL'environment épingle l'ancienne versionknife environment show <env> avant tout
Impossible de savoir ce qu'une machine exécuteDes rôles imbriquésDérouler l'arbre, ou migrer vers un Policyfile
knife node run_list add sans effetLe nœud est en policy groupPasser par le Policyfile.rb
Un attribut ne vaut pas ce qu'on croitUn rôle le pose aussiChercher dans le rôle et dans le cookbook
berks introuvableIl est pourtant livré avec CINC WorkstationVérifier le PATH de l'outillage
  1. Un parc Chef existant utilise roles, environments et Berkshelf : trois mécanismes que le Policyfile remplace à lui seul.
  2. Un role est un alias vers un run-list : Chef le déplie à la convergence (role[web] devient webstack::default).
  3. Les rôles imbriqués rendent vite impossible de savoir ce qu'une machine exécute.
  4. Une contrainte d'environment est un verrou silencieux : le cookbook est publié, mais aucun nœud ne le reçoit. C'est le piège numéro un.
  5. Devant un « j'ai publié et rien ne change », regardez l'environment en premier.
  6. Berkshelf est l'ancêtre du lock, il fonctionne toujours : rien ne presse.
  7. Migrez parce que quelque chose vous fait mal, pas par principe. Un nœud en policy group ignore ses rôles : la bascule est franche, nœud par nœud.

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