Shell scripts + Version control
I've worked with a couple systems that used Subversion and git for deployment. You can rarely just checkout a bunch of files directly into a root filesystem, so a script for setup, validate, and install the files is usually required. This separates the logic from the config files, which can be good or bad news. Generally, I prefer this, despite the issues. Logic that is spread out over all your config files can turn into a confusing mess where you end up with snippets of logic that are not even clearly used anymore, "Do we even use this anymore? Can I delete this? Will something else break?"
Gripes about Puppet...
- While an end-state may be well defined, the path to getting there is non-deterministic.
- Declarative languages still suck. Most people think imperatively, "Computer, First do this, then do that, then do another thing until done."
- Can't easily sync large directory trees. WTF? You end up having to rsync or ensure that a tarball exists and then installing files from the tarball. If you update your deployed file tree then you have to update the tarball.