$ cat post/the-deploy-pipeline-/-the-version-pinned-to-never-/-the-stack-still-traces.md

the deploy pipeline / the version pinned to never / the stack still traces


From Puppet to Chef: A Tangled Tale of Configuration Management


April 9, 2012. I woke up to a world where the term “DevOps” was just starting to be bandied about in tech circles. The battle between Puppet and Chef was heating up, and Netflix’s Chaos Monkey had made its debut. It felt like every day brought new tools and techniques that promised to make our lives as platform engineers a little easier.


Today, I wanted to share something personal. A couple of weeks ago, we were dealing with a critical issue on one of our production servers—specifically, an Apache server that wasn’t behaving as expected. Our monitoring systems flagged it, and the logs showed that Apache was crashing every 30 minutes or so.

The team spent hours trying to figure out what was going wrong. We checked configurations, ran diagnostics, and even tried to replicate the issue in our staging environment. But nothing seemed amiss. It felt like we were chasing shadows.


After a few fruitless debugging sessions, I decided to try something different: a Puppet manifest. We had already been using Puppet for most of our infrastructure, but this was an unusual case where it hadn’t quite played nice. My first instinct was to use Chef instead, as it seemed more flexible in these scenarios, but there were several machines that we managed with Puppet.

I wrote a simple Chef recipe and tested it on one of the affected servers. To my surprise, the issue persisted even after running the new Chef recipe. This wasn’t getting us anywhere. It was time to go back to basics.


So, I started digging into our Apache configuration files in more detail. There were so many places where this could go wrong—modules loaded incorrectly, syntax errors, conflicting configurations. After a few hours of painstakingly checking and re-checking each line, we found the culprit: an outdated version of a custom module that was causing the crashes.

Once I updated the module and applied it via Puppet, everything started working smoothly again. The issue was resolved without much drama, but the experience highlighted a couple of things for me:

  1. Tool Choice Matters: While Chef has its advantages in flexibility, sometimes sticking with what you know works can save time.
  2. Configuration Management Tools Aren’t Perfect: Even Puppet and Chef have their quirks and edge cases where they fall short.

This event also reminded me of the ongoing debate between Puppet and Chef. Both tools had their strengths and weaknesses. At that point, I was leaning towards a more hybrid approach—using Chef for certain tasks and Puppet for others. This decision was driven by real-world experience rather than hype or dogma.

The world of configuration management kept evolving as well. The launch of OpenStack felt like a distant dream back then, but it was already starting to shape the future of cloud infrastructure. And Heroku’s acquisition by Salesforce? Well, that just seemed like one more step in the ever-changing landscape of platform-as-a-service offerings.


Reflecting on this experience, I couldn’t help but chuckle at how much we’ve come since then. Back then, Light Table and Meteor were still new concepts, and the NoSQL hype was reaching its peak. Now, those technologies are part of our everyday toolkit.

In 2012, the focus was on getting things working reliably while keeping an eye on future trends. As platform engineers, we were constantly learning and adapting to new tools and practices. And that’s what makes this field so exciting—there’s always something new to figure out.


So, here’s to Puppet and Chef, and all the other tools we use to keep our infrastructure running smoothly. May they continue to evolve in ways that make our lives easier.


Until next time, Brandon