I've used Ansible, and of the systems I've used to solve this and similar problems (Chef, Docker, Puppet) Ansible has been the cleanest, most well-thought-out, and easiest to use. But ultimately it's included in my review of the above tools. It misses 10% of cases instead of 50%, but I still end up spending an inordinate amount of time working around the system instead of running it.