<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris Read &#187; Config Management</title>
	<atom:link href="http://blog.chris-read.net/tag/config-management/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chris-read.net</link>
	<description>He's just this guy, you know...</description>
	<lastBuildDate>Tue, 13 Sep 2011 11:41:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.chris-read.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Chris Read &#187; Config Management</title>
		<link>http://blog.chris-read.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.chris-read.net/osd.xml" title="Chris Read" />
	<atom:link rel='hub' href='http://blog.chris-read.net/?pushpress=hub'/>
		<item>
		<title>Report back from DevOpsDays 2009</title>
		<link>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/</link>
		<comments>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 10:27:26 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[agile sysadmin]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=100</guid>
		<description><![CDATA[A few months ago I got an email from Patrick Debois who I&#8217;d met at CITCON Europe asking if I&#8217;d be interested in speaking at the first conference aimed at System Administrators practising/interested in/sceptical about Agile. One of the key beliefs of those of us doing this already is that Agile practices are generally too [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=100&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A few months ago I got an email from <a href="http://www.jedi.be/about/" target="_blank">Patrick Debois</a> who I&#8217;d met at <a href="http://www.citconf.com/" target="_blank">CITCON</a> Europe asking if I&#8217;d be interested in speaking at the first conference aimed at System Administrators practising/interested in/sceptical about Agile. One of the key beliefs of those of us doing this already is that Agile practices are generally too narrowly focussed in their implementation. At the moment it&#8217;s primarily the Development organization who drive its adoption, but to get the most benefit Development and Operations groups within an organization need to work together.</p>
<p>With this in mind it was decided to call the conference <a href="http://www.devopsdays.org/" target="_blank">DevOpsDays</a>. Videos of the talks will be online in the archives section soon, so I&#8217;ve decided to write down my thoughts about what went well and not so well &#8211; I am a fan of retrospectives.<br />
<span id="more-100"></span><br />
<strong>What Went Well</strong></p>
<p>The conference was in Ghent, a city in Belgium, and as expected had quite a heavy European contingent. It was not not exclusively so though, as <a href="http://reductivelabs.com/" target="_blank">Reductive Labs</a> and <a href="http://www.canonical.com/" target="_blank">Canonical</a> both sent representatives over from the USA, and one of the speakers is an Aussie who just happened to be back packing around Europe at the time. One of my first great learnings though was that there are about 10 of us in the greater London area who are doing this kind of thing (2 of them ex-TWers) so we&#8217;ve started meeting regularly and exchanging ideas.</p>
<p>As there was such a large concentration of us around London, we&#8217;ve decided to try and subvert one of the London Geek Nights as a DevOps night to try and spread the word to more Devs. I&#8217;ll probably make more noise about it here when we&#8217;ve got dates confirmed.</p>
<p>The next great thing I loved was the format. It was split up into talks in the morning, with Open Spaces in the afternoon, over 2 days. This format actually worked very well as many of the open space sessions were inspired by the talks. Another interesting mix was that there was an even split between talks on tools and talks on practices.</p>
<p>I also discovered some great tools! Here&#8217;s a brief list of ones I liked the most:</p>
<ul>
<li><a href="http://code.google.com/p/mcollective/" target="_blank">The Marionette Collective</a> &#8211; using a message bus to administer 100&#8242;s of servers using pub/sub topics. You&#8217;ve got to watch the video to appreciate the full awesomeness.</li>
<li><a href="http://auxesis.github.com/cucumber-nagios/" target="_blank">Cucumber-Nagios</a> &#8211; writing tests to monitor your system using Cucumber, and then formatting the results as a Nagios plugin so you can easily wire it in to your monitoring system.</li>
<li><a href="http://flapjack-project.com/" target="_blank">Flapjack</a> &#8211; another example of interesting use of a message bus. This time to parallelize the monitoring of 100&#8242;s of servers. I&#8217;m not sure I totally agree with the approach, but what really blew me away was they way they do graphing and reporting. It&#8217;s very impressive.</li>
<li><a href="http://collectd.org/" target="_blank">collectd</a> &#8211; collectd gathers statistics about the system it is running on and stores this information in RRD databases. One of the things I really like about this though is that there are plugins for it like <a href="http://support.hyperic.com/display/hypcomm/jcollectd" target="_blank">Jcollectd</a> which requires no code changes. Simply plug it into your classpath and it registers a JMX MBean that pumps data from your JVM to collectd (I think). I&#8217;ve not tried it in production yet though&#8230;</li>
</ul>
<p>Overall the conference was very well received, and I&#8217;m looking forward to next years instalment. There&#8217;s a lot of talk about doing a North American version&#8230;</p>
<p><strong>Not So Well<br />
</strong><br />
As we all know, the best bits about Away Days/Conferences are the talks in the hall between sessions. The problem with the program was that we barely had enough time for bio breaks between sessions, and everyone was quite burned out at the end of day two (not just because of the Belgian Beer). I think it&#8217;s a pretty easy thing to fix though and considering that it was the first conference of its type there&#8217;s bound to be some fine tuning required.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=100&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/11/24/report-back-from-devopsdays-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Self Identifying Software</title>
		<link>http://blog.chris-read.net/2009/09/22/self-identifying-software/</link>
		<comments>http://blog.chris-read.net/2009/09/22/self-identifying-software/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 17:09:41 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=91</guid>
		<description><![CDATA[How often has someone come up to you and asked you what build of your software is currently deployed in a specific environment? How many times have you come across a .jar or .dll file and wondered what version it is? Especially when using Open Source Software? The most frightening one for me is when [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=91&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>How often has someone come up to you and asked you what build of your software is currently deployed in a specific environment?</p>
<p>How many times have you come across a <em>.jar</em> or <em>.dll</em> file and wondered what version it is? Especially when using Open Source Software?</p>
<p>The most frightening one for me is when I&#8217;ve looked at a cluster of production servers and noticed that the <em>.war</em> file for the application deployed on it is a different size on one of the nodes. Which one was the correct one to deploy? Luckily this happened to me a long time ago, but I know that people out there are still having this problem today.</p>
<p>The solution is what I call <em>&#8220;Self Identifying Software&#8221;</em>. Every build of your software needs to have something that tells you what version it is and how to get back to the source code that created it. Having a build label or release number visible in your application is a good start, but it does not make your software <em>Self Identifying</em>. Product companies have been doing this for ever. The problem is that for that number to be useful (particularly when you&#8217;re trying to access the source code to reproduce and fix a bug) you then need to refer to a build system or release notes to find out where the source code came from (if you&#8217;re lucky). It often also does not apply to development builds. To be truly <em>Self Identifying</em> you need to make sure that <em><span style="text-decoration:underline;"><strong>every</strong></span></em> build (including builds developers create on their workstations) also includes enough information from the SCM system so that anyone who has access to the source code can go right back to the exact source code that produced that binary. For example, if you use Subversion as your SCM then this will be a URL and a revision number.</p>
<p>This is not exactly a new concept, it&#8217;s something I (and others) have been doing for a number of years now. The reason I&#8217;ve decided to write about it now though is that recently I was showing a new guy around one of the projects I&#8217;m working on at the moment, and when I showed him how to determine which version of the app was deployed he was delighted.<br />
<span id="more-91"></span></p>
<h2>How do I get my software to identify itself?</h2>
<p>There are generally two scenarios where I would want to get the identity of some software. The first is where I have a service or system running somewhere that I would like to know the version of, and the second is where I have a binary artefact and I&#8217;m trying to determine it&#8217;s provenance.</p>
<p>When querying a service, the easiest is to be able to hit a well known URL (or make a well known service call) that tells me what I need to know. What the exact URL or service call is is not important, as long as those who need it know how to invoke it. This is most useful then you don&#8217;t actually have access to the binaries that power the service.</p>
<p>However, if you do have access to the binaries then it&#8217;s usually easiest just to examine the meta data of the file to see where it came from. Most modern binary formats allow for this in some way. If you&#8217;re working with Java then all <em>.jar</em>, <em>.war</em> and <em>.ear</em> files allow you to put this into the <em>META-INF/MANIFEST.MF</em> file. Creative use of <em>versioninfo</em> resources will allow you to achieve similar results if you&#8217;re dealing with Windows. Note that we&#8217;re not talking about putting this information into the file name itself &#8211; file names change.</p>
<h2>How do I use it?</h2>
<p>Having <em>Self Identifying Software</em> goes beyond just being able to quickly track down the source code that built the binaries you&#8217;re dealing with. Here are a few other uses I&#8217;ve found:</p>
<ul>
<li>When used as part of a Continuous Deployment system you can verify that you&#8217;ve got the correct version of the binaries before you start deploying things, and you can then use the service call to verify that the correct version of the app is up and running at the end of the deployment processes.</li>
<li>When used as part of a dynamic system dashboard you can quickly and easily see what&#8217;s installed where instead of relying on spreadsheets or documents that often get forgotten.</li>
</ul>
<p>If you find any more, please let me know&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=91&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/09/22/self-identifying-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing ESCAPE</title>
		<link>http://blog.chris-read.net/2009/02/13/introducing-escape/</link>
		<comments>http://blog.chris-read.net/2009/02/13/introducing-escape/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 12:31:12 +0000</pubDate>
		<dc:creator>Chris Read</dc:creator>
				<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Build Pipelines]]></category>
		<category><![CDATA[Config Management]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.chris-read.net/?p=50</guid>
		<description><![CDATA[Whenever I talk to new clients about Continuous Integration, and especially about using Build Pipelines to extend their CI process to cover testing things like the deployment of their application, there is always one question that is guaranteed to pop up &#8211; how do I manage the configuration of my application in all these environments? [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=50&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Whenever I talk to new clients about Continuous Integration, and especially about using Build Pipelines to extend their CI process to cover testing things like the deployment of their application, there is always one question that is guaranteed to pop up &#8211; how do I manage the configuration of my application in all these environments?</p>
<p>This is always a hard one to answer. In the last place I worked as a System Administrator we used <a title="Split-Horizon DNS" href="http://en.wikipedia.org/wiki/Split-horizon_DNS" target="_blank">Split-Horizon DNS</a> as one of the ways to solve connecting to the correct host for a service. Our applications had hard coded hostnames for key services such as <em>db.internal.domain</em>, <em>loghost.internal.domain</em> and <em>mailhost.internal.domain</em>. Depending on which environment they ran in, when the did a DNS lookup they would get an answer that pointed them to the correct server providing that service for the environment they were physically running in. Combine this with tools like an LDAP Server in each of these environments containing the rest of the system configuration and life is easy. Or is it?</p>
<p>DNS and LDAP servers are relatively straight forward for experienced Sys Admins to understand and maintain, but they still can&#8217;t be described as easy to use, which is probably why so few people do it. This limits our options for fixing things down to two general categories &#8211; fix DNS and LDAP admin tools so they are easy to use, or find another way to solve the problem.</p>
<p>We chose the path of least resistance and went for the second option &#8211; creating <a href="http://code.google.com/p/escservesconfig/" target="_blank">ESCAPE</a>. In the Unix tradition, it&#8217;s an app that takes one problem and solves it simply and well (at least in our opinion). It provides a RESTful interface for both the setting and getting of environment configuration. <tt>GET</tt> requests will retrieve configuration, whereas <tt>POST/PUT</tt> requests will create new entries or update them.</p>
<p>The URL scheme we&#8217;ve decided on is most easily demonstrated by constructing an example URL:</p>
<table border="0">
<tbody>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><strong>URL</strong></td>
<td style="border:1px solid #aaaaaa;padding:5px;"><strong>Value returned in the body</strong></td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">User interface. No API available here.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">A JSON list of all the available environment.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">A JSON list of all the applications in the &#8220;production&#8221; environment.</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/mywebapp</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">All keys and values for the &#8220;mywebapp&#8221; application in the &#8220;production&#8221; environment.e.g:<br />
key1=value1<br />
key2=value2</td>
</tr>
<tr>
<td style="border:1px solid #aaaaaa;padding:5px;"><tt>http://escape/environments/production/mywebapp/thiskey</tt></td>
<td style="border:1px solid #aaaaaa;padding:5px;">The value of &#8220;thiskey&#8221; for the &#8220;mywebapp&#8221; application in the &#8220;production&#8221; environment.</td>
</tr>
</tbody>
</table>
<p>As the tool is now usable we&#8217;ve happily released version 0.1. Currently we&#8217;re busy putting a lot of work into making the management interface understandable and intuitive to use. The closest thing we currently have to a roadmap is our <a href="http://code.google.com/p/escservesconfig/wiki/ToDo" target="_blank">ToDo</a> list.</p>
<p>Please join us on the <a href="http://groups.google.com/group/escservesconfig-discuss" target="_blank">discussion group</a> with your feedback.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chrisread.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chrisread.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chrisread.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chris-read.net&amp;blog=4083712&amp;post=50&amp;subd=chrisread&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chris-read.net/2009/02/13/introducing-escape/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">Chris Read</media:title>
		</media:content>
	</item>
	</channel>
</rss>
