Beryl::Apply::Executor
Déroule des recettes déjà ordonnées (cf. Resolver) : pour chaque
recette, chaque step est dispatché vers sa primitive. Les valeurs
string des params sont interpolées ({{ var }}) à partir des
arguments/parameters de la recette.
Idempotence : c'est chaque primitive qui lit l'état réel et décide
skip/apply. En dry_run, rien n'est modifié.
Stop net sur erreur (décision de design) : un step qui échoue
(SSH::CommandFailed) est marqué failed, le déroulé s'arrête, le
rapport partiel est retourné. L'opérateur corrige et relance —
l'idempotence skippe ce qui était déjà OK.