Just wanted to chime in that puppet is an awesome tool if you're trying to manage a few or more servers. (Hell, even if you manage a single one but want re-deployment and roll-out to be consistent)
I also had puppet configs at one point to help get new OS X desktop and laptop settings sane after purchase.
Well I just tryed writing a provider for puppet and I found quite a few bad design choices such as :ensure allowed to be a version, 'present' and 'absent' double purpose variables are bad and this shows in a few providers having to implement checks on a few dual purposed variables. Chef from what I've done so far doesn't have these bad design choices.
I also had puppet configs at one point to help get new OS X desktop and laptop settings sane after purchase.