<?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; General News</title>
	<atom:link href="http://puppetlabs.com/category/blog/general-news/feed/" rel="self" type="application/rss+xml" />
	<link>http://puppetlabs.com</link>
	<description>Puppet Labs: IT Automation Software for System Administrators</description>
	<lastBuildDate>Wed, 23 May 2012 21:49:01 +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>Module of the Week: puppetlabs/razor &#8211; Razor Provisioning Application</title>
		<link>http://puppetlabs.com/blog/puppet-razor-module/</link>
		<comments>http://puppetlabs.com/blog/puppet-razor-module/#comments</comments>
		<pubDate>Wed, 23 May 2012 16:01:23 +0000</pubDate>
		<dc:creator>Nan Liu</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Module of the Week]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Provisioning]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bare metal]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[EMC]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[module of the week]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[provisioning]]></category>
		<category><![CDATA[puppet labs]]></category>
		<category><![CDATA[Razor]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14441</guid>
		<description><![CDATA[Purpose Razor Provisioning Software Module puppetlabs/razor Puppet Version 2.7+ Platforms Ubuntu Precise Razor is next generation provisioning software that handles bare metal hardware and virtual server provisioning with inventory discovery and tagging, rule-based policy management, and extensible broker plugin integration. The usage of Razor for provisioning is discussed briefly in this blog, and additional information [...]]]></description>
			<content:encoded><![CDATA[<table class="minimalist-table" width="664">
<tbody>
<tr>
<td><strong>Purpose</strong></td>
<td>Razor Provisioning Software</td>
</tr>
<tr>
<td><strong>Module</strong></td>
<td><a href="http://forge.puppetlabs.com/puppetlabs/razor">puppetlabs/razor</a></td>
</tr>
<tr>
<td><strong>Puppet Version</strong></td>
<td>2.7+</td>
</tr>
<tr>
<td><strong>Platforms</strong></td>
<td>Ubuntu Precise</td>
</tr>
</tbody>
</table>
<p>Razor is next generation provisioning software that handles bare metal hardware and virtual server provisioning with inventory discovery and tagging, rule-based policy management, and extensible broker plugin integration. The usage of Razor for provisioning is discussed briefly in this blog, and additional information is available on a separate <a href="http://nickapedia.com/2012/05/21/lex-parsimoniae-cloud-provisioning-with-a-razor">post</a> by Nick Weaver, one of authors of the Razor project. Broker handoffs will be discussed in a follow up article.</p>
<p>Razor is currently released as a beta for preview, so there are no installation packages yet. The Razor module is intended to simplify the process for installing Razor, since it handles all application dependencies, and clones the Razor repo from GitHub.</p>
<p>The module is limited to Ubuntu Precise due to the availability of nodejs packages. In Debian, these packages are available in sid, so install this module only if you are comfortable adding the unstable repo. Razor puppet module support for other platforms will be evaluated as we continue to develop Razor (this is not the same as node provisioning platforms which includes Debian, Ubuntu, RedHat, OpenSuSE, and VMware ESX).</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>On puppet 2.7.14 an PE 2.5, puppet module tool will automatically download and install all dependencies from forge.</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ puppet module install puppetlabs-razor
Preparing to install into /etc/puppet/modules ...
Downloading from http://forge.puppetlabs.com ...
Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-razor <span class="br0">&#40;</span>v0.1.0<span class="br0">&#41;</span>
├─┬ puppetlabs-mongodb <span class="br0">&#40;</span>v0.0.1<span class="br0">&#41;</span>
│ └── puppetlabs-apt <span class="br0">&#40;</span>v0.0.3<span class="br0">&#41;</span>
├── puppetlabs-nodejs <span class="br0">&#40;</span>v0.2.0<span class="br0">&#41;</span>
├── puppetlabs-stdlib <span class="br0">&#40;</span>v2.3.2<span class="br0">&#41;</span>
├── puppetlabs-tftp <span class="br0">&#40;</span>v0.1.0<span class="br0">&#41;</span>
├── puppetlabs-vcsrepo <span class="br0">&#40;</span>v0.0.4<span class="br0">&#41;</span>
└── saz-sudo <span class="br0">&#40;</span>v2.0.0<span class="br0">&#41;</span></pre></div></div>

<p>Once all the modules have been installed, the appropriate permission should be applied to the files under the modules folder:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ chown -R puppet:puppet /etc/puppet/modules</pre></div></div>

<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 puppetlabs/razor module does not deploy DHCP service. The DHCP server needs to specify the initial boot file as pxelinux.0 and next-server option should direct traffic to the tftp server.If you currently don’t have DHCP service in your environment, and have control over your network environment, the <a>puppetlabs/dhcp</a> module will deploy dhcp services.</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">class <span class="br0">&#123;</span> 'dhcp':
  dnsdomain   =&gt; <span class="br0">&#91;</span>
                   'puppetlabs.lan,
                   '1.0.10.in-addr.arpa',
                 <span class="br0">&#93;</span>,
  nameservers =&gt; <span class="br0">&#91;</span>'10.0.1.20'<span class="br0">&#93;</span>,
  ntpservers  =&gt; <span class="br0">&#91;</span>'us.pool.ntp.org'<span class="br0">&#93;</span>,
  interfaces  =&gt; <span class="br0">&#91;</span>'eth0'<span class="br0">&#93;</span>,
  pxeserver   =&gt; '10.0.1.50',
  pxefilename =&gt; 'pxelinux.0',
<span class="br0">&#125;</span></pre></div></div>

<p>If you want to test Razor on your local system in a virtual environment such as VMware Fusion 4, simply add the following lines into /Library/Preferences/VMware Fusion/vmnet8/dhcpd.conf the appropriate DHCP subnet and substitute $tftp_server_address with the Razor VM node ipaddress:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">filename &quot;pxelinux.0&quot;;
next-server $<span class="br0">&#123;</span>tftp_server_ipaddress<span class="br0">&#125;</span>;</pre></div></div>

<p>At the moment, the tftp service and razor service will be deployed to the same system. On the puppet master assign the razor class to the appropriate node, and trigger a puppet agent run afterwards:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">node razor_host <span class="br0">&#123;</span>
  class <span class="br0">&#123;</span> 'razor':
    username  =&gt; 'razor',
    directory =&gt; '/opt/razor',
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Razor can also be deployed directly to the system with the modules installed via:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">puppet apply /etc/puppet/modules/razor/tests/init.pp --verbose</pre></div></div>

<p>At this point, login to the Razor installation directory and execute Razor to confirm the application is installed successfully:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor
ProjectRazor - v0.1.6.0
&nbsp;
	Usage:
	project_razor <span class="br0">&#91;</span>slice name<span class="br0">&#93;</span> <span class="br0">&#91;</span>command argument<span class="br0">&#93;</span> <span class="br0">&#91;</span>command argument<span class="br0">&#93;</span>...
	 Switches:
		 --debug        : Enables printing proper Ruby stacktrace
		 --verbose      : Enables verbose object printing
		 --no-color-out : Disables console color. Useful for script wrapping.
&nbsp;
Loaded slices:
	<span class="br0">&#91;</span>bmc<span class="br0">&#93;</span> <span class="br0">&#91;</span>broker<span class="br0">&#93;</span> <span class="br0">&#91;</span>image<span class="br0">&#93;</span> <span class="br0">&#91;</span>log<span class="br0">&#93;</span> <span class="br0">&#91;</span>model<span class="br0">&#93;</span> <span class="br0">&#91;</span>node<span class="br0">&#93;</span>
	<span class="br0">&#91;</span>policy<span class="br0">&#93;</span> <span class="br0">&#91;</span>tag<span class="br0">&#93;</span></pre></div></div>

<h2>Example usage</h2>
<p>The example below will show the minimal steps from the end of Razor installation to provisioning an Ubuntu Precise system. We will focus on the process of getting a new system provisioned with Ubuntu.</p>
<p>Razor needs a micro kernel (MK) image upon initial pxeboot to detect hardware information and register systems to the inventory of nodes. The MK image is available on GitHub, and it should be loaded into razor image service first:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ wget https://github.com/downloads/puppetlabs/Razor/rz_mk_dev-image.0.8.8.0.iso
$ razor image add mk ./rz_mk_dev-image.0.8.8.0.iso
Attempting to add, please wait...
New image added successfully
Images:
	UUID: 1nnkuB5BiH1C93HOO0PTFi
	Type: MicroKernel Image
	ISO Filename: rz_mk_dev-image.0.8.8.0.iso
	Path: /mnt/nfs/Razor/image/mk/1nnkuB5BiH1C93HOO0PTFi
	Status: Valid
	Version: 0.8.9.0
	Build Time: <span style="">2012</span>-05-09 <span style="">13</span>:<span style="">11</span>:01 -0700</pre></div></div>

<p>Once the razor MK images is loaded into Razor, new system connected to the network performing network boot will obtain a dhcp address, boot the microkernel and register with Razor. We can get a list of systems discovered via this process via the Razor node:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor node
Discovered Nodes
         UUID           Last Checkin                  Tags
5PfILygjPv4WTayOnTOYMk  <span style="">32</span> seconds     <span class="br0">&#91;</span>cpus_1,memsize_4GiB,nics_1,vmware_vm<span class="br0">&#93;</span>
26k3If4FI7HpsZIn7N7BXu  <span style="">45</span> seconds     <span class="br0">&#91;</span>cpus_2,memsize_16GiB,nics_2,vmware_vm<span class="br0">&#93;</span>
66XZwZUJOpRXosg5SHHdbW  <span style="">7</span> seconds      <span class="br0">&#91;</span>cpus_4,memsize_96GiB,nics_4,physical<span class="br0">&#93;</span></pre></div></div>

<p>Attributes regarding specific nodes can be drilled down into further details by specifying its UUID:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor node attrib 5PfILygjPv4WTayOnTOYMk
Node Attributes:
          	Name                        Value
	architecture              i386
	domain                    localdomain
	fqdn                      mk000C294F881F.localdomain
	hardwareisa               unknown
	hardwaremodel             i686
	hostname                  mk000C294F881F
...</pre></div></div>

<p>To provision a node, an Ubuntu Precise ISO should also be loaded along with a model which associates an instance of model template configuration with a specific ISO image:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor image add os ../ubuntu-<span style="">12.04</span>-server-amd64.iso ubuntu_precise <span style="">12.04</span>
Attempting to add, please wait...
New image added successfully
Images:
	UUID: 274HnNlQF5jvbo0y6U0aok
	Type: OS Install
	ISO Filename: ubuntu-<span style="">12.04</span>-server-amd64.iso
	Path: /mnt/nfs/Razor/image/os/274HnNlQF5jvbo0y6U0aok
	Status: Valid
	OS Name: ubuntu_precise
	OS Version: <span style="">12.04</span></pre></div></div>

<p>Once the MK and operating system images are loaded into razor, we can create a deployment model using that image. First, list the available model templates:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor model get template
Model Templates:
Template Name         Description         
centos_6        CentOS <span style="">6</span> Model            
debian_wheezy   Debian Wheezy Model       
opensuse_12     OpenSuSE Suse <span style="">12</span> Model    
ubuntu_oneiric  Ubuntu Oneiric Model      
ubuntu_precise  Ubuntu Precise Model      
vmware_esxi_5   VMware ESXi <span style="">5</span> Deployment</pre></div></div>

<p>Next, select the ubuntu_precise template along with the iso_uuid generated when the ISO was loaded into Razor. This will trigger a series of configuration questions applicable for the Precise model template:</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor model add template=ubuntu_precise label=install_precise image_uuid=274HnNlQF5jvbo0y6U0aok
--- Building Model <span class="br0">&#40;</span>ubuntu_precise<span class="br0">&#41;</span>:
Please enter node hostname prefix <span class="br0">&#40;</span>will append node number<span class="br0">&#41;</span> <span class="br0">&#40;</span>example: node<span class="br0">&#41;</span>
default: node
<span class="br0">&#40;</span>QUIT to cancel<span class="br0">&#41;</span>
&gt; ubuntu
Please enter root password <span class="br0">&#40;</span>&gt; <span style="">8</span> characters<span class="br0">&#41;</span> <span class="br0">&#40;</span>example: P@ssword!<span class="br0">&#41;</span>
default: test1234
<span class="br0">&#40;</span>QUIT to cancel<span class="br0">&#41;</span>
&gt; testEnvPass!
Model created
Label =&gt;  install_precise
Template =&gt;  linux_deploy
Description =&gt;  Ubuntu Precise Model
UUID =&gt;  3LCN86Cpx0Te3Of5WbORkQ
Image UUID =&gt;  274HnNlQF5jvbo0y6U0aok</pre></div></div>

<p>The newly created model contains the hostname (which will be appended with node number), root password, and the ISO for deployment. We can certainly perform more customization within the preseed file, but in most cases this process is deferred to Puppet via broker plugin which will configure the target puppet master to handoff the node for management. At this point we can deploy this operating system, and based on our initial hardware inventory we will target nodes with 4GB of memory that are VMware virtual systems.</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor policy add template=linux_deploy label=precise model_uuid=3LCN86Cpx0Te3Of5WbORkQ broker_uuid=none tags=memsize_4GiB,vmware_vm enabled=true
Policy created
UUID =&gt;  41o1z77j2R4ZsgjD9KTpPe
Line Number =&gt;  <span style="">2</span>
Label =&gt;  precise
Enabled =&gt;  true
Template =&gt;  linux_deploy
Description =&gt;  Policy for deploying a Linux-based operating system.
Tags =&gt;  <span class="br0">&#91;</span>vmware_vm<span class="br0">&#93;</span>
Model Label =&gt;  install_precise
Broker Target =&gt;  none
Bound Count =&gt;  <span style="">0</span></pre></div></div>

<p>At this point we review our policy rules and based on razor node output we expect one system that matches the tag requirements to deploy Precise.</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">$ razor policy
Policies
#  Enabled     Label         Tags              Label          Count           UUID
<span style="">0</span>  true     precise  <span class="br0">&#91;</span>memsize_4GiB,vmware_vm<span class="br0">&#93;</span>  install_precise  <span style="">0</span>      41o1z77j2R4ZsgjD9KTpPe</pre></div></div>

<p>In the future, other systems that match this policy rule will also deploy Precise. Once the appropriate nodes install Precise, we can either remove this policy completely via ‘policy remove &lt;uuid&gt;’ or temporarily disable it via ‘policy disable &lt;uuid&gt;’.</p>
<h2>Conclusion</h2>
<p>The Razor puppet module provides a quick and easy way to install Razor for testing. The module could benefit from additional puppet class parameters for razor::nodejs and razor::tftp that separates those components especially when tftp can be installed on a separate system. There are also manual processes in Razor such as loading ISO’s that could benefit from a Puppet type/provider. We certainly welcome recommendations for additional Razor service deployment platform, and contributions from our community for enhancements to this module and its dependencies.</p>
<p><em>Learn More:</em></p>
<ul>
<li><a href="http://puppetlabs.com/blog/introducing-razor-a-next-generation-provisioning-solution/">Introducing Razor, a Next-Generation Provisioning Solution</a></li>
<li><a href="http://nickapedia.com/2012/05/21/lex-parsimoniae-cloud-provisioning-with-a-razor">Lex Parsimoniae : Cloud Provisioning with a Razor</a></li>
<li><a href="http://forge.puppetlabs.com/puppetlabs/razor">puppetlabs/razor</a></li>
<li><a href="http://puppetlabs.com/resources/webinars/">Join the Razor webinar</a></li>
<li>Participate in the <a href="http://puppetlabs.com/blog/open-source-twitter-chat-on-may-28th-puppetize/">Razor Twitter chat</a> at #puppetize – 2012-05-28 18:00 UTC</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/puppet-razor-module/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The Design Behind Puppet Sites</title>
		<link>http://puppetlabs.com/blog/the-design-behind-puppet-sites/</link>
		<comments>http://puppetlabs.com/blog/the-design-behind-puppet-sites/#comments</comments>
		<pubDate>Tue, 22 May 2012 20:29:45 +0000</pubDate>
		<dc:creator>Daniel Sauble</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Opinion and Interview]]></category>
		<category><![CDATA[Puppet Lore]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[puppet sites]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14420</guid>
		<description><![CDATA[Design is an integral part of the way we build software at Puppet Labs. More specifically, we strive to answer a very simple question: what does the user need? This isn’t always an easy question to answer, but we’ve been happy with our success in doing so. User empathy is our conduit for user satisfaction. [...]]]></description>
			<content:encoded><![CDATA[<p>Design is an integral part of the way we build software at Puppet Labs. More specifically, we strive to answer a very simple question: what does the user need? This isn’t always an easy question to answer, but we’ve been happy with our success in doing so. User empathy is our conduit for user satisfaction.</p>
<p>In real-life terms, what does design at Puppet look like? Let me show you a project that just finished its initial design phase: Puppet Sites.</p>
<h2>What do users need?</h2>
<p>Puppet admins want to spend their time managing nodes that are under Puppet control. They <em>don’t</em> want to spend their time adding nodes to their deployments. On the contrary, their goal is to start managing new nodes as quickly as possible. We formalize this need in the following way:</p>
<p>As a Puppet admin <b>I want</b> to easily add new nodes to my deployment <b>so that</b> I can start managing them as quickly as possible.</p>
<h2>How do we we satisfy user needs?</h2>
<p>The current workflow for adding nodes to a deployment is as follows:</p>
<ol>
<li>Configure puppet.conf with the location of the master/CA</li>
<li>Perform an agent run on the node</li>
<li>Login to the CA</li>
<li>Sign the node’s certificate</li>
<li>Perform another agent run on the node</li>
</ol>
<p>The problem with the existing workflow is that it appears to have nothing to do with adding new nodes to a deployment and everything to do with signing certificates. There’s a disconnect between the workflow and the user need.</p>
<p>To fix this, we did three things:</p>
<ol>
<li>We introduced the concept of a site. A site is a service that owns the list of nodes in your deployment, the authentication mechanism for adding new nodes to your deployment, and the configuration of Puppet services in your deployment.</li>
<li>We changed the semantics of the workflow, so that it directly addresses the user need.</li>
<li>We eliminated the overhead of signing into the CA and manually signing node certificates. There are secure ways to do this that don’t involve user interaction over SSH.</li>
</ol>
<p>The workflow now resembles the following:</p>
<ol>
<li>Login to the site host</li>
<li>Generate a pre-shared key</li>
<li>Join a node to the site using the pre-shared key</li>
<li>Repeat step 3 for every node you want to add to the site</li>
</ol>
<p>We now have a workflow to fulfill the user’s goal. But notice that we’re still not talking about sites in technical terms. This workflow could apply equally well to a <a href="http://puppetlabs.com/blog/puppet-faces-what-the-heck-are-faces/">Puppet Face</a>, a REST API, or a Dashboard plugin.</p>
<h2>How do users interact with our workflows?</h2>
<p>It’s all well and good to produce a general workflow for addressing a user need, but eventually you have to tie it to a real user interface. For the initial release of Puppet Sites, we decided to focus on two user interfaces: a Puppet Face and a REST API.</p>
<p>A designer is nothing without regular interaction with customers. While designing user interaction, we stayed engaged with our internal operations and professional services teams. After several rounds of feedback, the design of the Puppet Face for the workflow given above resembles the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">node02$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> admin<span style="color: #000000; font-weight: bold;">@</span>site02.domain.com
Last <span style="color: #c20cb9; font-weight: bold;">login</span>: Mon May  <span style="color: #000000;">7</span> <span style="color: #000000;">18</span>:<span style="color: #000000;">15</span>:<span style="color: #000000;">43</span> <span style="color: #000000;">2012</span>
site02$ <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>usbdisk
site02$ puppet site generate key <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>usbdisk<span style="color: #000000; font-weight: bold;">/</span>site.key
site02$ <span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>usbdisk
site02$ <span style="color: #7a0874; font-weight: bold;">exit</span>
node02$ <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>usbdisk
node02$ puppet node <span style="color: #c20cb9; font-weight: bold;">join</span> site02.domain.com <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>usbdisk<span style="color: #000000; font-weight: bold;">/</span>site.key
Trying to add node02.domain.com to the site at site02.domain.com...
 Use <span style="color: #000000; font-weight: bold;">`</span>puppet site status node02.domain.com<span style="color: #000000; font-weight: bold;">`</span> to confirm success
 To stop waiting <span style="color: #000000; font-weight: bold;">for</span> the <span style="color: #7a0874; font-weight: bold;">command</span> to <span style="color: #7a0874; font-weight: bold;">complete</span>, press Ctrl-C.
   The <span style="color: #7a0874; font-weight: bold;">command</span> will still <span style="color: #7a0874; font-weight: bold;">complete</span> <span style="color: #000000; font-weight: bold;">in</span> the background.
Added node02.domain.com to the site at site02.domain.com</pre></div></div>

<h2>What do users think?</h2>
<p>We strive to make our design process as agile as our engineering process. We specifically avoid a waterfall model, where the design is completed in an ivory tower, then handed over the wall for implementation. Instead, our designers sanity check their design with internal and external users, talk to architects and engineers to make sure they aren’t violating the laws of physics, and stay involved in the project until it ships, making course corrections as necessary.</p>
<p>The Puppet Sites project is still underway, but we’ve already discovered mistakes made early in the process, and corrected them. Each group of users has been vital to this iterative process.</p>
<p>Our internal users made us aware that omitting a pre-shared key system was a poor idea. By themselves, the two other fixes—changing semantics and introducing sites—weren’t sufficient to solve the user goal of “quickly” adding nodes to their deployments.</p>
<p>Our architects made us aware of a “law of physics” deal-breaker in the design, where users could have passed their pre-shared key as a flag to <tt style="font: 12px Courier New">puppet node join</tt>. This would have exposed the key to sniffer processes on the host machine, and represented an unacceptable security risk.</p>
<p>Our external users helped us realize that the concept of a “site” is foggy at best and they didn’t really understand the problem it was designed to solve. Also, they were concerned that we were deprecating existing functionality without providing a drop-in replacement. We’ve been working to ameliorate these concerns by formulating clearer stories around the problems that sites solve.</p>
<h2>Design at Puppet Labs</h2>
<p>Of course, Puppet Sites does far more than just provide admins with an easy way to add new nodes to their deployments. For the sake of brevity, I’ve only highlighted this one user story. However, having a site also helps Puppet admins who want to&#8230;</p>
<ul>
<li>&#8230;get a list of all the nodes in their deployment with a single command, so they don’t have to trawl multiple services to get this information.</li>
<li>&#8230;centrally manage the configuration of all nodes in their deployments, so they don’t have to manually manage puppet.conf on each node.</li>
<li>&#8230;access information about Puppet services from their manifests, so they don’t have to hardcode the location of their services into their manifests.</li>
</ul>
<p>You can expect Puppet Sites to be available soon, as a point release for Puppet 3.0.</p>
<p>In summary, the UX team at Puppet produces three main artifacts: user stories, workflows, and wireframes.</p>
<ul>
<li>User stories allow us to talk about the needs of our users in a non-technical, goal-oriented way.</li>
<li>Workflows describe the tasks users go through to achieve their goals.</li>
<li>Wireframes are mockups of the actual systems that users use to complete these tasks.</li>
</ul>
<p>Not all of our projects follow this process exactly, but, in general, the above holds true. User story to workflow to wireframe. Rinse and repeat as necessary. That’s how we do design at Puppet Labs.</p>
<p><em>Learn More</em></p>
<ul>
<li><a href="http://puppetlabs.com/blog/what-is-user-experience-in-puppet/">What is User Experience in Puppet?</a></li>
<li><a href="http://puppetlabs.com/blog/looking-forward-to-2012-design-big-data-in-the-infrastructure-and-devops/">Looking Forward to 2012: Design, Big Data in the Infrastructure, and DevOps</a></li>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/the-design-behind-puppet-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Twitter Chat on May 28th: #Puppetize</title>
		<link>http://puppetlabs.com/blog/open-source-twitter-chat-on-may-28th-puppetize/</link>
		<comments>http://puppetlabs.com/blog/open-source-twitter-chat-on-may-28th-puppetize/#comments</comments>
		<pubDate>Mon, 21 May 2012 22:21:56 +0000</pubDate>
		<dc:creator>michelle</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[MCollective]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[mcollective]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[PuppetDB]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14352</guid>
		<description><![CDATA[We’ve had a lot of open source goodness this month, and we want to talk about it and get your feedback. We’re hosting an hour-long Twitter chat on May 28 at 11 am PDT to answer your questions and converse about new releases like PuppetDB, MCollective 2.0, Puppet 3.0 (currently in RC), and more. We’ll [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve had a lot of open source goodness this month, and we want to talk about it and get your feedback. We’re hosting an hour-long Twitter chat on May 28 at 11 am PDT to answer your questions and converse about new releases like PuppetDB, MCollective 2.0, Puppet 3.0 (currently in RC), and more.</p>
<p>We’ll have Michael Stahnke, our community manager; Deepak Giridharagopal, major developer of PuppetDB; R.I. Pienaar, author of MCollective; and Nan Liu, integration specialist, ready to respond and converse on Twitter.</p>
<p>Just tag your tweets and questions with #puppetize to join the conversation, and we’ll tag our responses. If you want to follow what’s going on, just track #puppetize for the full stream. To get an idea of what this is like, check out a snippet of the last Twitter chat we had:</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/puppetizetwitterchat1.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/puppetizetwitterchat1.png" alt="" title="puppetizetwitterchat1" width="563" height="856" class="aligncenter size-full wp-image-14353" /></a></p>
<p>We look forward to talking with you on 2012-05-28 18:00 UTC!</p>
<p><em>Learn More:</em></p>
<ul>
<li><a href="http://puppetlabs.com/blog/introducing-puppetdb-put-your-data-to-work/">Introducing PuppetDB</li>
<li><a href="http://puppetlabs.com/blog/announcing-the-marionette-collective-2-0/">Announcing the Marionette Collective 2.0</li>
<li><a href="https://twitter.com/#!/puppetlabs">Puppet Labs on Twitter</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/open-source-twitter-chat-on-may-28th-puppetize/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introducing PuppetDB: Put Your Data to Work</title>
		<link>http://puppetlabs.com/blog/introducing-puppetdb-put-your-data-to-work/</link>
		<comments>http://puppetlabs.com/blog/introducing-puppetdb-put-your-data-to-work/#comments</comments>
		<pubDate>Fri, 18 May 2012 15:06:12 +0000</pubDate>
		<dc:creator>Nick Lewis</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Extending Puppet]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[product release]]></category>
		<category><![CDATA[Systems Management]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[puppet labs]]></category>
		<category><![CDATA[PuppetDB]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://puppetlabs.com/?p=14255</guid>
		<description><![CDATA[PuppetDB is the next-generation open source storage service for Puppet-produced data. Today, this includes catalogs and facts, and will be extended in the near future. The initial release provides a drop-in replacement for both storeconfigs and inventory service. We’ve designed PuppetDB to empower Puppet deployments, and built it from the ground up with performance in [...]]]></description>
			<content:encoded><![CDATA[<p>PuppetDB is the next-generation open source storage service for Puppet-produced data. Today, this includes catalogs and facts, and will be extended in the near future. The initial release provides a drop-in replacement for both storeconfigs and inventory service.</p>
<p>We’ve designed PuppetDB to empower Puppet deployments, and built it from the ground up with performance in mind. It’s built on technologies known for their performance, and is highly parallel, making full use of available resources. It also stores all of its data asynchronously, freeing up the master to go compile more catalogs. Beyond that, we’ve devoted copious time to benchmarking and optimizing the performance.</p>
<h2>Why PuppetDB?</h2>
<p>The most immediate benefit of PuppetDB is improved performance for storeconfigs users, but even for others, it has a lot to offer. As a centralized store, PuppetDB knows about every node, resource, relationship, and fact across your entire infrastructure. All this information is easily queryable, so you can integrate it into your tools and workflow, or just satisfy your curiosity. It also provides a platform on which powerful new tooling will be built.</p>
<p>And if you’re not using storeconfigs, you should be. At its heart, storeconfigs can be thought of as “higher-order Puppet.” It’s a way for multiple nodes to interact with each other through Puppet, which is an immensely powerful feature. In any case where one node knows what another node is doing, storeconfigs may help.</p>
<p>For instance, storeconfigs can be used to configure a monitoring service, without knowing upfront any of the nodes or services being monitored. Each node to be monitored can simply define what ought to be checked, and those checks can be collected on the node doing the monitoring. Or it can be used to share SSH authorized keys, by having each node export its key, and collect everyone else’s.</p>
<h2>Built for performance</h2>
<p>Let’s talk about performance. I told you it was a key design goal, but just how much faster is PuppetDB than the existing solution? To find out, I ran an experiment against the old, ActiveRecord storeconfigs implementation.</p>
<p>I compiled and saved a catalog of 650 resources, using an initially empty PostgreSQL database. Compilation took 5.6 seconds. With nothing in the database, it took 53 seconds to store the catalog. That’s brushing right up on the agent’s timeout, risking an outright failure. With the database now primed, I submitted the same catalog a second time, unmodified, which took 4 seconds.</p>
<p>To find out how PuppetDB performs, we have much more information available to us. The service is highly instrumented to keep metrics on every aspect of its performance, all of which is made available over HTTP and JMX.</p>
<p><a href="http://puppetlabs.com/wp-content/uploads/2012/05/puppetdb_screenshot.png"><img src="http://puppetlabs.com/wp-content/uploads/2012/05/puppetdb_screenshot.png" alt="PuppetDB dashboard" title="puppetdb_screenshot" width="640" height="737" class="aligncenter size-full wp-image-14256" /></a></p>
<p>This is the PuppetDB dashboard, which uses the HTTP metrics API to give an overview of the current state of the system. The dashboard comes built-in, and updates live, even on your mobile device! Taking a look at this screenshot (taken from our internal PuppetDB instance), we can see the backlog of work, how long command processing is taking, how much work has been done, how large the database is, and much more. And yet this is still only a small subset of the metrics we track and make available.</p>
<p>In particular, we see that the queue is empty, meaning PuppetDB is keeping up with demand. Looking at the number of nodes and resources in the population, we can easily calculate that the average size of a catalog is ~670 resources. The average time to process a command is 394ms. This is around 130x faster than the worst case time of old-school storeconfigs, and 10x better than the case where catalogs are already present. We also see that PuppetDB is responding to storeconfigs queries in only 65ms.</p>
<p>Admittedly, these numbers are somewhat incomparable; for instance, the very first catalog stored in PuppetDB may take some extra time, but catalogs which are unchanged will be negligible. But this gives some indication of the improvement we’re talking about. It’s also important to note that all of this storage is asynchronous, freeing up the master to continue serving catalogs. Previously, the master would have been occupied waiting for storeconfigs.</p>
<h2>Reliable data store</h2>
<p>So we can see that PuppetDB stores your data more quickly, but what about the data itself? After all, that’s what you really care about. PuppetDB makes a few promises about its data: it will be complete, it will be accurate, and it will be current.</p>
<p>Every aspect of the catalog is stored, including edges and unexported resources, which are omitted in old storeconfigs and the popular thin_storeconfigs mode respectively. Nuances of the catalog like resource aliases are also respected, ensuring that every resource and edge is present and accurately represented.</p>
<p>It’s downright difficult to lose your data with PuppetDB. It takes great care not to let that happen, by accepting it into a persistent queue, and trying up to sixteen times (even across service restarts) to handle the command, ensuring that if the data is good, it will make it into the database. And if it somehow still doesn’t make it in, the command will be saved away with plenty of forensic data for later investigation and reprocessing.</p>
<p>In that vein, when configured to use PuppetDB, Puppet will refuse to serve catalogs if PuppetDB is down and the catalog can’t be persisted. This means the data PuppetDB has will always be current; an agent will never use a catalog that PuppetDB doesn’t know about.</p>
<p>And it’s secure. All communication between the puppet master and PuppetDB happens over SSL, authenticated with the same certificates as used for communication between puppet master and agents. Similarly, if PuppetDB and its database are separate, it’s a simple matter to secure their connection.</p>
<h2>Plays well with others</h2>
<p>PuppetDB is a key component of the <a href="http://docs.puppetlabs.com/guides/puppet_data_library.html">Puppet Data Library</a>, and brings that to bear in its <a href="http://docs.puppetlabs.com/puppetdb/0.9/spec_q_resource.html">query API</a>. Resources, facts, nodes, and metrics can all be queried over HTTP. For resources and nodes, there is a simple query language which can be used to form arbitrarily complex requests. The public API is the same one that Puppet uses to make storeconfigs queries (using the <<||>> operator) of PuppetDB, but provides a superset of the functionality provided by storeconfigs. The API is fully documented and versioned, for use in scripts, Faces, or custom Puppet functions.</p>
<p>PuppetDB is faster, smarter, and has more complete data than ever before. If you’re a current storeconfigs user, there’s no reason not to try it out immediately. If you don’t use storeconfigs (and especially if performance was the reason), now is the time to start.  We know that storeconfigs, while being a powerful and important feature, has historically been a pain point for users. One of the goals of PuppetDB is to alleviate that and personally, I want a world in which everyone uses storeconfigs and loves it. PuppetDB offers great power over and insight into your infrastructure, and it’s only going to get bigger and better.</p>
<p><em>Learn More</em></p>
<ul>
<li>Download the open beta of PuppetDB from our <a href="http://apt.puppetlabs.com/">APT repository</a>, <a href="http://yum.puppetlabs.com/">YUM repository</a>, or <a href="https://github.com/puppetlabs/puppetdb">GitHub</a>.</li>
<li>Read the <a href="http://docs.puppetlabs.com/puppetdb/0.9/">PuppetDB documentation</a>.</li>
<li>Open tickets on the <a href="http://projects.puppetlabs.com/projects/puppetdb">PuppetDB project</a>.</li>
<li>Come see Deepak Giridharagopal talk in-depth about the development and design decisions, and ask all your usage questions this Saturday at <a href="http://puppetcampla.eventbrite.com/">Puppet Camp Los Angeles</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://puppetlabs.com/blog/introducing-puppetdb-put-your-data-to-work/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<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>8</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>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>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>

