That said, I've been playing around with Kubernetes lately and trying to move a lot of our infrastructure onto Kubernetes. The use of Dockerfiles kind of nullifies the need for a full fledged configuration management tool for me and I've been relying on bash scripts and distributed kv stores to manage state and environment variables (using 12 factor approach and managing environment variables with consul and secrets with vault)
When I first started using Chef, it was for work and I wasn't a fan at all. But, it's grown on me to the extent that I replaced all my Ansible-maintained infrastructure with Chef and I now maintain my own personal Chef server.
It can definitely be overcomplicated in some scenarios, but I'm comfortable using it and and I feel of the tools I've tried, it allows me to be the most expressive. I'd much rather write a Ruby Chef recipe than a YAML Ansible playbook.
The fact that Chef's Management Console UI[0] is available for free (for small deployments) while Ansible Tower[1]'s pricing starts at $5000/yr also factors into my choice. It appears that Red Hat has plans to make a free, open source version of Tower[2] but there's nothing there yet. Looking online, it looks like Saltstack maintains a GUI management console of some sorts, but it's only available for Saltstack Enterprise.
[0]: https://docs.chef.io/manage.html
The point being I'd try to get as far as possible from any server configuration. Just limit it to setting up the platform as a service. So engineers can just push containers to that platform.
I'd also consider serverless architecture.
Long story short, limit server configuration to bare minimum. And for that minimum I'd use terraform and ansible if needed (but kubernetes can be deployed just with terraform and cloudinit files imho).
On the other had we did make autoscaling work with chef. Not sure how any of the others would fare since a relatively static server list was a pretty safe assumption until about 6 years ago.
Salt can also run agentless, and is much, much faster than Ansible, and has excellent support for both Docker and Kubernetes, which is a huge plus for us. Everything that can't be put in a Dockerfile gets run through Salt