Kynetx has been using Puppet
(and a little Capistrano) to automate our infrastructure since this
summer. While we haven't gotten everything as automated as we'd
like, we're quite a ways down the road and it's making life as a
small startup bearable.

My ultimate goal is to register a node in the system that delivers Kynetx
Network Services (KNS) to the machine database (iClassify) and have
it come up, configure itself, and be ready to put in production in
less than 15 minutes. While there are still a number of manual steps
in that process we are remarkably close and getting closer all the
time.

I haven't found learning puppet to be difficult. There's plenty of
documentation, including recipes that if not usable as is, are great
resources for figuring out best practices. Also, there's a very
helpful group on IRC (#puppet on irc.freenode.net) that I've
turned from time to time.

The best thing about Puppet is that I can count on nodes under puppet
management to be consistently configured and the puppet recipes
represent an unambiguous record of what should be happening.

A recent example, we needed to ensure that data files from an OEM
partner were on all of our initialization servers. I used Puppet in
two ways:

Puppet is used to distribute the data files from the ops server
to each of the initialization servers.

Puppet is used to manage the cron job that grabs updated data
from the partner and put it in the right directory for distribution.

If I add another initialization node puppet will make sure it has the
right data files just because I declare it to be an initialization
node. Nothing else need occur.

I recently released Kynetx's
operational procedures. For a small company with no fulltime
engineering staff other than me, I think we do a pretty good job
operationally. Much of that we owe to Puppet.