<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://madstop.com/wp-atom.php">
	<title type="text">The Madstop</title>
	<subtitle type="text">Puppet development, configuration management, and less</subtitle>

	<updated>2009-06-05T15:20:07Z</updated>
	<generator uri="http://wordpress.org/" version="2.7">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://madstop.com" />
	<id>http://madstop.com/feed/atom/</id>
	

			<link rel="self" href="http://feeds.feedburner.com/madstop" type="application/atom+xml" /><entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Summer Operations Conferences]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/9NXTVyFV6RU/" />
		<id>http://madstop.com/?p=77</id>
		<updated>2009-06-05T15:20:07Z</updated>
		<published>2009-06-05T15:20:07Z</published>
		<category scheme="http://madstop.com" term="Uncategorized" /><category scheme="http://madstop.com" term="conference" /><category scheme="http://madstop.com" term="ossbridge" /><category scheme="http://madstop.com" term="pdx" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="sanfrancisco" /><category scheme="http://madstop.com" term="sanjose" /><category scheme="http://madstop.com" term="structure09" /><category scheme="http://madstop.com" term="travel" /><category scheme="http://madstop.com" term="velocity09" />		<summary type="html"><![CDATA[I&#8217;ll be at three conferences in quick succession in June, speaking at two of them.
First I&#8217;m on a configuration management panel run by James Turnbull at the Open Source Bridge in Portland, OR.  I haven&#8217;t been on a multiple-tool panel in a while, so this should be interesting.  I&#8217;m also excited to be back in [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/06/05/summer-operations-conferences/">&lt;p&gt;I&amp;#8217;ll be at three conferences in quick succession in June, speaking at two of them.&lt;/p&gt;
&lt;p&gt;First I&amp;#8217;m on a &lt;a href="http://opensourcebridge.org/sessions/49" onclick="javascript:pageTracker._trackPageview('/outbound/article/opensourcebridge.org');"&gt;configuration management panel&lt;/a&gt; run by &lt;a href="http://ablog.apress.com/?author=53" onclick="javascript:pageTracker._trackPageview('/outbound/article/ablog.apress.com');"&gt;James Turnbull&lt;/a&gt; at the &lt;a href="http://opensourcebridge.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/opensourcebridge.org');"&gt;Open Source Bridge&lt;/a&gt; in Portland, OR.  I haven&amp;#8217;t been on a multiple-tool panel in a while, so this should be interesting.  I&amp;#8217;m also excited to be back in Portland - I absolutely love the town, so much that I&amp;#8217;m moving back there this summer.  And for those non-Americans who think we don&amp;#8217;t make great beer:  Get thyself to Portland, and see how wrong you are.  I should also be running a &lt;a href="http://opensourcebridge.org/sessions/276" onclick="javascript:pageTracker._trackPageview('/outbound/article/opensourcebridge.org');"&gt;Puppet BoF&lt;/a&gt; there.&lt;/p&gt;
&lt;p&gt;From there I fly down to San Jose to give a &lt;a href="http://en.oreilly.com/velocity2009/public/schedule/detail/7693" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');"&gt;workshop on Puppet&lt;/a&gt; at the &lt;a href="http://en.oreilly.com/velocity2009" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');"&gt;O&amp;#8217;Reilly Velocity conference&lt;/a&gt;.  This is its second year, and while it claims to have a web operations/performance focus, I think it stands to quickly become the best general operations conference around.  LISA is too academic and just moves too slowly, and there isn&amp;#8217;t a whole lot of other competition.&lt;/p&gt;
&lt;p&gt;Last year&amp;#8217;s was great, and this year&amp;#8217;s is a day longer and looks to be even better.&lt;/p&gt;
&lt;p&gt;Finally, the day after Velocity, I attend Om Malik&amp;#8217;s &lt;a href="http://events.gigaom.com/structure/09/" onclick="javascript:pageTracker._trackPageview('/outbound/article/events.gigaom.com');"&gt;Structure&lt;/a&gt;.  This conference is more focused on operations executives, which is a very different focus for me, but I met a lot of interesting and knowledgeable people there last year, including some from completely outside the technology space.  I normally diss executive events, but this one seems to stand out.&lt;/p&gt;
&lt;p&gt;Hopefully you&amp;#8217;ll have a chance to track me down at one of these events.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=9NXTVyFV6RU:0hiau99eQ2A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=9NXTVyFV6RU:0hiau99eQ2A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=9NXTVyFV6RU:0hiau99eQ2A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=9NXTVyFV6RU:0hiau99eQ2A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=9NXTVyFV6RU:0hiau99eQ2A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=9NXTVyFV6RU:0hiau99eQ2A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=9NXTVyFV6RU:0hiau99eQ2A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=9NXTVyFV6RU:0hiau99eQ2A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/06/05/summer-operations-conferences/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/06/05/summer-operations-conferences/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://madstop.com/2009/06/05/summer-operations-conferences/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[RESTful Puppet and You]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/wWBmJhHeBx0/" />
		<id>http://madstop.com/?p=73</id>
		<updated>2009-06-04T22:34:22Z</updated>
		<published>2009-06-04T22:34:22Z</published>
		<category scheme="http://madstop.com" term="Development" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="api" /><category scheme="http://madstop.com" term="design" /><category scheme="http://madstop.com" term="internals" /><category scheme="http://madstop.com" term="refactoring" /><category scheme="http://madstop.com" term="rest" />		<summary type="html"><![CDATA[No, I&#8217;m actually not dead, as much as it might appear from my lack of updates.  Fortunately there are other means to verify my vitality.
Anyway, the goal here is to help you understand how the imminent release of Puppet 0.25 affects you.  And by &#8220;you&#8221; here I am, of course, making some assumptions - if [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/06/04/restful-puppet-and-you/">&lt;p&gt;No, I&amp;#8217;m actually not dead, as much as it might appear from my lack of updates.  Fortunately there are &lt;a href="http://twitter.com/puppetmasterd" onclick="javascript:pageTracker._trackPageview('/outbound/article/twitter.com');"&gt;other means&lt;/a&gt; to verify my vitality.&lt;/p&gt;
&lt;p&gt;Anyway, the goal here is to help you understand how the imminent release of Puppet 0.25 affects you.  And by &amp;#8220;you&amp;#8221; here I am, of course, making some assumptions - if you don&amp;#8217;t use or care about Puppet, um, not so much.  But if you use Puppet, or, even better, if you care about how well Puppet solves your problems, then this post is for you.  I hope.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve no short-term memory and don&amp;#8217;t feel like planning this blog post out, so I&amp;#8217;m going to just do what I can to ad-lib the reasons that Puppet&amp;#8217;s new-found RESTfulness kicks ass.  And stuff.&lt;/p&gt;
&lt;h2&gt;Smaller and Faster&lt;/h2&gt;
&lt;p&gt;First and foremost, 0.25 does not have many what you would call features.  It&amp;#8217;s mostly a refactoring release.  This refactoring in general results in a faster system that takes less memory.  Experiments have borne this out:  People are seeing 10-40x speedups in fileserving, at least 30% less ram consumed on client and server, and much faster run times on the client.&lt;/p&gt;
&lt;p&gt;So, look not for features but for benefits.&lt;/p&gt;
&lt;h2&gt;What is REST?&lt;/h2&gt;
&lt;p&gt;REST is more of a &lt;a href="http://en.wikipedia.org/wiki/REST" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');"&gt;principle&lt;/a&gt; than a standard, but the things that matter in it for Puppet are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All data transferred is treated as a stand-alone &amp;#8216;resource&amp;#8217; (and here &amp;#8216;resource&amp;#8217; means something different than a normal Puppet resource).  For instance, Puppet 0.25 treates catalogs, file content, file metadata, certificates, certificate requests, fact collections, and probably a bit more as resources.&lt;/li&gt;
&lt;li&gt;All resources have a unique URI.  E.g., a given host&amp;#8217;s catalog can be found at &amp;#8216;http://puppet/$environment/catalog/$hostname&amp;#8217;.&lt;/li&gt;
&lt;li&gt;Standard HTTP infrastructure is used as the &amp;#8216;api&amp;#8217; - HTTP &amp;#8216;put&amp;#8217;, &amp;#8216;get&amp;#8217;, and &amp;#8216;delete&amp;#8217; are the primary operations, and HTTP content-type handling is used for serialization negotiation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, none of these are really helpful to you, whomever you are.  What&amp;#8217;s helpful is how we&amp;#8217;ve made these basic ideas useful in Puppet.  So here are some of the things you get:&lt;/p&gt;
&lt;h2&gt;Faster and Smaller&lt;/h2&gt;
&lt;p&gt;The big problem with our current network protocol (XMLRPC, which is essentially XML over HTTPS) is that everything has to be considered XML, which means that anything that isn&amp;#8217;t actually XML (which is, um, everything in Puppet) has to be encoded and escaped so it can act like XML.  For file serving, this means that every file has a minimum of three copies in memory - plaintext, encoded, and escaped.  This is time- and memory-expensive.&lt;/p&gt;
&lt;h2&gt;Oops I Did It Again&lt;/h2&gt;
&lt;p&gt;Sorry, couldn&amp;#8217;t resist.  One of the benefits of switching to REST is that we&amp;#8217;re breaking compatibility, so we can fix some design problems we (i.e., I) made early-on.  The biggest benefits have been around fileserving and the catalog.&lt;/p&gt;
&lt;p&gt;In pre-0.25 releases, recursive file-serving involves a minimum of one call per directory and one call per file.  This is obviously slow and bad.  0.25 fixes this so it&amp;#8217;s one call for an entire directory structure, with possibly one call for each file that actually needs to be transferred.  The combination of this plus the lack of encoding and escaping has resulted in most people seeing a 10x speedup in recursive fileserving.&lt;/p&gt;
&lt;p&gt;For catalogs, well, pre-0.25 releases don&amp;#8217;t really talk about them.  They transfer this serialized recursive tree structure, rather than the whole catalog (which is really mostly a graph).  This matters a bit in 0.25, because it&amp;#8217;s allowed us to remove some extraneous stupidity that resulted from the limitations of the tree structure (relationships no longer propagate to all contained resources - see &lt;a href="http://projects.reductivelabs.com/issues/1903" onclick="javascript:pageTracker._trackPageview('/outbound/article/projects.reductivelabs.com');"&gt;the ticket&lt;/a&gt; for more information), but it&amp;#8217;s going to be a bigger deal going forward as we can start relying on the complete graph being passed around.&lt;/p&gt;
&lt;p&gt;Both of these refactors could have been done with XLMRPC, but they would have required breaking compatibility, which is always a difficult step to take, so doing it all at once makes the most sense.&lt;/p&gt;
&lt;h2&gt;Easier Integration&lt;/h2&gt;
&lt;p&gt;The big deal in our use of REST is really an internal system that enables REST - this is the all-powerful Indirector.  It&amp;#8217;s essentially a plugin system that makes it easy to add new sources or destinations for data we care about.  For example, when we wanted to queue the storage of catalogs to a database (rather than forcing the client to wait until it&amp;#8217;s done), we had to develop the queueing infrastructure, of course, but integrating it with Puppet was less than 100 lines of code that knew how to accept catalogs and send them to the queue.&lt;/p&gt;
&lt;p&gt;This ease of integration opens up all kinds of possibilities, like moving our CA to be database-backed, but the main thing is that if you come up with some cool integration, it&amp;#8217;s similarly easy for you &amp;#8212; you&amp;#8217;re not dependent on us.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re still missing one piece - a user-configurable routing system to help you configure which plugin is used - but we&amp;#8217;ve got that mostly done and it&amp;#8217;ll be in the release after 0.25.&lt;/p&gt;
&lt;p&gt;Note that this integration was often possible in earlier releases, but it was much harder because you had to know a lot more about every individual class you were integrating with.  Because we use the same methods and the same interface and the same location pattern for everything, you don&amp;#8217;t have to know as much.&lt;/p&gt;
&lt;h2&gt;Enforced Good Citizenship&lt;/h2&gt;
&lt;p&gt;Without the Indirector at the heart of everything, and an assumption that other people are going to be integrating with our code, we are forced to build more decoupled, portable components.  This isn&amp;#8217;t much, but it does always enforce a kind of good citizenship, which is something.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=wWBmJhHeBx0:JRE2i21CP3c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=wWBmJhHeBx0:JRE2i21CP3c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=wWBmJhHeBx0:JRE2i21CP3c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=wWBmJhHeBx0:JRE2i21CP3c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=wWBmJhHeBx0:JRE2i21CP3c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=wWBmJhHeBx0:JRE2i21CP3c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=wWBmJhHeBx0:JRE2i21CP3c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=wWBmJhHeBx0:JRE2i21CP3c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/06/04/restful-puppet-and-you/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/06/04/restful-puppet-and-you/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://madstop.com/2009/06/04/restful-puppet-and-you/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Using &#8216;git rebase&#8217; to clean development histories]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/_Ex2At2Jo5w/" />
		<id>http://madstop.com/?p=71</id>
		<updated>2009-04-13T06:54:11Z</updated>
		<published>2009-04-13T06:54:11Z</published>
		<category scheme="http://madstop.com" term="Development" /><category scheme="http://madstop.com" term="git" /><category scheme="http://madstop.com" term="OpenSource" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="tools" />		<summary type="html"><![CDATA[In general, development in the Puppet world is a series of essentially disconnected batches of commits.  We do a pretty good job of applying related commits all at once, so it&#8217;s obvious when a set of commits is related, but otherwise, we don&#8217;t have to worry.
Sometimes, though, multiple series of commits are related to each [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/04/13/using-git-rebase-to-clean-development-histories/">&lt;p&gt;In general, development in the Puppet world is a series of essentially disconnected batches of commits.  We do a pretty good job of applying related commits all at once, so it&amp;#8217;s obvious when a set of commits is related, but otherwise, we don&amp;#8217;t have to worry.&lt;/p&gt;
&lt;p&gt;Sometimes, though, multiple series of commits are related to each other, which can easily get lost.  Even worse, multiple series of commits developed in tandem can cause downright painful development histories.&lt;/p&gt;
&lt;p&gt;For example, we&amp;#8217;re currently working on &lt;a href="http://groups.google.com/group/puppet-dev/browse_thread/thread/0de4dd8094416469#" onclick="javascript:pageTracker._trackPageview('/outbound/article/groups.google.com');"&gt;refactoring Puppet&amp;#8217;s ActiveRecord integration&lt;/a&gt; while at the same time we&amp;#8217;re adding the ability to &lt;a href="http://groups.google.com/group/puppet-dev/browse_thread/thread/12875331120b13c0/811da1ae485628e4" onclick="javascript:pageTracker._trackPageview('/outbound/article/groups.google.com');"&gt;queue the database store operations&lt;/a&gt;.  We&amp;#8217;ve had two development teams (of 1 to 3 people each) working on each feature, constantly publishing and rebasing against each others&amp;#8217; work.  You could certainly argue that this isn&amp;#8217;t the right model (we should have worked in serial rather than parallel, probably), time constraints didn&amp;#8217;t allow this.&lt;/p&gt;
&lt;p&gt;On Friday, we got to the point where we&amp;#8217;re nearly done, and I started sending my code to the -dev list for review.  That was straightforward enough, because I&amp;#8217;d done my development in a separate branch and I still had those branches.  The other team, though, had been pushing code around like made, tuning and modifying their code over time, so sending their commits out for review was harder.  To top it off, our final branch was already a mixture of the different efforts.&lt;/p&gt;
&lt;p&gt;So, I decided to see if I could clean up the development history. We had 80 commits spread all around, and I needed to reorder and squash them so they made easy sense during code review.  (This is a pseudo-process without actual code, because the reality was too messy to reproduce here.)  First I needed a list of the commits in the branch; git rebase is our tool through this process, and using it interactively (with &amp;#8216;-i&amp;#8217;) is the key.  So, I made a new branch and started my rebasing:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;git checkout dev&lt;/p&gt;
&lt;p&gt;git checkout -b clean_dev&lt;/p&gt;
&lt;p&gt;git rebase -i 0.24.8&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This opens up my editor with an ordered list of all of the commits in my branch that aren&amp;#8217;t in 0.24.8.  There are three things you can do with commits in this list:  Leave them alone, combine them with another commit, and delete them (which deletes them from the branch).  Because I knew this would be a long complicated process, I saved the whole list to a separate file to start.&lt;/p&gt;
&lt;p&gt;Some of the commits in our branch were backports of fixes we needed from the &amp;#8216;master&amp;#8217; branch, so these were the only commits I left in the commit list in my first rebase.  This added about six commits, and was pretty easy to merge.  All of the other commits were just deleted from my clean branch.&lt;/p&gt;
&lt;p&gt;The next step was to add my indirected ActiveRecord code.  This was only four or five commits, but should have been collapsed into fewer than that (e.g.,  one of the commits fixed a misspelling in a test).  There are multiple ways you could do this, including cherry-picking, but rebasing is definitely the most powerful.  I created a new temporary branch in which to do my rebase:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;git checkout -b clean_indirected_activerecord&lt;/p&gt;
&lt;p&gt;git rebase -i clean_dev&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This actually results in a noop, because I&amp;#8217;m rebasing against a branch that&amp;#8217;s a complete duplicate of my current branch.  However, because I&amp;#8217;m in interactive mode, I can do whatever I want from here, so I pasted in my four or five commits, and s/pick/squash/ where appropriate.  Once I dealt with any merge conflicts, I then merged back into my clean branch:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;git checkout clean_dev&lt;/p&gt;
&lt;p&gt;git merge &amp;#8211;no-ff clean_indirected_activerecord&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I decided to force the merge commit to exist because, um, actually I don&amp;#8217;t have a good reason.  It seemed like a good idea to have a clear milepost saying that a given branch is merged, like that first email in a code review describing a patch series.&lt;/p&gt;
&lt;p&gt;So now I&amp;#8217;ve got a branch that has a series of patches that prepare the branch for us (with backported fixes, mostly), then a series of patches providing the first set of development.  Now I just need to repeat this process for the other three development stages, one done by me and two done by others.&lt;/p&gt;
&lt;p&gt;I had no problem with my other code; it was 8 or so patches, but I wrote them all, so I could easily handle merge conflicts.  I also had no problem with one of the other chunks of code, because it was only three commits, so simple cherry-picking would have sufficed.&lt;/p&gt;
&lt;p&gt;The last bit is where rebasing eventually broke down.  In the end, I had 35 commits that I thought contributed something  to the code (we had some duplicate commits in there, somehow, and some other commits that got cancelled out by later commits), but it looked like they should have been reduced to as little as four or five commits, because that&amp;#8217;s about how many components were added in the code.  However, I don&amp;#8217;t know this code as well as the people who wrote it, so I decided to punt here and told them they needed to clean up their development path and send me some patches that had no duplication and no code that gets deleted in a later patch.  My expectation is that they&amp;#8217;ll create entirely new commits from the current state of the files, because the current commit history reflects a process rather than the desired state.&lt;/p&gt;
&lt;p&gt;This whole process made me think of a discussion &lt;a href="http://groups.google.com/group/puppet-dev/browse_thread/thread/27d4285e732f0e39/a65b086a6693da31?lnk=gst&amp;amp;q=git+rebase#a65b086a6693da31" onclick="javascript:pageTracker._trackPageview('/outbound/article/groups.google.com');"&gt;we had a while back&lt;/a&gt; on the -dev list (and a &lt;a href="http://groups.google.com/group/puppet-dev/browse_thread/thread/d920706cf9154100/0f71a89ec54c3226?lnk=gst&amp;amp;q=git+rebase#0f71a89ec54c3226" onclick="javascript:pageTracker._trackPageview('/outbound/article/groups.google.com');"&gt;related thread&lt;/a&gt; started by Brice Figureau).  Apparently Linux development maintains every commit series separately, and only merges them when it&amp;#8217;s time for release.  Or rather, the release involves a final merge.  They maintain multiple ongoing development branches; one of them has all of the proposed patch series, but it&amp;#8217;s never merged directly into the release branch.  Instead, when a given patch series is accepted, it&amp;#8217;s merged separately into the main branch.&lt;/p&gt;
&lt;p&gt;This rebasing I did above made me realize the benefit of that approach - if the four development chunks had each remained separate branches, rather than merging early and merging often, it would have been *much* easier to keep them clean, and the developer responsible for a given chunk could always easily rebase just his or her own commits without affecting anyone else.  Then, when it was time for release, I could just merge them all in the appropriate order and release.&lt;/p&gt;
&lt;p&gt;This is pretty easy for four patch series, but obviously gets more complicated as we have tens of sets.  I think for now, it&amp;#8217;s too much work to maintain the patch sets in appropriate merge order without actually merging, but I think at some point, it really will make sense.  At the very least, this process has taught me the value of rebasing early and rebasing often.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=_Ex2At2Jo5w:aQOj1vEX2i4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=_Ex2At2Jo5w:aQOj1vEX2i4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=_Ex2At2Jo5w:aQOj1vEX2i4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=_Ex2At2Jo5w:aQOj1vEX2i4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=_Ex2At2Jo5w:aQOj1vEX2i4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=_Ex2At2Jo5w:aQOj1vEX2i4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=_Ex2At2Jo5w:aQOj1vEX2i4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=_Ex2At2Jo5w:aQOj1vEX2i4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/04/13/using-git-rebase-to-clean-development-histories/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/04/13/using-git-rebase-to-clean-development-histories/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://madstop.com/2009/04/13/using-git-rebase-to-clean-development-histories/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Puppet makes it into MacPorts]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/PlaudqKD5d8/" />
		<id>http://madstop.com/?p=69</id>
		<updated>2009-03-29T21:56:19Z</updated>
		<published>2009-03-29T21:56:19Z</published>
		<category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="facter" /><category scheme="http://madstop.com" term="mac" /><category scheme="http://madstop.com" term="news" /><category scheme="http://madstop.com" term="osx" />		<summary type="html"><![CDATA[Nigel Kersten just let me know that Puppet and Facter are now in MacPorts.  That&#8217;s one more distribution (or in this case, pseudo-distribution) that Puppet&#8217;s a part of.  Thanks Nigel.
]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/03/29/puppet-makes-it-into-macports/">&lt;p&gt;&lt;a href="http://explanatorygap.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/explanatorygap.net');"&gt;Nigel Kersten&lt;/a&gt; just let me know that Puppet and Facter are &lt;a href="https://trac.macports.org/ticket/19041" onclick="javascript:pageTracker._trackPageview('/outbound/article/trac.macports.org');"&gt;now in MacPorts&lt;/a&gt;.  That&amp;#8217;s one more distribution (or in this case, pseudo-distribution) that Puppet&amp;#8217;s a part of.  Thanks Nigel.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=PlaudqKD5d8:ObjA-kFljjg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=PlaudqKD5d8:ObjA-kFljjg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=PlaudqKD5d8:ObjA-kFljjg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=PlaudqKD5d8:ObjA-kFljjg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=PlaudqKD5d8:ObjA-kFljjg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=PlaudqKD5d8:ObjA-kFljjg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=PlaudqKD5d8:ObjA-kFljjg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=PlaudqKD5d8:ObjA-kFljjg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/03/29/puppet-makes-it-into-macports/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/03/29/puppet-makes-it-into-macports/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://madstop.com/2009/03/29/puppet-makes-it-into-macports/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[RailsMachine Releases Puppet Rails Tool]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/miqdivhUeU8/" />
		<id>http://madstop.com/?p=67</id>
		<updated>2009-03-23T01:44:26Z</updated>
		<published>2009-03-23T01:44:26Z</published>
		<category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="news" /><category scheme="http://madstop.com" term="rails" /><category scheme="http://madstop.com" term="ruby" />		<summary type="html"><![CDATA[RailsMachine has announced their project Moonshine, which provides a pure Ruby interface to Puppet and is essentially custom-built to simplify Rails deployment and management:
One of the things that separates Moonshine from other solutions like Chef and Sprinkle is that out of the box, Moonshine comes with recipes for the same Ubuntu/Ruby Enterprise Edition/Apache/Passenger/MySQL stack that’s [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/03/23/railsmachine-releases-puppet-rails-tool/">&lt;p&gt;&lt;a href="http://railsmachine.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/railsmachine.com');"&gt;RailsMachine&lt;/a&gt; has &lt;a href="http://blog.railsmachine.com/articles/2009/03/18/moonshine-what-burns-blue-makes-your-blues-go-away/" onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.railsmachine.com');"&gt;announced&lt;/a&gt; their project &lt;a href="https://github.com/railsmachine/moonshine/" onclick="javascript:pageTracker._trackPageview('/outbound/article/github.com');"&gt;Moonshine&lt;/a&gt;, which provides a pure Ruby interface to Puppet and is essentially custom-built to simplify Rails deployment and management:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;One of the things that separates Moonshine from other solutions like Chef and Sprinkle is that out of the box, Moonshine comes with recipes for the same Ubuntu/Ruby Enterprise Edition/Apache/Passenger/MySQL stack that’s in production use at Rails Machine.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;We&amp;#8217;re pretty excited about this, for multiple reasons.  It&amp;#8217;s another Ruby company developing in and around Puppet, and it&amp;#8217;s a great, simple way for Rails developers to take advantage of both Puppet and the RailsMachine stack.&lt;/p&gt;
&lt;p&gt;The next step is to get the ShadowPuppet pure Ruby interface imported into Puppet.  It will complement the existing language rather than replacing it, but we haven&amp;#8217;t really settled all of the details yet.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=miqdivhUeU8:EksPluAQQWQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=miqdivhUeU8:EksPluAQQWQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=miqdivhUeU8:EksPluAQQWQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=miqdivhUeU8:EksPluAQQWQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=miqdivhUeU8:EksPluAQQWQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=miqdivhUeU8:EksPluAQQWQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=miqdivhUeU8:EksPluAQQWQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=miqdivhUeU8:EksPluAQQWQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/03/23/railsmachine-releases-puppet-rails-tool/#comments" thr:count="-1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/03/23/railsmachine-releases-puppet-rails-tool/feed/atom/" thr:count="-1" />
		<thr:total>-1</thr:total>
	<feedburner:origLink>http://madstop.com/2009/03/23/railsmachine-releases-puppet-rails-tool/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Puppet wins Fukuoka Ruby Award]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/WQcvuvri4PY/" />
		<id>http://madstop.com/?p=65</id>
		<updated>2009-03-23T01:22:22Z</updated>
		<published>2009-03-23T01:22:22Z</published>
		<category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="award" /><category scheme="http://madstop.com" term="japan" /><category scheme="http://madstop.com" term="news" /><category scheme="http://madstop.com" term="reductive" /><category scheme="http://madstop.com" term="ruby" />		<summary type="html"><![CDATA[Puppet was one of the winners of the Ruby Award handed out by the Fukuoka Prefecture in Japan.  The Climate Information Toolkit won the top prize, and Puppet was one of three to win the second tier of prize.
Unfortunately, we could not travel to Japan to receive the award in person, but I was able [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/03/23/puppet-wins-fukuoka-ruby-award/">&lt;p&gt;Puppet was one of the &lt;a href="http://www.flickr.com/photos/lkanies/3377826668/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');"&gt;winners&lt;/a&gt; of the Ruby Award handed out by the Fukuoka Prefecture in Japan.  The &lt;a href="http://classpath.egloos.com/4808382" onclick="javascript:pageTracker._trackPageview('/outbound/article/classpath.egloos.com');"&gt;Climate Information Toolkit&lt;/a&gt; won the top prize, and Puppet was one of three to win the second tier of prize.&lt;/p&gt;
&lt;p&gt;Unfortunately, we could not travel to Japan to receive the award in person, but I was able to give a talk via Skype the night of the award ceremony.  It was around 2am my time on a day I&amp;#8217;d traveled with my wife and twins, so it was a long day, but it was worth it.  I only hope my talk was worth anything.&lt;/p&gt;
&lt;p&gt;Andrew did all of the hard work around getting the submission in and organizing the talk itself, so I definitely have him to thank for that.&lt;/p&gt;
&lt;p&gt;Now I just need to figure out how to get my bank to accept those postal money orders from Japan. &lt;img src='http://madstop.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=WQcvuvri4PY:MxDrtNOeOG0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=WQcvuvri4PY:MxDrtNOeOG0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=WQcvuvri4PY:MxDrtNOeOG0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=WQcvuvri4PY:MxDrtNOeOG0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=WQcvuvri4PY:MxDrtNOeOG0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=WQcvuvri4PY:MxDrtNOeOG0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=WQcvuvri4PY:MxDrtNOeOG0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=WQcvuvri4PY:MxDrtNOeOG0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/03/23/puppet-wins-fukuoka-ruby-award/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/03/23/puppet-wins-fukuoka-ruby-award/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://madstop.com/2009/03/23/puppet-wins-fukuoka-ruby-award/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[The Most Free(tm) Way to Make Money from Open Source]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/37sQoOlnmBc/" />
		<id>http://madstop.com/?p=61</id>
		<updated>2009-02-28T07:44:47Z</updated>
		<published>2009-02-28T07:18:25Z</published>
		<category scheme="http://madstop.com" term="Development" /><category scheme="http://madstop.com" term="OpenSource" /><category scheme="http://madstop.com" term="licesning" /><category scheme="http://madstop.com" term="opencore" /><category scheme="http://madstop.com" term="opennms" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="strategy" />		<summary type="html"><![CDATA[Tarus Balog is on a one-man campaign against open-core licensing, or really, any company that produces both open source and closed source software:
Of course, in the open core model there must be “commercially-available extensions” in order to get companies to sign a “commercial license”. Why is this? Because the open core product has been intentionally [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/02/28/the-most-freetm-way-to-make-money-from-open-source/">&lt;p&gt;&lt;a href="http://blogs.opennms.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.opennms.org');"&gt;Tarus Balog&lt;/a&gt; is on a one-man campaign against &lt;a href="http://blogs.the451group.com/opensource/2008/09/01/andrew-lampitt-defines-open-core-licensing/" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.the451group.com');"&gt;open-core licensing&lt;/a&gt;, or really, any company that produces both open source and closed source software:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Of course, in the open core model there must be “commercially-available extensions” in order to get companies to sign a “commercial license”. Why is this? Because the open core product has been intentionally hobbled to force companies to buy the closed software product in order to get it to do the things that customers need it to do, and thus to generate revenue for the software company.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I find this article interesting, because he seems to have taken the opposite tack from me in terms of deciding what causes the most dilution of an open source product.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve always figured that requiring copyright attribution is a greater sin than providing commercial add-ons, with the strong assumption that the product completely stands on its own without those add-ons.&lt;/p&gt;
&lt;p&gt;As far as I see it, requiring copyright attribution restricts the developer community, while providing commercial add-ons doesn&amp;#8217;t restrict anyone anywhere, it just says that some of my code isn&amp;#8217;t free.&lt;/p&gt;
&lt;p&gt;Sure, I can see if I produce a crippled, useless free product that *requires* the commercial add-ons that it&amp;#8217;d be evil, but if the OSS portions actually do kick ass on their own, then what&amp;#8217;s the issue?&lt;/p&gt;
&lt;p&gt;To me, community is the big differentiator.  If a given OSS project doesn&amp;#8217;t actually care enough about a community, then open core is basically a sales tool.  But if it *really* cares about community, then open core always has to worry that the community can thrive without the commercial portions.  I basically think of this as requiring that the open core company always open source anything that&amp;#8217;s required by the project or that&amp;#8217;s essentially commoditized, but it leaves plenty of room for using a commercial license on those projects that not everyone needs, and especially on those areas that are clearly not commoditized and not many people need.&lt;/p&gt;
&lt;p&gt;I think Tarus has a special perspective on OSS success because he&amp;#8217;s in what amounts to an entirely commoditized space - there are so many monitoring tools with such a similar feature set that it&amp;#8217;s crazy to think anyone would choose anything but an entirely open source solution.  In less commoditized spaces, it likely doesn&amp;#8217;t make quite as much sense to stick to entirely open licenses.&lt;/p&gt;
&lt;p&gt;This bit in particular sticks out:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If you like your users why not provide all of the features as open source? Red Hat does it, JBoss does it, OpenNMS does it. The answer will always be that their business model can’t survive unless they sell closed source software. In that aspect, I can see little difference between open core companies and &lt;a href="http://www.microsoft.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.microsoft.com');"&gt;Microsoft&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, I can tell you that the reason that Reductive Labs is considering producing commercial software is that we can&amp;#8217;t afford to produce much more software unless someone pays for the development, and at this point, we have a thriving, healthy community that largely gets huge benefit from Puppet without ever needing help from us.  So, our options are to grow so slowly that all of the interesting opportunities pass us by, or to start producing software that allows us to, at the least, recoup our development costs.&lt;/p&gt;
&lt;p&gt;I agree with Tarus&amp;#8217;s basic sentiment: A lot of these open core companies aren&amp;#8217;t actually producing open source software that you could reasonably use on its own.  But that doesn&amp;#8217;t invalidate the model, in my opinion.&lt;/p&gt;
&lt;p&gt;His model of providing supported binaries, as Red Hat and others do, only works for those who use compiled languages, which means it&amp;#8217;s right out for us.  Maybe we should stick some C in there, just to make it easier to charge for support?&lt;/p&gt;
&lt;p&gt;So what do you think:  Is it a greater sin to only accept patches to your product if the contributor is willing to assign copyright to your commercial company, or to produce some closed-source code?&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=37sQoOlnmBc:akuQeLgRqSE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=37sQoOlnmBc:akuQeLgRqSE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=37sQoOlnmBc:akuQeLgRqSE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=37sQoOlnmBc:akuQeLgRqSE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=37sQoOlnmBc:akuQeLgRqSE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=37sQoOlnmBc:akuQeLgRqSE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=37sQoOlnmBc:akuQeLgRqSE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=37sQoOlnmBc:akuQeLgRqSE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/02/28/the-most-freetm-way-to-make-money-from-open-source/#comments" thr:count="26" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/02/28/the-most-freetm-way-to-make-money-from-open-source/feed/atom/" thr:count="26" />
		<thr:total>26</thr:total>
	<feedburner:origLink>http://madstop.com/2009/02/28/the-most-freetm-way-to-make-money-from-open-source/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Summary of February 2009 Puppet Developer call]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/FS9V5VBaPVo/" />
		<id>http://madstop.com/?p=58</id>
		<updated>2009-02-05T18:13:16Z</updated>
		<published>2009-02-05T18:13:16Z</published>
		<category scheme="http://madstop.com" term="Development" /><category scheme="http://madstop.com" term="OpenSource" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="facter" /><category scheme="http://madstop.com" term="reductive" /><category scheme="http://madstop.com" term="release" /><category scheme="http://madstop.com" term="workflow" />		<summary type="html"><![CDATA[We had another developer call last night, and until I can get the audio posted, here&#8217;s a basic summary.
Development Workflow
We led the discussion with a conversation about how the development workflow will change now that we&#8217;re finally releasing the code in master as 0.25.  After much discussion, we largely concluded that the least-surprise solution was [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/02/05/summary-of-february-2009-puppet-developer-call/">&lt;p&gt;We had another developer call last night, and until I can get the &lt;a href="http://reductivelabs.com/podcast" onclick="javascript:pageTracker._trackPageview('/outbound/article/reductivelabs.com');"&gt;audio posted&lt;/a&gt;, here&amp;#8217;s a basic summary.&lt;/p&gt;
&lt;h2&gt;Development Workflow&lt;/h2&gt;
&lt;p&gt;We led the discussion with a conversation about how the development workflow will change now that we&amp;#8217;re finally releasing the code in master as 0.25.  After much discussion, we largely concluded that the least-surprise solution was to use the &amp;#8216;master&amp;#8217; branch for stable development, and have something like a &amp;#8216;next&amp;#8217; branch for new features and major refactorings.&lt;/p&gt;
&lt;p&gt;The main goal is for new developers to be able to clone our repository and get to developing code immediately without having to worry about switching branches or any such thing.  More experienced developers will know where their development should be done, so it&amp;#8217;s mostly a question of least-surprise for newcomers.&lt;/p&gt;
&lt;p&gt;There was also discussion of fly-by-night developers, people who show up, produce a patch or two, and wander off.  James Turnbull (who handles 99% of the merging and release management) said he was fine accepting patches over email, rather than forcing people to publish everything via git.&lt;/p&gt;
&lt;p&gt;Other than those two changes, our development workflow has worked pretty well.  However, the fly-by-night patches led into discussion of&amp;#8230;&lt;/p&gt;
&lt;h2&gt;Core vs. Modules&lt;/h2&gt;
&lt;p&gt;Puppet&amp;#8217;s core is starting to get many non-core features, like Nagios and Zenöss integration.  It&amp;#8217;s essentially impossible for the core team to maintain all of these extentions, but many of them were written as a one-off solution and won&amp;#8217;t be maintained by their authors.  Because of this, we  as a project need to develop a means of splitting Puppet&amp;#8217;s core away from all of these modules.&lt;/p&gt;
&lt;p&gt;Discussion was had of using a Nagios-style &amp;#8216;plugins&amp;#8217; repository, but I don&amp;#8217;t like that idea because it leaves basically the same problem - a centralized repository that no one wants to maintain.&lt;/p&gt;
&lt;p&gt;Instead, we all basically agreed that we want to focus on modules as the means of adding functionality to Puppet, but the big problem there is that the only way to do so is to add package-like behaviours to modules, and none of us wants to make our own package manager.  Nonetheless, it was agreed that this was the only real option, so it just remains to do it.&lt;/p&gt;
&lt;h2&gt;Roadmap and Release Status&lt;/h2&gt;
&lt;p&gt;Against all odds, it looks like we&amp;#8217;ll get 0.25 out in February - I&amp;#8217;ll be merging in the last major refactor this week, and then it&amp;#8217;s just a question of getting as many bug-fixes in as we can and dropping the release.&lt;/p&gt;
&lt;p&gt;In addition, there are (annoyingly) a few important bugs in 0.24.7, so we&amp;#8217;re unfortunately going to have to be put out a 0.24.8 release.  One thing that&amp;#8217;s become clear in the last couple of releases is that we need to get more community testing of release candidates - many of the bugs would have been caught by basic testing in the community.&lt;/p&gt;
&lt;h2&gt;Facter Design and Shadow{Facter,Puppet}&lt;/h2&gt;
&lt;p&gt;RailsMachine released &lt;a href="http://github.com/railsmachine/shadow_puppet/tree/master" onclick="javascript:pageTracker._trackPageview('/outbound/article/github.com');"&gt;ShadowPuppet&lt;/a&gt; and &lt;a href="http://github.com/railsmachine/shadow_facter/tree/master" onclick="javascript:pageTracker._trackPageview('/outbound/article/github.com');"&gt;ShadowFacter&lt;/a&gt; in the last few weeks, and it&amp;#8217;s led to a flurry of design conversations.  We didn&amp;#8217;t cover too much of it in the dev call, other than my reiteration that I&amp;#8217;m excited by them and would like to merge them into Puppet and Facter.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And that was it.  Please join us on the next call if you can.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=FS9V5VBaPVo:NTOf9n69xIU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=FS9V5VBaPVo:NTOf9n69xIU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=FS9V5VBaPVo:NTOf9n69xIU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=FS9V5VBaPVo:NTOf9n69xIU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=FS9V5VBaPVo:NTOf9n69xIU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=FS9V5VBaPVo:NTOf9n69xIU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=FS9V5VBaPVo:NTOf9n69xIU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=FS9V5VBaPVo:NTOf9n69xIU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/02/05/summary-of-february-2009-puppet-developer-call/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/02/05/summary-of-february-2009-puppet-developer-call/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://madstop.com/2009/02/05/summary-of-february-2009-puppet-developer-call/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Golden Image or Foil Ball?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/w7QmS97Bq10/" />
		<id>http://madstop.com/?p=56</id>
		<updated>2009-02-04T04:23:50Z</updated>
		<published>2009-02-04T04:23:50Z</published>
		<category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="Sysadmin" /><category scheme="http://madstop.com" term="cloud" /><category scheme="http://madstop.com" term="ec2" /><category scheme="http://madstop.com" term="goldenimage" /><category scheme="http://madstop.com" term="reductive" />		<summary type="html"><![CDATA[The essential basis of running services in &#8220;the cloud&#8221; is that they run in virtual machines, which come with their own idioms and practices for managing them.  One of the mainstays of managing virtual machines (&#8217;VMs&#8217;) uses what&#8217;s called &#8216;golden images&#8217;.  These are images built up complete with the services they&#8217;re supposed to run, so [...]]]></summary>
		<content type="html" xml:base="http://madstop.com/2009/02/04/golden-image-or-foil-ball/">&lt;p&gt;The essential basis of running services in &amp;#8220;the cloud&amp;#8221; is that they run in virtual machines, which come with their own idioms and practices for managing them.  One of the mainstays of managing virtual machines (&amp;#8217;VMs&amp;#8217;) uses what&amp;#8217;s called &amp;#8216;golden images&amp;#8217;.  These are images built up complete with the services they&amp;#8217;re supposed to run, so that you can just start them and they&amp;#8217;ll immediately join the network and do whatever it is they&amp;#8217;re supposed to do.&lt;/p&gt;
&lt;p&gt;As the post title suggests, though, I think &amp;#8216;foil ball&amp;#8217; is a more appropriate term.&lt;/p&gt;
&lt;p&gt;You have significant problems when you rely on golden images:  Image sprawl, updating your images, and image state vs. running state.&lt;/p&gt;
&lt;p&gt;Image sprawl is what you get when the number of images (not running virtual machines) you have grows to an essentially unmaintainable figure.  Let&amp;#8217;s start with a simple LAMP stack:  At the least, you&amp;#8217;ll have a separate image for your web, database, and application servers.  Oh, except you probably need a load balancer image.  If you have any support services like DNS, you need an image for those.  And so on.  You soon find that you have a separate image for every service you provide.&lt;/p&gt;
&lt;p&gt;Now that you&amp;#8217;ve got this image sprawl, you run into the next issue:  Updating these images is relatively expensive, and nearly always results in redundancy.  It&amp;#8217;s expensive because even trivial changes require a full image rebuild, which is itself a bit complicated.  The redundancy comes because you *still* have to do some work on the image once it&amp;#8217;s booted as a server, even if it&amp;#8217;s minimal.  So now you&amp;#8217;ve got this complicated image generation process that has some kind of overlap with a simple on-server management process.  Another kind of redundancy arrives when you make a change that affects multiple images (e.g., upgrading the same package, or performing the same configuration change): you have to make this change to each of these images separately.&lt;/p&gt;
&lt;p&gt;Oh, and by the way - this updating process is usually completely unrelated to the process you use to update your non-image machines.  Because hey, if a little bit of redundancy is good, then redundant redundancy is especially awesome.&lt;/p&gt;
&lt;p&gt;Say you managed all of that, though, and all of your images are correctly updated all of the time.  Great, now you just have to reboot every machine on your network to take advantage of the new changes.  Of course, this isn&amp;#8217;t exactly feasible for every machine all the time, which means you&amp;#8217;ve got drift between the desired and actual configuration state.&lt;/p&gt;
&lt;p&gt;This is why I think maintaining these images is more like managing a foil ball:  It&amp;#8217;s difficult to pull apart, difficult to press back together, and if you get too many of them they just get into the way.&lt;/p&gt;
&lt;p&gt;If, instead, you use a single, base image for all of your work &amp;#8212; I call these images &lt;a href="http://en.wikipedia.org/wiki/Stem_cell" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');"&gt;stem cell&lt;/a&gt; images for what are hopefully obvious reasons - and then use a tool like &lt;a href="http://reductivelabs.com/trac/puppet/" onclick="javascript:pageTracker._trackPageview('/outbound/article/reductivelabs.com');"&gt;Puppet&lt;/a&gt; to configure them once they&amp;#8217;re running, you avoid all of the above problems:  You have one image to maintain and it&amp;#8217;s necessarily simplistic, you use the same tool and the same configuration base across all images, and Puppet keeps your machines updated within 30 minutes of any central change.&lt;/p&gt;
&lt;p&gt;So, if someone tries to sell you a golden image, don&amp;#8217;t buy it - instead choose a tool you can use for every machine in your organization, and push every configuration operation possible into that tool, rather than spreading tasks around to your provisioning, image management, and configuration management tools.  This is just as true for tools like Jumpstart and Kickstart - they should do as little as possible, and hand off immediately to a tool like Puppet; well, really, just Puppet. &lt;img src='http://madstop.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=w7QmS97Bq10:oeXibyU9NkI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=w7QmS97Bq10:oeXibyU9NkI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=w7QmS97Bq10:oeXibyU9NkI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=w7QmS97Bq10:oeXibyU9NkI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=w7QmS97Bq10:oeXibyU9NkI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=w7QmS97Bq10:oeXibyU9NkI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=w7QmS97Bq10:oeXibyU9NkI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=w7QmS97Bq10:oeXibyU9NkI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2009/02/04/golden-image-or-foil-ball/#comments" thr:count="17" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2009/02/04/golden-image-or-foil-ball/feed/atom/" thr:count="17" />
		<thr:total>17</thr:total>
	<feedburner:origLink>http://madstop.com/2009/02/04/golden-image-or-foil-ball/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>luke</name>
						<uri>http://madstop.com</uri>
					</author>
		<title type="html"><![CDATA[Puppet on the IT Management Podcast]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/madstop/~3/hdiWNHPHZtg/" />
		<id>http://madstop.com/?p=49</id>
		<updated>2008-12-22T15:46:44Z</updated>
		<published>2008-12-22T15:46:44Z</published>
		<category scheme="http://madstop.com" term="Geek" /><category scheme="http://madstop.com" term="OpenSource" /><category scheme="http://madstop.com" term="Puppet" /><category scheme="http://madstop.com" term="Sysadmin" /><category scheme="http://madstop.com" term="luke" /><category scheme="http://madstop.com" term="cote" /><category scheme="http://madstop.com" term="podcast" />		<summary type="html"><![CDATA[I was a guest on last week&#8217;s IT Management Podcast again last week, and we ended up talking a lot about Puppet and the difficulties in running an open source software company.  As always, John Willis and Coté are informed and interesting.  Give it a listen, and maybe subscribe to the whole series.
]]></summary>
		<content type="html" xml:base="http://madstop.com/2008/12/22/puppet-on-the-it-management-podcast/">&lt;p&gt;I was a guest on last week&amp;#8217;s &lt;a href="http://www.redmonk.com/cote/2008/12/22/itmanagement030/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.redmonk.com');"&gt;IT Management Podcast&lt;/a&gt; again last week, and we ended up talking a lot about Puppet and the difficulties in running an open source software company.  As always, &lt;a href="http://www.johnmwillis.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.johnmwillis.com');"&gt;John Willis&lt;/a&gt; and &lt;a href="http://www.redmonk.com/cote/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.redmonk.com');"&gt;Coté&lt;/a&gt; are informed and interesting.  Give it a listen, and maybe subscribe to the whole series.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/madstop?a=hdiWNHPHZtg:2TCXTR3U8hg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=hdiWNHPHZtg:2TCXTR3U8hg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=hdiWNHPHZtg:2TCXTR3U8hg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=hdiWNHPHZtg:2TCXTR3U8hg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=hdiWNHPHZtg:2TCXTR3U8hg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=hdiWNHPHZtg:2TCXTR3U8hg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/madstop?a=hdiWNHPHZtg:2TCXTR3U8hg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/madstop?i=hdiWNHPHZtg:2TCXTR3U8hg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<link rel="replies" type="text/html" href="http://madstop.com/2008/12/22/puppet-on-the-it-management-podcast/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://madstop.com/2008/12/22/puppet-on-the-it-management-podcast/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://madstop.com/2008/12/22/puppet-on-the-it-management-podcast/</feedburner:origLink></entry>
	</feed>
