When comparing Chef vs Puppet , the Slant community recommends Puppet for most people. In the question“What are the best configuration management tools?” Puppet is ranked 4th while Chef is ranked 5th. The most important reason people chose Puppet is:
You define the state the server should be in and Puppet transforms it that state. This is opposed to explicitly declaring a list of actions to be performed. If a developer wants more flexibility and control there's always the option of falling back to explicitly running commands but that's discouraged.
Ranked in these QuestionsQuestion Ranking
Pro Popular choice among large companies
Chef has an impressive list of companies using it's automation service. Among them is Facebook, Etsy, Ancestry.com, PharmMD and Yahoo.
Pro Large community
Chef has a relatively large community. One of the reasons for it is the fact that it's a pretty old and mature tool. Chef, originally released in 2009, is a more mature product. Being popular and with a large and dedicated community means that Chef has lots and lots of resources and guides from third party sources out there for beginners to pick up. Not only that, there are also many plugins and configuration recipes made by the community.
Pro Strong version control capabilities
Chef is centered around Git for it's configuration and deployments. Because of this, Chef also has great version control capabilities through Git.
Chef is cross-platform. Offering support for the biggest platforms out there: Linux, Windows and *nix.
Chef was released in 2009, which is relatively a long time ago for software. Since then it has been through several versions and many bug fixes and tests. All of this can make Chef more appealing to teams who are looking for stability and maturity, which are things that Chef brings on the table.
Pro Declarative sematic
You define the state the server should be in and Puppet transforms it that state. This is opposed to explicitly declaring a list of actions to be performed.
If a developer wants more flexibility and control there's always the option of falling back to explicitly running commands but that's discouraged.
Pro Large helpful community
Puppet is very mature and relatively old. This means that it has gathered quite a following over the years. This large community means that there are a lot of modules, guides and configuration recipes ready to use built by the community.
Puppet is a complete solution in terms of available features and modules. It has full support for all the main Operating Systems and provides lots of tools for its users.
Pro Broad cross-platform support
Puppet is supported on a wide range of operating systems. See the Docs for a complete list.
Pro Helpful UI
Puppet's UI is very useful. It allows real-time control of managed nodes by using modules and configuration recipes that are on the master servers. Although the UI is great for management, it lacks when trying to configure modules.
Pro Easy to learn
Puppet is model-driven and easier for diverse teams (that may include non-devs) to learn than it's main competitor, Chef.
Con Ties you to Ruby
Chef is written in Ruby and its CLI uses a Ruby-based DSL. In order to fully use and customize it you need to use Ruby as Chef does not give users any other choice when it comes to languages to use to configure it.
Con Steep learning curve
Chef has a steeper learning curve than many of its competitors, making it a more difficult tool for the non-devs of a team (such as sysadmins) to work with. For some teams, the added cost of teaching Chef to the team may outweigh the benefits.
Con Solid knowledge of Ruby is needed to create your own modules
Modules and configurations are written in a specific language based on Ruby or in Ruby itself. So in order to be able to create custom configuration and modules you need a solid knowledge of Ruby.
Although it's fair to mention that there are many modules already available for every use-case.
Con Does not enforce policy when the puppetmaster is offline
Does not enforce policy when the puppetmaster is offline, does have a caching mechanism but since it does not include any files that need to be transfer it basically does not work
Con Slow as hell
Compared with other CM tools it's very slow and needs to do a lot of caching to give it the impression that it's fast (which it's not)
Con Syntax is a mess
To use puppet to the full extent you need to know the following tools; most of them are an integral part of puppet, Ruby, Ruby templates, puppet DSL, Hiera, Facter and Mcollective which all have a different syntax
Con Interaction between modules can get quite complex very fast
Due to it's out of order execution you can easily get into race condition between different modules. You have to be very careful declaring pre-requisites for the tasks so they don't step on top of each other. On the other hand when you get this lets you deploy things much faster than straight line execution tools
Con Lacks flexibility
The lack of control over Puppet's model-driven approach can result in less flexibility and power from the tool.