Aller au contenu
Infrastructure as Code medium

Exploiter Chef sans serveur : l'architecture pérenne

12 min de lecture

Logo Chef

Le Chef Infra Server open source est en fin de vie fin 2026. La question devient donc concrète : que perd-on vraiment sans lui ? La réponse surprend. La convergence planifiée, la correction automatique de dérive et la promotion d'une version en production ne dépendent pas du serveur. Ce module monte l'architecture sans serveur de bout en bout et la prouve : une machine sabotée se répare seule en 112 secondes, sans qu'aucun serveur n'existe. Vous verrez aussi, sans détour, ce qui n'est pas remplaçable. Public visé : avancés qui veulent une base pérenne.

  • Exporter une policy en archive autonome.
  • Distribuer la policy par un dépôt d'artefacts.
  • Corriger la dérive sans serveur.
  • Promouvoir une version sans serveur.

Ce que le serveur apportait, et ce qui le remplace

Section intitulée « Ce que le serveur apportait, et ce qui le remplace »

Commençons par le tri, car beaucoup de monde croit le serveur indispensable là où il ne l'est pas.

Capacité du serveurRemplaçable sans serveur ?
Distribuer les cookbooksOui : archive autonome sur un dépôt d'artefacts
Convergence planifiéeOui : un timer systemd sur le nœud
Corriger la dériveOui : c'est la convergence planifiée qui le fait
Promouvoir une versionOui : on publie une nouvelle archive
Rechercher dans le parc (search)Non : exige un index des nœuds
Inventaire centraliséNon : exige un collecteur
chef-vault (secrets par nœud)Non : exige les clés publiques des nœuds

Quatre capacités sur sept se passent du serveur, et ce sont précisément celles dont on se sert tous les jours. Les trois autres ont des substituts que nous verrons à la fin.

La commande chef export est la pièce maîtresse, et elle est étonnamment peu connue. Elle transforme une policy verrouillée en une archive complète et autoportante : les cookbooks, leurs dépendances, le verrouillage, et même la configuration client nécessaire.

Fenêtre de terminal
chef install # verrouille la policy
chef export Policyfile.rb export

Le résultat pèse quelques centaines de kilo-octets et contient tout :

export/
├── .cinc/config.rb ← la configuration client, générée
├── cookbook_artifacts/ ← les cookbooks, verrouillés par empreinte
├── policies/
├── policy_groups/
└── Policyfile.lock.json

L'archive porte même son mode d'emploi : cd export && cinc-client -z. Le drapeau -z (local mode) démarre un serveur Chef éphémère en mémoire, le temps de la convergence. Le nœud n'a rien à contacter.

La configuration générée est explicite sur le mécanisme :

policy_name 'web'
policy_group 'local'
use_policyfile true

Reste à faire arriver cette archive sur les nœuds. C'est exactement le problème que résolvent les dépôts d'artefacts, et vous en avez sûrement déjà un.

Le principe est celui de n'importe quelle livraison logicielle : la CI construit l'archive, la publie sous un numéro de version, et un pointeur désigne ce qui est en production.

policies/
├── web-1.0.0.tgz
├── web-1.1.0.tgz
└── web-prod.tgz → web-1.1.0.tgz

Un Nexus, un bucket S3, ou même un dépôt Git font parfaitement l'affaire. L'archive est immuable et versionnée : vous savez exactement ce qui tourne, et vous pouvez revenir en arrière en republiant l'ancienne.

Sur le nœud, un petit script fait le travail du serveur : il récupère l'archive publiée, ne la redéploie que si elle a changé (comparaison d'empreinte), puis converge.

#!/bin/sh
set -e
URL="https://artefacts.exemple.fr/policies/web-prod.tgz"
DEST=/var/chef-policy
tmp=$(mktemp -d)
curl -fsSL "$URL" -o "$tmp/policy.tgz"
# On ne redéploie que si l'archive a changé
new=$(sha256sum "$tmp/policy.tgz" | cut -d' ' -f1)
old=$(cat /var/lib/chef-policy.sha 2>/dev/null || echo none)
if [ "$new" != "$old" ]; then
rm -rf "$DEST" && mkdir -p "$DEST"
tar xzf "$tmp/policy.tgz" -C "$DEST"
echo "$new" > /var/lib/chef-policy.sha
fi
rm -rf "$tmp"
cd "$DEST" && exec /usr/bin/cinc-client -z

La comparaison d'empreinte n'est pas un détail : elle évite de réécrire l'arborescence à chaque passage, et elle vous dit quand la policy a changé.

Un timer systemd l'exécute périodiquement :

/etc/systemd/system/cinc-local.timer
[Unit]
Description=Convergence locale planifiée
[Timer]
OnBootSec=1min
OnUnitActiveSec=2min
RandomizedDelaySec=15s
[Install]
WantedBy=timers.target

Une planification qui tourne ne prouve rien. Cassons la machine, et ne faisons plus rien.

