<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Madstop &#187; language</title>
	<atom:link href="http://madstop.com/tag/language/feed/" rel="self" type="application/rss+xml" />
	<link>http://madstop.com</link>
	<description>Puppet development, configuration management, and less</description>
	<lastBuildDate>Mon, 02 Aug 2010 04:07:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>A short history of Puppet, pt.1</title>
		<link>http://madstop.com/2008/11/01/a-short-history-of-puppet-pt1/</link>
		<comments>http://madstop.com/2008/11/01/a-short-history-of-puppet-pt1/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 02:37:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Puppet]]></category>
		<category><![CDATA[luke]]></category>
		<category><![CDATA[cfengine]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[history]]></category>
		<category><![CDATA[isconf]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://madstop.com/?p=25</guid>
		<description><![CDATA[I was asked recently for more information on Puppet&#8217;s history, and although it seems to me that I&#8217;ve talked about it plenty,  I guess I might not have written it all out, nor is it necessarily all in one place.  &#8230; <a href="http://madstop.com/2008/11/01/a-short-history-of-puppet-pt1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was asked recently for more information on Puppet&#8217;s history, and although it seems to me that I&#8217;ve talked about it plenty,  I guess I might not have written it all out, nor is it necessarily all in one place.  I&#8217;m relatively verbose, so this looks like it will be long enough to break into multiple parts.</p>
<h3>ISconf</h3>
<p>Puppet was heavily influenced by two tools, but almost more importantly, it was heavily influenced by what I couldn&#8217;t do with those tools.  I attended LISA in 2001, where I saw <a href="http://www.stevegt.com/">Steve Traugott</a> give his talk on automating infrastructures.  I was impressed enough that I convinced my then-company to bring him in for a week of consulting.  During that week, he convinced me to give a tool he&#8217;d written, <a href="http://isconf.org">ISconf</a>, a try.</p>
<p>ISconf is an insanely simple tool &#8212; it&#8217;s just a way to apply a set of make stanzas in the same order every time.  Steve&#8217;s theory was that the only way to get consistency from your computers was to do exactly the same thing on them every time.  So, he wrote up everything he did as a make stanza, and then built ISconf as a way of executing them in a consistent order.</p>
<p>Or at least, that was the theory.  When I got his code for ISconf, it was, em, not terribly usable.  It was written in shell and perl, with shell calling perl calling shell calling shell calling perl then exploding.  I had already bought into the basic theory, but I couldn&#8217;t see how to his code (which he was calling ISconf 2), so I rewrote it with some pretty significantly different functionality but following, as closely as possible, his basic theory.  Naturally, I called this ISconf 3.  On the ISconf web site, you can read more of this history, along with Steve&#8217;s relatively bitter version of how this portion of the history goes. (Incidentally, I wrote the majority of the content on that site.)</p>
<p>I won&#8217;t go into the detail of how it worked, except that all of the actual work happened with make stanzas.  This meant that, really, ISconf was a huge collection of very small shell scripts. This seems straightforward, until you start thinking about things like package installation &#8212; the command to install one package is almost the same as that to install a different package, which meant that a lot of my make stanzas had a lot of duplication.</p>
<p>To make my life easier, I started abusing the hell out of make, switching to gmake, and starting to make simple rules using &#8216;%&#8217; to avoid duplication:</p>
<pre>pkg/%:
...</pre>
<p>I can&#8217;t even remember how this worked, thankfully; I just know you can extract what the &#8216;%&#8217; matches and use it to choose the package name when installing a package.</p>
<p>This worked great for packages, since in most cases (and all the cases I was dealing with), you can easily specify a package by name.  It didn&#8217;t work so well for things like cron jobs, though &#8212; you&#8217;ve got between 1 and 6 fields, and the last field can have spaces and all manner of crap.  So, I started maintaining a separate file of all of these cron jobs, written in a perl Data::Dumper format, with each cron job having a unique name.  Then my make stanza would just refer to the arbitrary name I&#8217;d chosen.</p>
<p>This at least made ISconf more usable, but there were still a lot of problems.  You can read my writeup from around then in my <a href="http://www.usenix.org/events/lisa03/tech/full_papers/kanies/kanies.pdf">LISA paper</a>, but there were some serious problems with using ISconf.  First and foremost, it wasn&#8217;t a real solution &#8212; it was just a way to organize billions of little shell scripts, and as most anyone knows by now, I&#8217;m not so fond of shell scripts.  Also, the whole theory was bogus &#8212; there&#8217;s just no way you can guarantee consistency, not through order or any other mechanism.  Your dev servers and test servers can never be exactly the same, so stupidly replaying the same scripts in order also can&#8217;t guarantee sameness.  As a ridiculous example, I&#8217;ve seen printers that don&#8217;t work if their hostnames have an odd number of characters, and there&#8217;s just no way you can test this kind of case.</p>
<p>Beyond the theoretical problems, though, there were even worse practical issues.  You were <em>supposed</em> to never touch any code once it&#8217;d been deployed to a machine, because otherwise you couldn&#8217;t guarantee consistent behaviour, but this is just silly, because it means that you can never refactor code or change how you manage a given aspect of your system.  Imagine a solution that required immediate calcification of anything you ever did &#8212; once you deploy it, it&#8217;s deployed like that forever, even if it&#8217;s stupid.  No reason to learn; even worse, you get punished for learning, because you just add a new system to maintain every time you learn anything.</p>
<p>So, I wanted the ability to refactor my solutions, and ISconf couldn&#8217;t deliver that, so I started looking for something else that could.  Check back for part 2 to see what I did next. <img src='http://madstop.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://madstop.com/2008/11/01/a-short-history-of-puppet-pt1/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
