It's not really something I know much about, but I recently went to a talk where the guy said the ultimate difference between Puppet and Chef is Chef is ruby scripts, but Puppet is a config file - which means that Puppet can guarantee that its actions are idempotent.