There was a flurry of Puppet Versus Chef in last week or so. I don’t want to go into sorting all the details at this time, but I hope I add perspective and clarity to one of the subtopics.
People complain that Puppet is non-deterministic.
On a certain level that is like complaining that threads are non-deterministic. That’s the way the model works by design. If there is logic that depends on the order of execution, that code needs mutex/syncronization. Threads create issues, but they also solve some.
Puppet places a high priority on specificity. When order matters, the relationship must be specified explicitly.
Chef manages resources in the order they are specified. (Is that explicit ordering or implicit? I can’t decide.)
Here’s why I think the dividing line is a reflection of worldview…
Puppet aspires to bring a system from whatever state into compliance with the specified state.
Chef puts a higher priority on starting with a newly provisioned image in a known state and bringing up specific services.
Puppet guarantees that order matters on the level that it is specified. Chef guarantees that if you start with the same input, you get the same output.
Different emphasis on preconditions leading to different solutions.
The difference between Puppet and Chef is small compared to the difference between traditional IT management approaches (READ: meatcloud) and either one.
Use your powers for awesome…