<?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>Puppet Labs &#187; Blog</title>
	<atom:link href="http://puppetlabs.com/category/blog/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://puppetlabs.com</link>
	<description>Puppet Labs: IT Automation Software for System Administrators</description>
	<lastBuildDate>Wed, 16 May 2012 22:05:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Removing lint from the Puppet’s belly button of fluffy automation chaos, or: Using puppet-lint to save yourself from style faux pas</title>
		<link>http://puppetlabs.com/blog/using-puppet-lint-to-save-yourself-from-style-faux-pas/</link>
		<comments>http://puppetlabs.com/blog/using-puppet-lint-to-save-yourself-from-style-faux-pas/#comments</comments>
		<pubDate>Mon, 14 May 2012 20:42:22 +0000</pubDate>
		<dc:creator>Ben Hughes</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[automated testing]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[Puppet Enterprise]]></category>
		<category><![CDATA[puppet-lint]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14174</guid>
		<description><![CDATA[Wouldn&#8217;t it be nice if you never made a mistake or a typo again? Okay, that&#8217;s a slightly misleading offer. How about just never committing such gaffes in with your code? &#8220;How?&#8221; I hear you cry. With the illustrious Tim Sharpe&#8217;s puppet-lint and some version control derring-do! Following on from Adrien&#8217;s wonderful post on syntax [...]]]></description>
			<content:encoded><![CDATA[<p>Wouldn&#8217;t it be nice if you never made a mistake or a typo again? Okay, that&#8217;s a slightly misleading offer. How about just never committing such gaffes in with your code? &#8220;How?&#8221; I hear you cry. With the illustrious Tim Sharpe&#8217;s <a href="https://github.com/rodjek/puppet-lint">puppet-lint</a> and some version control derring-do!</p>
<p>Following on from Adrien&#8217;s wonderful post on <a href="http://puppetlabs.com/blog/verifying-puppet-checking-syntax-and-writing-automated-tests/">syntax checking and writing tests</a>, you have a way of checking the syntax and style guide from the command line. Using this approach, even on a mature (like a fine wine) Puppet code base, you can move towards having beautiful, aligned, ordered manifests—the type of manifests you&#8217;d be happy taking home to meet the family.</p>
<p>Puppet-lint takes the Puppet Labs Style Guide and places it nicely in a command line tool. Think of it as a <a href="http://www.python.org/dev/peps/pep-0008/">programmatic PEP-8</a> for those from a Pythonic world. Now, where this comes in handy is when you&#8217;re using revision control (which is all the time, obviously!), because you can tie the two together. Yes, every time you try and commit your code to your RCS, it checks the files you&#8217;re committing, and makes sure you haven&#8217;t used a tab where there should be a space.</p>
<p>In Puppet Labs&#8217; kickass Operations department, we&#8217;re ever so slightly keen on <a href="http://git-scm.com/">Git</a>, not least due to the wonderful GitHub. RCSHub just doesn&#8217;t cut it for us these days.</p>
<p>With Git, as with many an RCS, you&#8217;re free to define hooks to do weird and wondrous things upon certain actions. This chapter on <a href="http://git-scm.com/book/en/Customizing-Git-Git-Hooks">git hooks</a> from <em>Customizing Git</em>  explains them in detail. If you’re using Subversion, then this <a href="http://svnbook.red-bean.com/en/1.7/svn.ref.reposhooks.pre-commit.html">pre-commit documentation</a> suggests what you can do on the server side to accomplish the same thing.</p>
<p>For this, the pre-commit hook is the one we want to utilise. I first make a bash script to get a list of the files that change in the commit. Then, the hook script goes through them one at a time, seeing if they&#8217;re Puppet manifests by name, and running puppet-lint on them as it goes. If any of the manifests fail linting, it exits there and then I may go fix them at my leisure!</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># Requires bash, as it uses the [[ ]] syntax.</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># If it's puppet code, lint it up.</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># I we don't have puppet-lint, so just exit and leave them be.</span>
<span style="color: #c20cb9; font-weight: bold;">which</span> puppet-lint <span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">exit</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Variables goes hither</span>
<span style="color: #7a0874; font-weight: bold;">declare</span> <span style="color: #660033;">-a</span> FILES
<span style="color: #007800;">IFS</span>=<span style="color: #ff0000;">&quot;
&quot;</span>
<span style="color: #007800;">FILES</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">--cached</span> <span style="color: #660033;">--name-only</span> <span style="color: #660033;">--diff-filter</span>=ACM <span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #800000;">${FILES[@]}</span>
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$file</span> =~ \.<span style="color: #000000; font-weight: bold;">*</span>.pp\$ <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
  <span style="color: #000000; font-weight: bold;">then</span>
    puppet-lint <span style="color: #660033;">--with-filename</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$file</span>&quot;</span>
    <span style="color: #007800;">RC</span>=<span style="color: #007800;">$?</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$RC</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #007800;">$RC</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

<p>I save that file to .git/hooks/pre-commit in my repository, give it a light sprinkling of &#8216;chmod +x&#8217;, a dash of &#8216;gem install puppet-lint&#8217; and I am ready to roll.</p>
<h2>Exhibit A, the Larch</h2>
<p>So let&#8217;s see this bad-boy in use, I hear you cry! Let&#8217;s take a manifest that breaks all of the rules, and see what happens&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">node <span style="color:#996600;">'hubert.humphrey.edu'</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
&nbsp;
	user<span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">&quot;mhunter&quot;</span>:
	   managehome <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
	   home <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;/home/mhunter&quot;</span>,
	   comment <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Mark Hunter'</span>,
	   <span style="color:#9966CC; font-weight:bold;">ensure</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'present'</span>
   <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"><span class="br0">&#91;</span>enlil:puppetlabs-modules<span class="br0">&#93;</span>% git commit hubert.pp
hubert.pp - WARNING: double quoted string containing no variables on line <span style="">3</span>
hubert.pp - WARNING: double quoted string containing no variables on line <span style="">5</span>
hubert.pp - WARNING: =&gt; on line isn't properly aligned for resource on line <span style="">5</span>
hubert.pp - WARNING: =&gt; on line isn't properly aligned for resource on line <span style="">6</span>
hubert.pp - WARNING: =&gt; on line isn't properly aligned for resource on line <span style="">7</span>
hubert.pp - ERROR: two-space soft tabs not used on line <span style="">4</span>
hubert.pp - ERROR: two-space soft tabs not used on line <span style="">5</span>
hubert.pp - ERROR: two-space soft tabs not used on line <span style="">6</span>
hubert.pp - ERROR: two-space soft tabs not used on line <span style="">7</span>
hubert.pp - ERROR: two-space soft tabs not used on line <span style="">8</span>
hubert.pp - ERROR: trailing whitespace found on line <span style="">2</span>
hubert.pp - WARNING: ensure found on line but it's not the first attribute on line <span style="">7</span></pre></div></div>

<p>Woah, that&#8217;s a lot of errors. By default, puppet-lint will let warnings through, but stop dead on errors, and we got them all! I&#8217;ll tidy this manifest up&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">node <span style="color:#996600;">'hubert.humphrey.edu'</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
&nbsp;
  user<span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">'mhunter'</span>:
    <span style="color:#9966CC; font-weight:bold;">ensure</span>     <span style="color:#006600; font-weight:bold;">=&gt;</span> present,
    managehome <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
    home       <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'/home/mhunter'</span>,
    comment    <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Mark Hunter'</span>,
  <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Much more readable, and now when I try and commit it, I get:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"><span class="br0">&#91;</span>enlil:puppetlabs-modules<span class="br0">&#93;</span>% git commit hubert.pp
<span class="br0">&#91;</span>master <span style="">6020331</span><span class="br0">&#93;</span> Add in a new pupil to the school!
 <span style="">1</span> file changed, <span style="">10</span> insertions<span class="br0">&#40;</span>+<span class="br0">&#41;</span>
 create mode <span style="">100644</span> hubert.pp</pre></div></div>

<p>Clean, and the best part is I don&#8217;t have to alter my workflow, I can just carry on editing with Vim, commit my work as normal, and just be kindly reminded when a manifest has things that need tidying up.</p>
<p><em>Learn More</em></p>
<ul>
<li><a href="http://docs.puppetlabs.com/guides/style_guide.html">Puppet Labs style guide</a></li>
<li><a href="https://github.com/rodjek/puppet-lint">puppet-lint</a></li>
<li><a href="http://puppetlabs.com/blog/verifying-puppet-checking-syntax-and-writing-automated-tests/">Verifying Puppet: Checking Syntax and Writing Automated Tests</a></li>
<li><a href="http://geek.jasonhancock.com/2012/04/18/puppet-svn-pre-commit-hook/">Puppet-lint SubVersion commit hook by Jason Hancock</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/using-puppet-lint-to-save-yourself-from-style-faux-pas/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Introducing Puppet Labs Boundary Module</title>
		<link>http://puppetlabs.com/blog/introducing-puppet-labs-boundary-module/</link>
		<comments>http://puppetlabs.com/blog/introducing-puppet-labs-boundary-module/#comments</comments>
		<pubDate>Fri, 11 May 2012 17:52:41 +0000</pubDate>
		<dc:creator>James Turnbull</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Systems Management]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[puppet forge]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14064</guid>
		<description><![CDATA[Boundary is a network analysis tool that allows fast analysis and an ultra-fine resolution of data. To achieve this speed and resolution of data, Boundary employs software meters, installed on your application servers, that examine the header information of every packet and securely stream it to the Boundary service once a second. We&#8217;re excited to announce [...]]]></description>
			<content:encoded><![CDATA[<p>Boundary is a network analysis tool that allows fast analysis and an ultra-fine resolution of data. To achieve this speed and resolution of data, Boundary employs software meters, installed on your application servers, that examine the header information of every packet and securely stream it to the Boundary service once a second. We&#8217;re excited to announce our Boundary module to install and manage <a title="Boundary" href="http://www.boundary.com">Boundary</a> network meters, developed in conjunction with the Boundary team and the Puppet community, has reached <a title="Boundary module on the Puppet Forge" href="http://forge.puppetlabs.com/puppetlabs/boundary">v1 and is released onto the Puppet Forge</a>! The module also contains support for sending reports from Puppet to <a title="Boundary" href="http://www.boundary.com">Boundary</a>.</p>
<p>To use the module you need to download it from the Puppet Forge onto your Puppet master using the module tools:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;"># puppet module install puppetlabs-boundary</pre></div></div>

<p>You can then use the module to install and manage the Boundary meters that monitor your network traffic and send the results to Boundary.  To create a new meter you will need your Boundary ID and API key and create a `boundary_meter` resource like so:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">boundary_meter <span class="br0">&#123;</span> &quot;db.example.com&quot;:
  ensure =&gt; present,
  id =&gt; &quot;abcde12345&quot;,
  apikey =&gt; &quot;abcde12345&quot;,
  tags =&gt; <span class="br0">&#91;</span> &quot;production&quot;, &quot;newyork&quot;, &quot;mysql&quot;, &quot;appcluster1&quot; <span class="br0">&#93;</span>,
<span class="br0">&#125;</span></pre></div></div>

<p>This resource will create a meter called &#8220;db.example.com&#8221; and add the tags production, newyork, mysql and appcluster1 (or the tags of your choice).  After you run Puppet you will be able to see your meter in the Boundary console.  We can also easily delete the meter by ensuring it is `absent`.</p>
<p>You can find the <a title="Boundary module on GitHub" href="https://github.com/puppetlabs/puppetlabs-boundary">source code on GitHub</a> and we welcome bug reports, ideas and features from the Puppet community. Thanks to <a title="Joe Williams" href="https://github.com/joewilliams">Joe Williams</a>, <a title="Jeff Hulten" href="https://github.com/jhulten">Jeff Hulten</a>, <a title="Andrew Loe" href="https://github.com/loe">W. Andrew Loe III</a>, <a title="Alessandro Franceschi" href="https://github.com/example42">Alessandro Franceschi</a> and <a title="Scott Smith" href="https://github.com/ohlol">Scott Smith</a> for their contributions to the current module.</p>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/introducing-puppet-labs-boundary-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing The Marionette Collective 2.0</title>
		<link>http://puppetlabs.com/blog/announcing-the-marionette-collective-2-0/</link>
		<comments>http://puppetlabs.com/blog/announcing-the-marionette-collective-2-0/#comments</comments>
		<pubDate>Wed, 09 May 2012 16:52:58 +0000</pubDate>
		<dc:creator>R.I. Pienaar</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[MCollective]]></category>
		<category><![CDATA[product release]]></category>
		<category><![CDATA[mcollective]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[puppet labs]]></category>
		<category><![CDATA[R.I. Pienaar]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13976</guid>
		<description><![CDATA[I am proud to announce the release of the next major production version of The Marionette Collective (MCollective). This release brings together almost a year&#8217;s worth of work and introduces great improvements in security, stability, platform support and new features in the core messaging layer. The major areas of advance are below: Complete messaging protocol [...]]]></description>
			<content:encoded><![CDATA[<p>I am proud to announce the release of the next major production version of The Marionette Collective (MCollective). This release brings together almost a year&#8217;s worth of work and introduces great improvements in security, stability, platform support and new features in the core messaging layer.</p>
<p>The major areas of advance are below:</p>
<ul>
<li>Complete messaging protocol rewrite to enable direct style connectivity that would allow programs to bypass normal discovery instead using their own data sources</li>
<li>An additional more robust messaging paradigm supporting a more assured addressing and delivery scheme</li>
<li>Batched mode allowing users to address machines in small groups thus avoiding thundering herd and enabling more granular changes</li>
<li>A more complete language for expressing discovery that includes and/or/not style queries across the infrastructure</li>
<li>Improved Stomp connection security using normal industry standard Certificate Authority validated TLS</li>
<li>New connector that uses ActiveMQ-specific features for better performance and scalability</li>
<li>Security of the SSL and AES security plugins have been improved for tamper protection by middle men</li>
<li>A message validity period has been introduced to lower the window of message replay attacks</li>
<li>Better error handling and better logging for Stomp connections</li>
<li>JSON output from the ‘rpc’ application</li>
<li>Ability to pipe RPC requests into each other creating a chain of related RPC calls</li>
<li>Better validations, better error handling and better documentation creation from the DDL</li>
<li>Performance improvements in the CLI, more consistently formatted output of received data</li>
<li>A Ruby GEM of the client is now made available on rubygems.org</li>
<li>The rc script for Debian based systems have been improved to prevent duplicate daemons from running</li>
<li>Built in packager for plugins into native OS packages—RedHat and Debian supported</li>
<li>MS Windows Support</li>
</ul>
<p>The full <a href="http://docs.puppetlabs.com/mcollective/releasenotes.html">release notes</a> for this release expands on key areas of the above list and you can download this release from our <a href="http://info.puppetlabs.com/download-puppet-open-source.html">download area</a>, <a href="http://yum.puppetlabs.com/">Yum repository</a> or our <a href="http://apt.puppetlabs.com/">Apt repository</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/announcing-the-marionette-collective-2-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Upcoming Puppet Events: New Camps, PuppetConf, and Velocity</title>
		<link>http://puppetlabs.com/blog/upcoming-puppet-events-new-camps-puppetconf-and-velocity/</link>
		<comments>http://puppetlabs.com/blog/upcoming-puppet-events-new-camps-puppetconf-and-velocity/#comments</comments>
		<pubDate>Tue, 08 May 2012 15:46:24 +0000</pubDate>
		<dc:creator>jose</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Conferences and Workshops]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Puppet Camp]]></category>
		<category><![CDATA[PuppetConf]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[puppet labs]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13937</guid>
		<description><![CDATA[Puppet Labs has been a busy place in the last month: we announced PuppetConf and released the very first seats for the Puppet Professional Certification Program (more details coming soon), we also announced our support for OpenStack and we announced PuppetDB, affectionately known around the office as project Greyskull. As we move ahead into May [...]]]></description>
			<content:encoded><![CDATA[<p>Puppet Labs has been a busy place in the last month: we announced <a href="http://www.puppetconf.com">PuppetConf</a> and released the very first seats for the Puppet Professional Certification Program (more details coming soon), we also announced our support for <a href="http://puppetlabs.com/solutions/openstack/">OpenStack</a> and we announced PuppetDB, affectionately known around the office as project Greyskull. As we move ahead into May and June we hope to see you at some of the following events:</p>
<p>May 19 &#8211; <a href="http://puppetcampla.eventbrite.com">Puppet Camp Los Angeles</a>: Senior Developer Deepak Giridharagopal will introduce PuppetDB, and the Puppet projects team lead Daniel Pittman will share the Puppet roadmap for 2012.</p>
<p>May 21 &#8211; Find us at <a href="http://www.emcworld.com/">EMC world</a>, we&#8217;ll be around and looking to find you. Follow us <a href="http://www.twitter.com/puppetlabs">@puppetlabs</a> to find out where we are.</p>
<p>We&#8217;ve announced new Puppet Camps for June and July:</p>
<ul>
<li><a href="http://puppetcampsea.eventbrite.com">Southeast Asia</a> in Kuala Lumpur on June 5th</li>
<li><a href="http://puppetcampsydney.eventbrite.com">Sydney</a> on June 8th (tickets are almost gone!)</li>
<li><a href="http://www.puppetlabs.com/puppetcamp">District of Columbia</a> on June 19th
<li>
<li>Puppet Camp <a href="http://puppetcampboston.eventbrite.com/">Boston</a> on June 22</li>
<li><a href="http://puppetcampchicago.eventbrite.com">Chicago</a> on July 23rd</li>
<p>And don&#8217;t forget about our previously announced our European camps in <a href="http://puppetcampdublin.eventbrite.com">Dublin</a>, Ireland on July 6th and <a href="http://puppetcamp-geneva-at-lsmconf.eventbrite.com">Geneva</a>, Switzerland on July 11th.</p>
<p>After the end of July we&#8217;ll be working to produce an epic <a href="http://www.puppetconf.com">PuppetConf</a> in San Francisco on September 27th and 28th. Register now to guarantee a seat. Like many of our Puppet Camps, PuppetConf is sure to sell out.</p>
<p>We&#8217;re also happy to offer you a 10% discount to <a href="http://www.velocityconf.com">Velocity</a> on June 25-28. Just use code PUPPETLABS when you register and then come find us at booth #517 and check out presentations from <a href="http://velocityconf.com/velocity2012/public/schedule/detail/23203">James Turnbull</a> and <a href="http://velocityconf.com/velocity2012/public/schedule/detail/23639">Luke Kanies</a> at Velocity.</p>
<p><a href="http://velocityconf.com/velocity2012"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/468x60.png" alt="" title="Velocity Conf" width="468" height="60" class="aligncenter size-full wp-image-13946" /></a></p>
<p>We&#8217;re looking forward to connecting with you this summer.</p>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/upcoming-puppet-events-new-camps-puppetconf-and-velocity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Module of the Week: Puppet Module Tool &#8211; Part 2</title>
		<link>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-2/</link>
		<comments>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-2/#comments</comments>
		<pubDate>Mon, 07 May 2012 13:51:56 +0000</pubDate>
		<dc:creator>Kelsey Hightower</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Module of the Week]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Systems Management]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13884</guid>
		<description><![CDATA[This week we&#8217;ll wrap up our coverage of the Puppet Module Tool (PMT) by exploring the install, upgrade, and uninstall commands. Lets jump right in. PMT Install The install command installs modules from the Forge using the full name of the module (author-module). We can install the &#8220;puppetlabs-apache&#8221; module like this: Installing a specific version [...]]]></description>
			<content:encoded><![CDATA[<p>This week we&#8217;ll wrap up our coverage of the Puppet Module Tool (PMT) by exploring the install, upgrade, and uninstall commands. Lets jump right in.</p>
<h2>PMT Install</h2>
<p>The install command installs modules from the Forge using the full name of the module (author-module). We can install the &#8220;puppetlabs-apache&#8221; module like this:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.03.29-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.03.29-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13887" /></a></p>
<h3>Installing a specific version</h3>
<p>We can also install a specific version of a module using the <code>--version</code> (<code>-v</code>) flag:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.05.36-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.05.36-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13890" /></a></p>
<p>PMT now enforces <a href="http://semver.org/" title="Semantic Versioning">SemVer</a> when installing modules. If a module does not meet SemVer requirements it will fail to install.</p>
<h3>Automatic dependencies resolution</h3>
<p>One of the major enhancements to PMT is the ability to automatically resolve and install module dependencies. Once a manual process is now completely automated:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.04.03-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.04.03-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13894" /></a></p>
<p>Notice that the install command grabs the requested module, puppetlabs-bacula, and its depenedencies: puppetlabs-mysql, puppetlabs-sqlite, and puppetlabs-stdlib.</p>
<h2>PMT Upgrade</h2>
<p>PMT also sports the ability to upgrade installed modules:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.06.05-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.06.05-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13897" /></a></p>
<p>From the output we can see that we have upgraded the &#8220;puppetlabs-stdlib&#8221; module from version 2.2.1 to 2.3.1.</p>
<h2>PMT Uninstall</h2>
<p>Before this release of PMT, users had to manually remove modules from their module paths. While something like &#8220;rm -rf /etc/puppet/modules/stdlib&#8221; works, it&#8217;s not what we call user friendly. This version of the module tool greatly improves the experience around uninstalling modules.</p>
<p>Be sure to use the full module name when uninstalling modules or you&#8217;ll get the following error:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.07.21-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.07.21-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13904" /></a></p>
<p>Notice the helpful error message suggesting that maybe you meant &#8220;puppetlabs-stdlib&#8221;, and in fact we did:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.07.38-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.07.38-PM.png" alt="" width="684" height="466" class="aligncenter size-full wp-image-13903" /></a></p>
<h3>Look before you leap</h3>
<p>The uninstall commands also checks for local changes and broken dependenices before uninstalling a module. Check out what happens if I try and uninstall the &#8220;puppetlabs-mysql&#8221; module:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.36.00-PM.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/Screen-Shot-2012-05-06-at-10.36.00-PM.png" alt="" width="732" height="466" class="aligncenter size-full wp-image-13908" /></a></p>
<p>PMT stops you with an error because uninstalling puppetlabs-mysql would leave the puppetlabs-bacula module with an unmet a dependency. You can by-pass this error by using the <code>--force</code> flag, but you can&#8217;t say we didn&#8217;t warn you!</p>
<h2>Conclusion</h2>
<p>PMT has been greatly enhanced to provide a much better experience when consuming modulew from the <a href="http://forge.puppetlabs.com">Puppet Forge</a>. With the new list, search, install, upgrade, and uninstall commands managing modules couldn&#8217;t be easier.</p>
<h3>Additional Resources</h3>
<ul>
<li><a href="http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-1/">Puppet Module Tool Part 1</a></li>
<li><a href="http://semver.org/" title="Semantic Versioning">SemVer</a></li>
<li><a href="http://puppetlabs.com/category/blog/module-of-the-week-blog">Previous Modules of the Week</a></li>
<li><a href="http://forge.puppetlabs.com">Puppet Forge &#8211; Module Repository</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Module of the Week: Puppet Module Tool &#8211; Part 1</title>
		<link>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-1/</link>
		<comments>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-1/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 20:12:50 +0000</pubDate>
		<dc:creator>Kelsey Hightower</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Module of the Week]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Systems Management]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[module of the week]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[Puppet Enterprise]]></category>
		<category><![CDATA[puppet module tool]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13761</guid>
		<description><![CDATA[This week we&#8217;re going to begin our coverage of the Puppet Module Tool (PMT). The PMT is the command-line interface to the Puppet Forge—an online repository for re-usable Puppet modules. As of Puppet 2.7.14 and Puppet Enterprise 2.5 PMT is no longer a separate product; it&#8217;s now part of Puppet Core. What this means for [...]]]></description>
			<content:encoded><![CDATA[<p>This week we&#8217;re going to begin our coverage of the Puppet Module Tool (PMT). The PMT is the command-line interface to the <a href="http://forge.puppetlabs.com/" title="Puppet Forge" target="_blank">Puppet Forge</a>—an online repository for re-usable Puppet modules. As of Puppet 2.7.14 and Puppet Enterprise 2.5 PMT is no longer a separate product; it&#8217;s now part of Puppet Core. What this means for you is that PMT is ready-to-go out of the box.</p>
<h2>New features</h2>
<p>The latest version of PMT offers a few new features over the previous stand-alone tool:</p>
<ul>
<li>Search the Puppet Forge from the command line</li>
<li>List, upgrade, and uninstall modules</li>
<li>Automatically resolve and install module dependencies</li>
</ul>
<p>In this post we&#8217;ll take a look at the new search and list commands.</p>
<h2>PMT Search</h2>
<p>The search command searches a repository for modules whose names, descriptions, or keywords match the provided search term. For example, if we search for the term &#8220;tomcat&#8221;, we would get the following output:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_search_tomcat.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_search_tomcat.png" alt="" width="684" height="464" class="aligncenter size-full wp-image-13769" /></a></p>
<p>Notice the results include modules that match based on keywords and the module name.</p>
<h2>PMT List</h2>
<p>The list command lists the installed Puppet modules in our modulepath.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list.png" alt="" width="684" height="464" class="aligncenter size-full wp-image-13774" /></a></p>
<p>Notice the apache module has a version number of (???). This is because an apache module is installed but does not have a valid <a href="http://projects.puppetlabs.com/projects/module-site/wiki/Module_metadata" title="Module metadata" target="_blank">metadata file</a>. If you would like to see how the installed modules relate to each other, use the <code>--tree</code> flag: </p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list_tree.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list_tree.png" alt="" width="684" height="464" class="aligncenter size-full wp-image-13776" /></a></p>
<h3>Highlighting problems</h3>
<p>The list command will also report any issues with your module path:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list_tree_warnings.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/pmt_list_tree_warnings.png" alt="" width="684" height="464" class="aligncenter size-full wp-image-13777" /></a></p>
<p>The warning message is telling us that we are missing the puppetlabs-mysql module, which is required by the puppetlabs-bacula module. The PMT list command even lets us know which version of puppetlabs-mysql is required. A lot of work when into making the output communicate effectively. Notice the visual label used to highlight the &#8220;UNMET DEPENDENCY&#8221; in the tree output.</p>
<h2>Conclusion</h2>
<p>The new PMT is now bundled with Puppet and is ready to use out of the box. The new list and search commands allow you to search for modules on the Forge, and list currently installed modules. The list command also sports the ability to report issues with our installed modules. </p>
<p>Join us next week as we discover how to streamline the installation and maintenance of modules available on the Puppet Forge. We&#8217;ll wrap up our coverage of the PMT by taking look at the new upgrade and uninstall commands. We&#8217;ll also explore the enhancements made to the install command which greatly simplifies installing modules and their dependencies.</p>
<h3>Additional Resources</h3>
<ul>
<li><a href="http://projects.puppetlabs.com/projects/module-site/wiki/Module_metadata">Module Metadata File</a></li>
<li><a href="http://puppetlabs.com/category/blog/module-of-the-week-blog">Previous Modules of the Week</a></li>
<li><a href="http://forge.puppetlabs.com">Puppet Forge &#8211; Module Repository</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/module-of-the-week-puppet-module-tool-part-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Announcing Puppet Labs CTO Nigel Kersten</title>
		<link>http://puppetlabs.com/blog/announcing-puppet-labs-cto-nigel-kersten/</link>
		<comments>http://puppetlabs.com/blog/announcing-puppet-labs-cto-nigel-kersten/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 16:37:39 +0000</pubDate>
		<dc:creator>Nigel Kersten</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Puppet Lore]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[James Turnbull]]></category>
		<category><![CDATA[luke]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[Puppet Camp]]></category>
		<category><![CDATA[puppet labs]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13695</guid>
		<description><![CDATA[This week I took on the role of CTO at Puppet Labs, and started reflecting on the awesome journey that led me here. It was 2006, and I was scrambling to make it onto the last bus back to San Francisco from the Apple WWDC Beer Bash down in Cupertino. I&#8217;d been to quite a [...]]]></description>
			<content:encoded><![CDATA[<p>This week I took on the role of CTO at Puppet Labs, and started reflecting on the awesome journey that led me here.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/CTONigel.jpg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/CTONigel.jpg" alt="" title="CTONigel" width="640" height="426" class="aligncenter size-full wp-image-13696" /></a></p>
<p>It was 2006, and I was scrambling to make it onto the last bus back to San Francisco from the Apple WWDC Beer Bash down in Cupertino. I&#8217;d been to quite a few Beer Bashes and knew the drill: forget the lineup for the campus store, just concentrate on finding beer and the few Apple employees who could fix the OpenDirectory bugs that were making my life hell. Both objectives were completed, leaving me only minutes to avoid having to spend way too much money getting a taxi back up to the city.</p>
<p>Fatefully, I found a seat next to this <em>intensely</em> opinionated sysadmin, Jeff McCune (later to become one of the first pro services guys at Puppet Labs, and now one of our core developers). He recognized me from my WWDC presentation that year and started grilling me about how I ran my university campus, particularly the file-based configuration management system I used, Radmind, and the hacked up framework I&#8217;d put in place to try to manage higher level objects than mere files.</p>
<p>He&#8217;d been to a talk by Luke Kanies (now the CEO of Puppet Labs) at LISA and was very excited about this guy who had built a tool that worked the way sysadmins actually needed to work with a pragmatic, model-based approach. Even more importantly though, Luke was serious about fostering adoption, and had helped Jeff write some useful extensions for Puppet. Jeff had already gotten religion about idempotent, declarative approaches for sysadmins, and spent pretty much all of the bus ride bending my ear about this new project called &#8220;Puppet&#8221; and how it was going to change the world of operations.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/the_state_of_puppet_is_good.jpg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/the_state_of_puppet_is_good.jpg" alt="" title="the_state_of_puppet_is_good" width="640" height="427" class="aligncenter size-full wp-image-13697" /></a></p>
<p>After WWDC, I flew back to Australia, fully intending to try out this magical Puppet project, but got distracted by the day to day life of running campus IT operations on a shoestring budget for users who were academics <em>and</em> artists.</p>
<p>I was even more distracted a few months later when one of the MacEnterprise community members came out of lurking and told me I should apply for a role at Google in Mountain View. Several of the toughest interviews of my life followed, and within a couple of months, I was moving my young family to the other side of the world to run Mac Operations at Google HQ.</p>
<p>It was clear that tools like Radmind simply weren&#8217;t going to work at Google for the many thousands of corporate Macs. Opinionated engineers who demanded a high degree of customization, immense growth, globally distributed offices and a very small team meant that it was completely insane to even think about trying the old methods of file-based config management of the entire system.</p>
<p>We needed a better and more sustainable way, a solution that gave us higher levels of abstraction with meaningful entities such as users, groups, services and packages, and that didn&#8217;t require you manage the entire machine.</p>
<p>Jeff and I had kept in contact, and he was presenting on Puppet at WWDC that year. I popped up to San Francisco with some of my coworkers, and made sure we turned up to his talk.</p>
<p>10 minutes into his presentation we were getting pretty excited, and we started experimenting over VPN. By the time Jeff finished his talk, we had a working Puppet master back at Google managing the contents and permissions of a few critical files in /etc, and knew we had a great match.</p>
<p>As it turned out, the Mac deployment was such a rapid success that one of the Linux Ops team started a skunkworks project to manage the internal Linux distro with Puppet, as there had been a few failed CFEngine attempts. This worked so well that Puppet eventually managed all the Google corporate Mac and Linux desktops, laptops and servers.</p>
<p>Puppet was a much younger project in those days. We were building a lot of custom Puppet extensions for Mac OS X that went back into the core, and were having to scale Puppet to manage tens of thousands of nodes, so I spent a lot of time on the mailing lists and IRC channels brainstorming with Luke and the community. I quickly fell in love with the community. It was full of <em>thoughtful</em> sysadmins, people who were frustrated with the unreliable state of operations tools, and knew there was a better way out there than continually reinventing arcane bash/ssh frameworks.</p>
<p>We have some great technology with Puppet, but one of our greatest strengths is our outstanding community.</p>
<p>I ended up at the first ever Puppet Camp, San Francisco, 2009. It was small, but was one of the most exhilarating conferences I&#8217;ve ever been to. I love <a href="http://www.flickr.com/photos/43103276@N07/sets/72157622370691217/with/3972141905/">looking back at those photos</a> and seeing how many of that group are now part of the Puppet Labs team. Dan Bode, James Turnbull, Ben Hughes, Gary Larizza, Michael Stahnke, Carl Caum, Deepak Giridharagopal (Little known fact: his last name is actually Tamil for &#8220;Grid Computing&#8221;).</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/puppetcamp2009standing.jpeg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/puppetcamp2009standing.jpeg" alt="" title="puppetcamp2009" width="640" height="427" class="aligncenter size-full wp-image-13698" /></a></p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/puppetcamp2009sitting.jpg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/puppetcamp2009sitting.jpg" alt="" title="james_looks_the_same" width="640" height="427" class="aligncenter size-full wp-image-13699" /></a></p>
<p>That&#8217;s an awesome group of people to end up working with, let alone all the other great people we have here at Puppet Labs.</p>
<p>I had an amazing couple of years at Google, surrounded by super sharp minds and working on truly interesting operations problems at a scale greater than anything I&#8217;d ever touched before, but I was starting to look enviously at friends who left for early stage startups and the breadth of knowledge they were acquiring. Luke had poked me a couple of times about coming to work for him, but I didn&#8217;t seriously consider it until late 2010 when he, Teyo and James made a much more concerted effort.</p>
<blockquote><p>&#8220;You&#8217;re opinionated about Puppet. Want to put your money where your mouth is?&#8221;</p></blockquote>
<p>One visit to Portland and I knew I wanted to live in this awesome food, beer, and cycling-obsessed city full of people following obscure passions. I jumped ship from Google and we moved north, where I dived headfirst into being responsible for Product at a very quickly growing startup.</p>
<p>It&#8217;s been an immense 18 months. We started with our first commercial release, Puppet Enterprise 1.0, and followed that up with several great releases, all solving real problems for real users. We&#8217;ve brought on the open source MCollective and Hiera projects from the incomparable RI Pienaar, released Puppet 2.7.0, and grown at an amazing pace. We’ve grown from 2 events a year to 15, including the incredibly successful PuppetConf `11 and are building up to an even bigger PuppetConf this year. Nothing like startup speed to quicken the blood.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/puppetconf2011withhats.jpg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/puppetconf2011withhats.jpg" alt="" title="puppetconf2011withhats" width="640" height="426" class="aligncenter size-full wp-image-13700" /></a></p>
<p>From the original 20 odd folks I started with in the tiny office in the seedy and urine-drenched Old Town to our shiny digs in the Pearl, with over 80 employees. From a distinct lack of in-house beverages to decent espresso and delicious local beer. From a company that knew the user experience was critical, to one with a growing UX/Design department headed up by Randall of the impenetrable Gandalf gaze.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/04/RandallGandolfPuppetCampAmsterdam.jpg"><img src="http://puppetlabs.com/wp-content/uploads/2012/04/RandallGandolfPuppetCampAmsterdam.jpg" alt="" title="RandallGandolfPuppetCampAmsterdam" width="640" height="480" class="aligncenter size-full wp-image-13701" /></a></p>
<p>I love this company. I love what we’ve done already to change the face of operations, I love the ambition we have to change it even more, and I especially love the people I get to do it with.</p>
<p>I&#8217;m thrilled to take on the role of CTO, and to concentrate on fostering our culture of technical innovation so that we continue to build applications and platforms that truly advance the state of IT infrastructure. The world of operations is undergoing radical change right now. The cloud, pervasive virtualization, corporate adoption of FOSS, BYOD, IaaS, PaaS and SaaS are all forcing sysadmins to be truly agile and adaptive. Some of the brightest people in our industry work in operations, and it’s going to be incredible to see what they come up with when IT automation gives them space to concentrate on genuinely important matters.</p>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/announcing-puppet-labs-cto-nigel-kersten/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Module of the Week: jmcdonagh/clamav &#8211; Manage ClamAV and the freshclam service</title>
		<link>http://puppetlabs.com/blog/module-of-the-week-jmcdonagh-clamav/</link>
		<comments>http://puppetlabs.com/blog/module-of-the-week-jmcdonagh-clamav/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 18:05:10 +0000</pubDate>
		<dc:creator>Joe McDonagh</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[guest post]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Module of the Week]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[module of the week]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[puppet forge]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13648</guid>
		<description><![CDATA[Purpose Comprehensive clamav and freshclam classes Module jmcdonagh/clamav Puppet Version 2.6+ Platforms Ubuntu 10.04 LTS+ ClamAV is an open-source scanning engine for malware, virus, and trojan detection. It is often used in conjunction with an MTA such as Postfix. It comes with a built-in service for AV signature updates called freshclam. This module is intended [...]]]></description>
			<content:encoded><![CDATA[<table class="minimalist-table" width="664">
<tbody>
<tr>
<td><strong>Purpose</strong></td>
<td>Comprehensive clamav and freshclam classes</td>
</tr>
<tr>
<td><strong>Module</strong></td>
<td><a href="http://forge.puppetlabs.com/jmcdonagh/clamav">jmcdonagh/clamav</a></td>
</tr>
<tr>
<td><strong>Puppet Version</strong></td>
<td>2.6+</td>
</tr>
<tr>
<td><strong>Platforms</strong></td>
<td>Ubuntu 10.04 LTS+</td>
</tr>
</tbody>
</table>
<p>ClamAV is an open-source scanning engine for malware, virus, and trojan detection. It is often used in conjunction with an MTA such as Postfix. It comes with a built-in service for AV signature updates called freshclam.</p>
<p>This module is intended to offer a comprehensive interface for Puppet to configure both freshclam and clamav services. Each class takes many parameters, all of which are down-cased versions of clamav or freshclam configuration options. Both the clamav and clamav::freshclam classes are also intended to be easily removed from a system, by setting their $ensure parameters to ‘absent’.</p>
<h2>Installing the module</h2>
<table class="minimalist-table" width="664">
<tbody>
<tr>
<td><strong>Complexity</strong></td>
<td>Easy</td>
</tr>
<tr>
<td><strong>Installation Time</strong></td>
<td>5 minutes</td>
</tr>
</tbody>
</table>
<p>This module is on Puppet Forge and can be installed with puppet’s module sub-command:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">puppet module install jmcdonagh/clamav</pre></div></div>

<p>Note that if you run this as a regular user, the module will be installed in your home directory. If you are root, it will probably go into /etc/puppet/modules.</p>
<h2>Module and Resource Overview</h2>
<p>First, you should either check out the code from GitHub (<a href="https://github.com/thesilentpenguin/puppet-clamav">https://github.com/thesilentpenguin/puppet-clamav</a>), or install the module with the module tool as outlined above and browse the code with your favorite editor. I recommend having the manifest open while I walk you through the code.</p>
<p>Let’s have a look at the clamav base class in <a href="https://github.com/thesilentpenguin/puppet-clamav/blob/master/manifests/init.pp">manifests/init.pp</a>. Scroll down to the beginning of the class and you will immediately notice that there are many parameters. These parameters were taken from the clamav man pages on Ubuntu 10.04 LTS systems, and down-cased to maintain status quo code style.</p>
<p>After all the parameters, we’ve got some sanity checks. We’ll fail the catalog compilation (using the fail() function) if we get passed any bizarre values or we’re trying to compile a catalog for an incompatible system. One of my stock checks is a minimum OS version. This is a pretty good practice for numerous reasons. For one, it helps consumers know where your code is intended to be used. That is absolutely crucial if you will be supporting this code. Before someone breaks a Solaris system using a Debian-only manifest, the compilation simply fails and outputs a clear error.</p>
<p>After the sanity checks, various variables are set based on the value of $ensure. This will alleviate the need to use selectors inside resource definitions, which can lead to hard-to-read and thus hard-to-understand code. Here is the code that I am referring to which sets all of these variables based on $ensure:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">   if ($ensure == &quot;present&quot;) {
  	$file_notify    = Service[&quot;clamav-daemon&quot;]
  	$file_require   = Package[&quot;clamav-daemon&quot;]
  	$svc_before	= undef
  	$svc_enable	= &quot;true&quot;
  	$svc_ensure	= &quot;running&quot;
  	$svc_require    = Package[&quot;clamav-daemon&quot;]
   } else {
  	$file_notify    = undef
  	$file_require   = undef
  	$svc_before	= Package[&quot;clamav-daemon&quot;]
  	$svc_enable	= &quot;false&quot;
  	$svc_ensure	= &quot;stopped&quot;
  	$svc_require    = undef
   }</pre></div></div>

<p>You may have noticed that some of these variables appear to be relationship targets. This is because I always attempt to include the ability to remove all of a class’ resources properly. You’ll notice that, if removing the clamav class by setting $ensure to ‘absent’, the resource requirements go the opposite direction of the way they go with $ensure set to ‘present’. You might get away with using $ensure in this manner and not reversing relationships, but for me it’s not worth taking that chance, and I just do it right the first time.</p>
<p>Now onto the actual resources. The clamav and freshclam classes are what I call FPS classes. That is, File-Package-Service classes. What I mean by this is that there is a Package to install, configuration File(s) to set up, and a Service to manage. The Service and File(s) Require(s) the Package, and the File(s) Notify the Service. This paradigm is likely common to you if you have been using Puppet for some time now.</p>
<p>So first you’ll notice clam’s configuration file. This is a template that references all the class parameters to configure clamav. It uses some of the variables defined above to set up relationships and notify the service.</p>
<p>Next is the Package resources, which include a couple of extras. I include the dev packages because a lot of my work involves the rubygem ecosystem. This means that when I have a requirement for software on a system, I often need the -dev packages to compile extensions. Remember, now that you have parameterized classes at your disposal, it is trivial to add boolean features to your modules such as ‘$dev_packages = “true”’. That could serve as an option to include or not include the management of the -dev packages.</p>
<p>Finally we have the service. Not much here, mostly all configured via the variables defined based on $ensure. All our resources look nice and compact thanks to that variable setting stanza.</p>
<p>The clamav::freshclam class is also an FPS class. It is similar in the sense that it has every freshclam configuration option down-cased as a class parameter. The only noticeable difference between the two classes is the actual clamav and freshclam configuration options.</p>
<h2>Testing the module</h2>
<p>This module is most easily tested by using ‘include clamav’, which will by default set up clamav on the current system.</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">puppet apply -e ‘include clamav’ clamav/manifests/init.pp</pre></div></div>

<p>If you do this on an incompatible system, you should see something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">Your OS (Darwin) is not supported by this code! at /etc/puppet/modules/clamav/manifests/init.pp:104 on node goldmember.microcosm.thesilentpenguin.com</pre></div></div>

<p>After this successfully finishes on a compatible system, you should be able to see the clamav daemon running:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">[~] &gt; sudo service clamav-daemon status
 * clamd is running</pre></div></div>

<p>You can test the config by scanning a test file by using the clamdscan program:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">[~] &gt; clamdscan website.erb
/home/jmcdonagh/website.erb: OK
&nbsp;
----------- SCAN SUMMARY -----------
Infected files: 0
Time: 0.017 sec (0 m 0 s)</pre></div></div>

<p>The freshclam class can be tested in the same way.</p>
<h2>Configuring the module</h2>
<table class="minimalist-table" width="664">
<tbody>
<tr>
<td><strong>Complexity</strong></td>
<td>Easy</td>
</tr>
<tr>
<td><strong>Installation Time</strong></td>
<td>5 minutes</td>
</tr>
</tbody>
</table>
<p>The module configuration should be sane by default. Every parameter available in the Ubuntu 10.04 LTS repo version of clam should be available. The default values for the various parameters should match the defaults in Ubuntu 10.04 LTS. If you need to tweak any setting whatsoever, simply look up the configuration option in the clam man page, down-case all upper-case letters, and pass that as a parameter to the class. For example:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">class {
   “clamav”:
      ensure    =&gt; “present”,
      logsyslog =&gt; “true”;
}</pre></div></div>

<p>Would set up clamav with the LogSyslog clamav configuration option set to true.</p>
<h2>Example usage</h2>
<p>The same usage outlined above for testing is a typical use case of clamav. Simply enable those classes in the node definition and you will have a working clam setup, ready to check for malicious content coming in through e-mail. You could even potentially integrate clam with other services, like scanning user uploads to your custom webapp. Freshclam will update from the canonical repo every day with the default settings, ensuring you have the latest virus definitions.</p>
<h2>Conclusion</h2>
<p>To me, this module is an ideal example of module design. It is small in scope, yet as complete as possible of an interface to the clam configuration. This allows for you to easily set up clamav and freshclam on a node with nearly no tweaking or external dependencies necessary. If you end up needing some tweaking, as you have seen it is trivial to make small changes to clam with this module. It also has some basic compatibility checks to ensure your consumers know where this module will work.</p>
<p>This module would probably work on Debian 6, but I haven’t tested. To add Red Hat support some variables for the package and service name(s) would probably have to be added, and all of my gigs that use clam are on Ubuntu 10.04 LTS.</p>
<p><em>Additional Resources</em></p>
<ul>
<li><a href="http://www.clamav.org/">ClamAV HomePage</a></li>
<li><a href="http://forge.puppetlabs.com/jmcdonagh/clamav">Puppet Forge Module Page</a></li>
<li><a href="http://puppetlabs.com/category/blog/module-of-the-week-blog/">Previous Modules of the Week</a></li>
<li><a href="http://blog.thesilentpenguin.com/">Joe McDonagh’s Blog</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/module-of-the-week-jmcdonagh-clamav/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Join us for PuppetConf 2012</title>
		<link>http://puppetlabs.com/blog/join-us-for-puppetconf-2012/</link>
		<comments>http://puppetlabs.com/blog/join-us-for-puppetconf-2012/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:19:23 +0000</pubDate>
		<dc:creator>jose</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Conferences and Workshops]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Puppet Enterprise]]></category>
		<category><![CDATA[PuppetConf]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[puppet labs]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=13637</guid>
		<description><![CDATA[Registration for PuppetConf &#8217;12 is now open. We&#8217;re in a new city and a new facility, with new tracks and new programs. Look forward to 5 concurrent tracks over 2 days focusing on all things operations. Our new venue offers one large theater for keynotes, while our second auditorium will be dedicated to Puppet Community [...]]]></description>
			<content:encoded><![CDATA[<p>Registration for <a href="http://puppetconf.com/">PuppetConf</a> &#8217;12 is now open. We&#8217;re in a new city and a new facility, with new tracks and new programs. Look forward to 5 concurrent tracks over 2 days focusing on all things operations. Our new venue offers one large theater for keynotes, while our second auditorium will be dedicated to Puppet Community presentations and hacking space. We&#8217;re introducing a hands-on lab component to the conference, and we&#8217;re happy to announce that we&#8217;ll be offering the first ever Puppet Admin and Puppet Developer Certification exams at PuppetConf.</p>
<p>With over 70 speakers, 600+ community members, and the Puppet Labs team, PuppetConf is a must-attend event. We&#8217;re looking forward to seeing you in San Francisco!</p>
<p>Here&#8217;s a quick recap of last year:</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/DdOj0GZzci4" frameborder="0" allowfullscreen></iframe></p>
<p>All 2011 talks can be viewed on the <a href="http://www.youtube.com/user/PuppetLabsInc">Puppet Labs YouTube Channel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/join-us-for-puppetconf-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet Labs at AWS Cloud Summit, EucaDay NYC, and Puppet Camp NYC</title>
		<link>http://puppetlabs.com/blog/april-2012-new-york-events/</link>
		<comments>http://puppetlabs.com/blog/april-2012-new-york-events/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 18:46:41 +0000</pubDate>
		<dc:creator>jose</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Conferences and Workshops]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Puppet Camp]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[eucalyptus]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[James Turnbull]]></category>
		<category><![CDATA[luke]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/blog/april-2012-new-york-events/</guid>
		<description><![CDATA[Spring is the time to be in New York. We know it, and apparently so do our partners. Whether you live in or around New York or just happen to be in town visiting over the next two weeks come find us at these awesome events: Wed 4/18 &#8211; Come meet us at the AWS Cloud [...]]]></description>
			<content:encoded><![CDATA[<p>Spring is the time to be in New York. We know it, and apparently so do our partners. Whether you live in or around New York or just happen to be in town visiting over the next two weeks come find us at these awesome events:</p>
<ul>
<li>Wed 4/18 &#8211; Come meet us at the <a onclick="_gaq.push(['_trackEvent', 'outbound link', 'aws ny post', 'AWS cloud for startups &#038; devs']);" href="http://aws.amazon.com/about-aws/AWS-cloud-for-startups-developers-NYC/">AWS Cloud for Start-Ups &amp; Developers social</a> hosted by Amazon Web Services!</li>
<li>Thur 4/19 &#8211; Stop by booth &#8220;S2&#8243; at the <a onclick="_gaq.push(['_trackEvent', 'outbound link', 'aws ny post', 'AWS Cloud Summit']);" href="http://aws.amazon.com/aws-summit-2012/nyc/">AWS Cloud Summit</a> to talk to our Puppet experts, or get some free schwag.</li>
<li>Fri 4/20 &#8211; Meet Ohad Levy at the <a onclick="_gaq.push(['_trackEvent', 'outbound link', 'aws ny post', 'nyc puppet meetup']);" href="http://www.meetup.com/puppetnyc-meetings/events/59430962/">PuppetNYC meetup</a>.</li>
<li>Wed 4/25 &#8211; Check out our presentation at the inaugural <a onclick="_gaq.push(['_trackEvent', 'outbound link', 'aws ny post', 'eucaday conf']);" href="http://go.eucalyptus.com/EucaDay-NYC-2012-Registration.html?Offer=Other&amp;OfferDetails=EucaDay%20NYC%20Event&amp;LeadSourceDetails=EucaDay%20NYC%20Event&amp;OfferURL=http://go.eucalyptus.com/EucaDay-NYC-2012-Registration.html">EucaDay conference</a>.</li>
<p><b>And, last but not least:</b></p>
<li>Fri 4/27 &#8211; Join us for an awesome <a onclick="_gaq.push(['_trackEvent', 'outbound link', 'aws ny post', 'puppet camp nyc']);" href="http://puppetcampnyc.eventbrite.com/">Puppet Camp NYC</a> featuring Puppet Labs&#8217; own Luke Kanies, James Turnbull, Kelsey Hightower and Eric Shamow!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/april-2012-new-york-events/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