Fenêtre de terminal
sudo systemctl stop nginx
sudo rm -f /etc/nginx/conf.d/webstack.conf
inactive
conf SUPPRIMÉE

Le service est arrêté, sa configuration a disparu, et aucun serveur n'existe pour s'en apercevoir. On attend.

cassé à 14:17:49
réparé à 14:19:41, soit 112 s plus tard
Fenêtre de terminal
systemctl is-active nginx
active

112 secondes, sans serveur, sans intervention. La dérive a une durée de vie maximale, et c'est vous qui la fixez, avec OnUnitActiveSec. La machine ne connaît d'ailleurs aucun serveur :

Fenêtre de terminal
sudo grep chef_server_url /etc/cinc/client.rb
# chef_server_url "https://CHEF.MYCOMPANY.COM/organizations/MY_CHEF_ORG"

La seule occurrence est une ligne commentée dans la configuration par défaut.

Il reste la promotion. Avec un serveur, on faisait chef push prod. Sans serveur, on publie une nouvelle archive et on déplace le pointeur :

Fenêtre de terminal
chef update # nouvelle révision
chef export Policyfile.rb export
# publication de web-1.1.0.tgz, puis :
ln -sfn web-1.1.0.tgz policies/web-prod.tgz

On ne touche à aucun nœud. À sa prochaine convergence, le nœud détecte que l'empreinte a changé, redéploie, et applique la nouvelle version :

Fenêtre de terminal
sudo cat /var/www/webstack/index.html
webstack v1.1.0 promue sans serveur

L'empreinte déployée sur le nœud correspond exactement à l'artefact publié :

nœud : e20981b6325deb379990ea2f17d7dbed68c5b8b3c63715940a6716eee39e980d
artefact : e20981b6325deb379990ea2f17d7dbed68c5b8b3c63715940a6716eee39e980d

Vous retrouvez donc la garantie des policy groups (« la production exécute exactement ce qui a été validé »), portée cette fois par le dépôt d'artefacts au lieu du serveur.

Ce qui n'est pas remplaçable, et par quoi le remplacer

Section intitulée « Ce qui n'est pas remplaçable, et par quoi le remplacer »

Soyons honnêtes sur les trois capacités qui exigent réellement un service central. Aucune n'est un obstacle, mais chacune demande un complément.

La recherche (search) suppose un index des nœuds. Sans serveur, un nœud ignore l'existence des autres. Le substitut naturel est un annuaire de services : Consul, etcd, ou simplement le DNS interne. En environnement cloud, les métadonnées de l'instance et les étiquettes jouent souvent ce rôle. Une recette peut interroger l'un ou l'autre exactement comme elle interrogeait le serveur.

L'inventaire centralisé (« quelles machines existent, dans quel état ? ») demande un collecteur. Chef sait émettre un rapport de convergence ; il suffit de l'envoyer vers une collecte de logs ou une base. Vous ne perdez pas la donnée, vous changez de destinataire.

Les secrets par nœud (chef-vault) reposent sur les clés publiques que seul un serveur conserve. Le substitut est meilleur que l'original : HashiCorp Vault, qui apporte en prime la rotation et les secrets dynamiques, deux choses que chef-vault ne sait pas faire. À défaut, un data bag chiffré avec une clé distribuée à l'installation reste utilisable.

L'architecture sans serveur échoue en silence, comme toute exécution planifiée. Voici les symptômes qui doivent vous alerter.

SymptômeCause probableSolution
La dérive n'est pas corrigéeLe timer n'est pas actifsystemctl list-timers puis les journaux de l'unité
Le nœud n'adopte pas la promotionL'empreinte n'a pas changéVérifier que le pointeur prod désigne bien la nouvelle archive
La convergence échoue en local modeL'archive est incomplèteLa régénérer avec chef export (jamais copier cookbooks/ à la main)
Une modification manuelle disparaîtComportement attenduTout changement doit être décrit dans un cookbook
Le dépôt d'artefacts satureTous les nœuds tirent en même tempsAjouter RandomizedDelaySec

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  1. Le serveur ne pousse jamais : c'est l'agent qui tire. On peut donc le remplacer, il suffit que la configuration soit ailleurs.
  2. chef export produit une archive autonome : cookbooks, verrouillage et configuration client, prête pour cinc-client -z.
  3. Un dépôt d'artefacts (Nexus, S3, Git) remplace la distribution du serveur, avec des versions immuables.
  4. Un timer systemd remplace la convergence planifiée : la dérive est corrigée en 112 secondes dans notre lab, sans aucun serveur.
  5. La promotion devient une republication : on déplace le pointeur, les nœuds suivent seuls. Le rollback est la même opération.
  6. Trois capacités exigent un complément : la recherche (Consul, DNS), l'inventaire (un collecteur), et les secrets par nœud (HashiCorp Vault, meilleur que chef-vault).
  7. Cette architecture ne dépend d'aucun composant en fin de vie : c'est la voie la plus pérenne.

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