Can anyone recommend a good idempotent deployment tool for server softare deployment and configuration?
And before anyone mentions Chef or Puppet or Ansible, please let me stop you.
By idempotent, I mean the deployment tool keeps track of the state of the last deployment without ever touching the server. As far as I know, most tools don't do this. e.g. Chef might not reinstall everything if you run it twice, but it'll still waste time connecting to each server and checking to see what's installed.
I'm looking for a tool that manages a local snapshot of what was last deployed per-server, compares that to the code that describes the installation, and only runs deployment methods for each piece that has changed between the current code and the last snapshot.
For example, if I run mytool deploy
the first time on a server, it'll install and configure everything. Then, if I change my list of system packages and run mytool deploy
again, it'll only run apt-get install ...
for the new packages, and won't bother uploading application code or syncing static media or run database migrations or configure Apache, etc. If I then run mytool deploy
again without having changed anything, it won't even bother opening any ssh connections because the current code will match the last snapshot. Ideally, the tool should also have a dryrun mode that will provide a list of all the shell commands it would run for the next deployment.
I currently maintain a small homegrown Fabric-based tool that has some of this functionality, but it's difficult to maintain and building out the remainder doesn't seem like a wise investment. I was looking at Fabtools or Ansible, but neither seem to perfectly fit the bill.
Is anyone familiar with a tool that functions this way? As far as I know, no deployment tool does this, not even the more mature and sophisticated tools. Although I'm no expert on all the tools, so please correct me if I'm wrong.
[link][16 comments]