Docker containers (and the Dockerfile).
Docker has almost completely eliminated the need for OS-level configuration management. That's an entire class of software that is now virtually obsolete. Developers don't understand this, but Ops people got back like 20-50% of our time, and we can now do Immutable Infrastructure with apps. (Though it appears we traded Puppet for Terraform.... F*#&*@^&^!!!)
Creating immutable images with stock packaging tools and allowing you to build on top of them was the core of the revolution. But the other critical part was the Dockerfile. At first it seems almost stupidly simple. But actually, its genius is in its lack of freedom or functionality. It is incredibly impressive that it hasn't been overwhelmed by logic statements, templating, nested frankenstructures, etc. It's also wonderful that it's constructed for humans, not machines. Probably the best configuration format I've ever seen.
It's definitely not perfect, and there's still a lot of improvement needed. But we're never going back to not using containers. (The only alternative for Immutable IaC at the OS-level are entire VM images built by Packer and a shell script, and it's just not the same)