I’ve been using Opscode Chef to automate infrastructure deployments for the last year and a half. Before Chef (and predecessors) came on the scene, I had toyed with various version control methods to achieve the same result, but they usually failed to scale with the complexity of the system.
Chef recipes are idempotent, meaning multiple applications of the same recipe will not affect the end result. This is probably the biggest benefit Chef has over a straight scripting language or rolling your own system. Traditional scripting languages typically require a bunch of error checking or a well-defined server state pre-execution to accomplish a similar task.
Chef uses an ever evolving Ruby DSL that allows a systems integrator to specify through Ruby code the necessary packages, services, and configuration needed to run their network applications. Chef’s Ruby DSL is made up of Resources which are the lowest-level “atomic” actions that can be performed on a server.
Search and templating are powerful features that give the ability to create and automate dynamic infrastructures. Searching for all the production server roles is simple and adding all the production roles to a monitoring or load-balancing configuration, even more so. Chef also provides data-bags which give additional flexibility to search, allowing a developer to store arbitrary data which can be searched and incorporated in templates. This is useful for managing account credentials and profiles infrastructure wide.