Well, CFEngine (especially 3.x, a third rewrite of the same basic idea) does
not show these trade-offs. It was designed from the ground up as a general
tool based on previous experiences with wide deployments, it (its codebase)
did not start as a script for solving some specific problem in some specific
workflow.
Puppet has similar history, I believe, as a tool that was written to replace
cfengine (2.x) without its shortcomings.
Puppet has similar history, I believe, as a tool that was written to replace cfengine (2.x) without its shortcomings.