<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Coffee & Beer]]></title>
  <link href="http://mattynick.com/atom.xml" rel="self"/>
  <link href="http://mattynick.com/"/>
  <updated>2012-04-04T09:16:02-04:00</updated>
  <id>http://mattynick.com/</id>
  <author>
    <name><![CDATA[Matt]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Rsync vs Tar]]></title>
    <link href="http://mattynick.com/blog/2012/04/03/rsync-vs-tar/"/>
    <updated>2012-04-03T19:10:00-04:00</updated>
    <id>http://mattynick.com/blog/2012/04/03/rsync-vs-tar</id>
    <content type="html"><![CDATA[<p>So, I&#8217;ll spare the gory details (you can read about some of them at the bosses blog, <a href="http://blog.jcuff.net/2012/04/xfs-minus-fun-and-profit.html">here</a> and <a href="http://blog.jcuff.net/2012/04/turn-xfsrepair-up-to-eleven-with.html">here</a>), but we at work had the need to shift a pretty sum of data (80TB or so) as fast as possible to recover from a hardware failure that impacted one particular group. Oh, and the 80TB is millions upon millions of tiny files.</p>

<p>Now, we were using <a href="http://rsnapshot.org/">rsnapshot</a>, so there was no &#8220;restore&#8221; to be done to the files, we could access them straight away, and even exported them read-only while we came up with a plan so users at least had access.</p>

<p>Once the plan was formed, and destination storage quickly provisioned (hello smaller ext4 LVM volumes instead of monolithic xfs), came the task of copying the data over, and fast.</p>

<p>Rsync is always a friend and a bit of a good standby for moving data around, especially for the situations when you want to preserve everything about the files and have the ability top stop and restart transfers. Obviously we were not going to do this over ssh (ouch), so the target storage areas were mounted on the source systems, and rsyncs started running locally, a la:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rsync -av --progress /mnt/backups/section01/ /mnt/destination01/section01</span></code></pre></td></tr></table></div></figure>


<p>Simple enough.</p>

<p>We had 3, 16 Core, 48GB source systems, and 5 8 core 24GB destination systems, so we spun up a few rsyncs per source system and let them roll overnight.</p>

<p>This morning, not nearly as much data had moved as we had hoped.</p>

<p>Why? Because rsync needs to do fstats on each file, on both ends as it rolls along. Big files flew over the wire, but, most of what we were moving were tiny, tiny files, and as I said, millions and millions of them.</p>

<p>So, we did:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>cd /mnt/backups/
</span><span class='line'>tar -cf - section01 | tar -xf - -C /mnt/destination01/ </span></code></pre></td></tr></table></div></figure>


<p>Background that, and crank up a few others on the other sections, and things started going MUCH faster. We wanted a little faster, so:</p>

<p>Source:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mount -o remount,noatime /mnt/backups</span></code></pre></td></tr></table></div></figure>


<p>Destination:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>mount -o remount,noatime /mnt/destination01</span></code></pre></td></tr></table></div></figure>


<p>Boom. Far, far fewer fstats. Access times not being dealt with (we don&#8217;t care at this point), so fewer fstats again.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving Puppet From Subversion to GIT in 15 Minutes While Adding Dynamic Environments]]></title>
    <link href="http://mattynick.com/blog/2012/02/08/moving-puppet-from-subversion-to-git-in-15-minutes-while-adding-dynamic-environments/"/>
    <updated>2012-02-08T09:13:00-05:00</updated>
    <id>http://mattynick.com/blog/2012/02/08/moving-puppet-from-subversion-to-git-in-15-minutes-while-adding-dynamic-environments</id>
    <content type="html"><![CDATA[<p>For (almost) as long as we&#8217;ve had a pupet installation at work, we&#8217;ve had it in Subversion to track changes. This has changed/evolved a few times, but has always remained in subversion in one way or another. Recently we starting tracking other bits (documentation, scripts, etc) in git, and the idea of being on 2 different revision systems didn&#8217;t really sit well with me. Most of the team has taken up git very well, so the choice was made to move our puppet manifests etc to git. Once i started loking into it, also found the very cool &#8220;Dynamic Environments w/ git branches&#8221; trick, talked about <a href="http://puppetlabs.com/blog/git-workflow-and-puppet-environments/">here</a> and <a href="http://hunnur.com/blog/2010/10/dynamic-git-branch-puppet-environments/">here</a>, and thought the move to git would be the perfect time to move to this.</p>

<p>I&#8217;m going to skip the testing/waiting I had to do (making sure our git server and puppet amster could talk ssh to each other, setting up the ssh keys for git to use to push and puppet to pull, etc), and jump right into the implementation and transition, which took about 15 minutes total yesterday.</p>

<p>So, first, To get the lions share of the data shifting done, I used <a href="https://github.com/nirvdrum/svn2git">svn2git</a> to get the svnrepo sync&#8217;d to a git repo. our svn repo, while it used to have a few branches, prior to this had been compacted to  just a trunk (which wasn&#8217;t called &#8220;trunk&#8221;) and no tags etc. So, I ran:</p>

<pre><code>$&gt; svn2git --username matt --nobranches --notags --rootistrunk -v https://puppet.server/svn/puppet/
</code></pre>

<p>And let that chug along for a while.</p>

<p>Once that was done I could add the remote git server as an origin:</p>

<pre><code>$&gt; git remote add origin git@git.server:puppet.git
$&gt; git push
</code></pre>

<p>Now, the puppet svn repo is in git and on the git server. I had to sync a few times due to some quick changes going into the svn repo, so that was a simple</p>

<pre><code>$&gt; svn2git --rebase
$&gt; git push
</code></pre>

<p>Okay, finally it was go time. Step 1, make the svn repo readonly. How? Thisis served with apache, so, a simple pre-commit hook did the job:</p>

<pre><code>#!/bin/sh
echo "This svn repo is now read-only! No Commits accepted!"
exit 1
</code></pre>

<p>See what I did there? The pre-commit never DOES anything with the commit, so the commit is never acepted by the svnserver!</p>

<p>Okay, on to the transition. On our puppet master, everything lived in <code>/etc/puppet</code> which was an svn repo. Lets stop the puppet master for a moment (clients will go about their merry way) move that aside, and setup the new location:</p>

<pre><code>$&gt;service  httpd stop (we run puppet via passenger)
$&gt;cd /etc
$&gt;mv puppet puppet.svn.backup
$&gt;mkdir -p puppet/environments
$&gt;chown -R puppet:apache puppet
$&gt;chmod -R g+w puppet
</code></pre>

<p>Okay. Now, lets get into the weeds for a second here. So, using the dynamic environments, our git server will, with a post-receive hook I&#8217;ll show in a second, ssh to our puppet master, and checkout the branch (master or otherwise) to <code>/etc/puppet/environments/$BRANCH</code>. Now, we tend to use &#8220;master&#8221; for most of our small edits (adding a node, etc), so &#8220;master&#8221; => &#8220;production&#8221;. I didn&#8217;t want a puppet environment called &#8220;master&#8221;, so a tiny bit extra logic was added to the post-receive to change the location of the branch checkout to &#8220;production&#8221; if the master branch was change, but otherwise use the branchname, such as &#8220;matts_new_feature&#8221;. Okay here is the post-receive:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/sh</span>
</span><span class='line'><span class="nb">read </span>oldrev newrev refname
</span><span class='line'>
</span><span class='line'><span class="nv">REPO</span><span class="o">=</span><span class="s2">&quot;git@git.server/puppet.git&quot;</span>
</span><span class='line'><span class="nv">BRANCH</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="nv">$refname</span> | sed -n <span class="s1">&#39;s/^refs\/heads\///p&#39;</span><span class="sb">`</span>
</span><span class='line'><span class="nv">BRANCH_DIR</span><span class="o">=</span><span class="s2">&quot;/etc/puppet/environments&quot;</span>
</span><span class='line'><span class="nv">SSH_ARGS</span><span class="o">=</span><span class="s2">&quot;-i /var/lib/puppet/.ssh/id_puppet_rsa&quot;</span>
</span><span class='line'><span class="nv">SSH_DEST</span><span class="o">=</span><span class="s2">&quot;puppet@puppet.server&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c">#If working on the master branch, its really production and should go in environments/production</span>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;$BRANCH&quot;</span> <span class="o">==</span> <span class="s2">&quot;master&quot;</span> <span class="o">]</span> ; <span class="k">then</span>
</span><span class='line'><span class="k">        </span><span class="nv">BRANCH_REAL</span><span class="o">=</span><span class="s2">&quot;production&quot;</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>        <span class="c">#Otherwise its a non-master/production branch and the env can be created w/ the branch name</span>
</span><span class='line'>        <span class="nv">BRANCH_REAL</span><span class="o">=</span><span class="s2">&quot;$BRANCH&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;$newrev&quot;</span> -eq 0 <span class="o">]</span> 2&gt; /dev/null ; <span class="k">then</span>
</span><span class='line'>  <span class="c"># branch is being deleted</span>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;Deleting remote branch $BRANCH_DIR/$BRANCH_REAL&quot;</span>
</span><span class='line'>  ssh <span class="nv">$SSH_ARGS</span> <span class="nv">$SSH_DEST</span> /bin/sh <span class="s">&lt;&lt;-EOF</span>
</span><span class='line'><span class="s">  cd $BRANCH_DIR &amp;&amp; rm -rf $BRANCH_REAL</span>
</span><span class='line'><span class="s">EOF</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="c"># branch is being updated</span>
</span><span class='line'>  <span class="nb">echo</span> <span class="s2">&quot;Updating remote branch $BRANCH_DIR/$BRANCH_REAL&quot;</span>
</span><span class='line'>  ssh  <span class="nv">$SSH_ARGS</span> <span class="nv">$SSH_DEST</span> /bin/sh <span class="s">&lt;&lt;-EOF</span>
</span><span class='line'><span class="s">  { cd $BRANCH_DIR/$BRANCH_REAL &amp;&amp; git pull origin $BRANCH ; } \</span>
</span><span class='line'><span class="s">  || { mkdir -p $BRANCH_DIR &amp;&amp; cd $BRANCH_DIR \</span>
</span><span class='line'><span class="s">  &amp;&amp; git clone $REPO $BRANCH_REAL &amp;&amp; cd $BRANCH_REAL \</span>
</span><span class='line'><span class="s">  &amp;&amp; git checkout -b $BRANCH origin/$BRANCH ; </span>
</span><span class='line'><span class="s">  EOF</span>
</span><span class='line'><span class="k">fi</span> 
</span></code></pre></td></tr></table></div></figure>


<p>This, paired with a nice pre-receive server side syntax check, and we&#8217;re looking pretty good and automatic (I&#8217;ll share that in another post)
Okay, so thats in place. Now, svn2git works great, btu i want to use a clean, clean git-only checkout of the new puppet repo to finish this off with, so, on my local system:</p>

<pre><code>$&gt; mv puppet puppet.svn-git
$&gt; git clone git@git.server:puppet.git puppet.git
$&gt; cd puppet.git
$&gt; vi puppet.conf
</code></pre>

<p>Now, in puppet.conf, I setup the dynamic environments:</p>

<pre><code>environment = production
manifest = $confdir/environments/$environment/manifests/site.pp
modulepath = $confdir/environments/$environment/modules
</code></pre>

<p>Now lets commit/push:</p>

<pre><code>$&gt; gits
# On branch master
# Changes not staged for commit:
#   (use "git add &lt;file&gt;..." to update what will be committed)
#   (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)
#
#   modified:   puppet.conf
#
no changes added to commit (use "git add" and/or "git commit -a")

$&gt; git commit -a
[master d846620] change to puppet.conf for the environments change
1 files changed, 7 insertions(+), 7 deletions(-)

$&gt; git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 383 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating remote branch /etc/puppet/environments/production
remote: Cloning into production...
To git@git.server:puppet.git
73f5405..d846620  master -&gt; master
</code></pre>

<p>Ta Da! Now, lets look on the puppet master:</p>

<pre><code>$&gt;pwd
/etc/puppet/
$&gt;ls environments
production
</code></pre>

<p>So, its there, lets start puppet back up:</p>

<pre><code>$&gt;service httpd start
</code></pre>

<p>Get on a client of two, run <code>puppet agent -t</code>, all is well, and its  great success! This litterally (of course, with testing, setting up keys, etc out o the way) took about 15 minutes yesterday. Nothing like pulling the rug out from under 1800+ systems/14000 cores and putting it back without them noticing!</p>

<p>Now, the really cool part is:</p>

<pre><code>$&gt;git checkout -b matts_test
$&gt;vim somefiles.pp
$&gt;git commit -a 
$&gt;git push
</code></pre>

<p>Will make a new branch/environment in <code>/etc/puppet/environments/matts_test</code>, which clients can use like <code>puppet agent -t --environment=matts_test</code>! Want it to go away after changes have merged? Simple!</p>

<pre><code>$&gt; git checkout master
$&gt; git merge matts_test
$&gt; git push origin :matts_test
$&gt; git branch -d matts_test
$&gt; git push
</code></pre>

<p>Ta da! The branch/environment is no longer valid, and as been removed form <code>/etc/puppet/environments/</code>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mirroring Ubuntu on CentOS]]></title>
    <link href="http://mattynick.com/blog/2012/01/26/mirroring-ubuntu-on-centos/"/>
    <updated>2012-01-26T14:15:00-05:00</updated>
    <id>http://mattynick.com/blog/2012/01/26/mirroring-ubuntu-on-centos</id>
    <content type="html"><![CDATA[<p>Been building a new mirror (internal) host @ work, and its been an adventure. This isn&#8217;t a public mirror, and we&#8217;re not interested in mirroring all releases of Distro X, but rather only a handful or one. We basically want to mirror:</p>

<ul>
<li>CentOS 5 &amp; 6</li>
<li>EPEL 5 &amp; 6</li>
<li>PuppetLabs Repos for el5 &amp; 6</li>
<li>Ubuntu LTS Release(s)</li>
</ul>


<p>Now, the mirror box is a Centos6 host, so this is pretty simple when it comes to the CentOS mirrors, thats comeing in another post. We do some funky things like want a fully sync&#8217;d mirror, but also want point-in-time snapshots so we have a static source to build compute nodes from (while storeage/webserver get the up-to-date repos).</p>

<p>In anycaase, building a Ubuntu mirror, other than just rsync&#8217;ing archive.ubuntu.com/ubuntu, on a non-Ubuntu/Debian host is non-trival it seems, just like using something other than rsync to mirror yum repos on something w/o yum installed would be awkward. However, I&#8217;ve found a solution:</p>

<pre><code>debmirror
</code></pre>

<p>DebMirros is really just a Perl script, and I&#8217;m wrapped it up in script for our setup. Took a little bit to get going, though:</p>

<pre><code>yum install perl-libwww perl-Compress-Zlib perl-Digest-SHA1 perl-Net* rsync perl-LockFile-Simple perl-Digest-MD5-M4p
wget http://archive.ubuntu.com/ubuntu/pool/universe/d/debmirror/debmirror_2.10ubuntu1.tar.gz
tar -xzvf debmirror_2.10ubuntu1.tar.gz
...
cd debmirror-2.10ubuntu1
make
cp debmirror /usr/local/bin/
cp debmirror.1 /usr/share/man/man1/
cpan install Net::INET6Glue (couldn't find this in yum). 
</code></pre>

<p>Okay, debmirror now works, but needs that wrapper script:</p>

<figure class='code'><figcaption><span> (ubuntu_mirror.sh)</span> <a href='http://mattynick.com/downloads/code/ubuntu_mirror.sh'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="nv">arch</span><span class="o">=</span>amd64
</span><span class='line'><span class="nv">section</span><span class="o">=</span>main,restricted,universe,multiverse
</span><span class='line'><span class="nv">release</span><span class="o">=</span>lucid
</span><span class='line'><span class="nv">server</span><span class="o">=</span>us.archive.ubuntu.com
</span><span class='line'><span class="nv">inPath</span><span class="o">=</span>/ubuntu
</span><span class='line'><span class="nv">proto</span><span class="o">=</span>http
</span><span class='line'><span class="nv">proxy</span><span class="o">=</span>http://proxy.local:8888
</span><span class='line'><span class="nv">outpath</span><span class="o">=</span>/var/www/repos/ubuntu
</span><span class='line'>
</span><span class='line'>debmirror       -a <span class="nv">$arch</span> <span class="se">\</span>
</span><span class='line'>                --no-source <span class="se">\</span>
</span><span class='line'>                -s <span class="nv">$section</span> <span class="se">\</span>
</span><span class='line'>                -h <span class="nv">$server</span> <span class="se">\</span>
</span><span class='line'>                -d <span class="nv">$release</span> <span class="se">\</span>
</span><span class='line'>                -r <span class="nv">$inPath</span> <span class="se">\</span>
</span><span class='line'>                --progress <span class="se">\</span>
</span><span class='line'>                --ignore-release-gpg <span class="se">\</span>
</span><span class='line'>                --no-check-gpg <span class="se">\</span>
</span><span class='line'>                --proxy<span class="o">=</span><span class="nv">$proxy</span> <span class="se">\</span>
</span><span class='line'>                -e <span class="nv">$proto</span> <span class="se">\</span>
</span><span class='line'>                <span class="nv">$outPath</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make that executable, run it, and we&#8217;re off! First sync is running now. Next up is to see how quickly a resync happens, and schedule it to run daily. Hello internal Ubuntu Mirror!</p>

<p>The really nice thing is when the next LTS comes out (Precise Pangolin), I can simple add it to the list of release like</p>

<pre><code>release=lucid,precise
</code></pre>

<p>And we&#8217;ll start mirroring that!</p>

<p>Next up, convuluted ways of builing many many Centos Mirrors on one box for various reasons</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Kvm Domain Info Into Puppet Facts]]></title>
    <link href="http://mattynick.com/blog/2012/01/05/getting-kvm-domain-info-into-puppet-facts/"/>
    <updated>2012-01-05T13:04:00-05:00</updated>
    <id>http://mattynick.com/blog/2012/01/05/getting-kvm-domain-info-into-puppet-facts</id>
    <content type="html"><![CDATA[<p>While I&#8217;m yet to find the holy grail of getting a KVM host to be aware of which &#8216;dom0&#8217; its being hosted on, this bit of ruby for a custom puppet facts is a step there, the other way around:</p>

<figure class='code'><figcaption><span> (vms-running.rb)</span> <a href='http://mattynick.com/downloads/code/vms-running.rb'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;facter&#39;</span>
</span><span class='line'><span class="k">begin</span>
</span><span class='line'>        <span class="no">Facter</span><span class="o">.</span><span class="n">compute_node</span>
</span><span class='line'><span class="k">rescue</span>
</span><span class='line'>        <span class="no">Facter</span><span class="o">.</span><span class="n">loadfacts</span><span class="p">()</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">unless</span>  <span class="sb">`rpm -qa | grep ruby-libvirt`</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="no">Facter</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="s2">&quot;puppet_class_kvm_host&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;true&quot;</span><span class="p">)</span> <span class="k">then</span>
</span><span class='line'>                <span class="no">Facter</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;kvm_vms&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>                        <span class="n">setcode</span> <span class="k">do</span>
</span><span class='line'>                                <span class="nb">require</span> <span class="s1">&#39;libvirt&#39;</span>
</span><span class='line'>                                <span class="n">conn</span> <span class="o">=</span> <span class="no">Libvirt</span><span class="o">::</span><span class="nb">open</span><span class="p">(</span><span class="s1">&#39;qemu:///system&#39;</span><span class="p">)</span>
</span><span class='line'>                                <span class="k">if</span> <span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">num_of_domains</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span> <span class="k">then</span>
</span><span class='line'>                                        <span class="n">kvm_vms</span> <span class="o">=</span> <span class="s2">&quot;NO VMS&quot;</span>
</span><span class='line'>                                        <span class="n">conn</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>                                        <span class="n">kvm_vms</span>
</span><span class='line'>                                <span class="k">else</span>
</span><span class='line'>                                        <span class="n">vm_doms</span> <span class="o">=</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>                                        <span class="n">conn</span><span class="o">.</span><span class="n">list_domains</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">domid</span><span class="o">|</span>
</span><span class='line'>                                                <span class="n">dom</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">lookup_domain_by_id</span><span class="p">(</span><span class="n">domid</span><span class="p">)</span>
</span><span class='line'>                                                <span class="n">vm_doms</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">dom</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'>                                        <span class="k">end</span>
</span><span class='line'>                                        <span class="n">vm_doms</span><span class="o">=</span><span class="n">vm_doms</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
</span><span class='line'>                                        <span class="n">conn</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>                                        <span class="n">vm_doms</span>
</span><span class='line'>                                <span class="k">end</span>
</span><span class='line'>                        <span class="k">end</span>
</span><span class='line'>                <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which will return a nice fact like:</p>

<pre><code>kvm_vms =&gt; Host1 Host2 Host 3
</code></pre>

<p>or if none are running:</p>

<pre><code>kvm_vms =&gt; NO VMS
</code></pre>

<p>its ugly, but it works!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Finding Compute Resources With Puppet Facts]]></title>
    <link href="http://mattynick.com/blog/2011/11/01/finding-compute-resources-with-pupper-facts/"/>
    <updated>2011-11-01T12:20:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/11/01/finding-compute-resources-with-pupper-facts</id>
    <content type="html"><![CDATA[<p>One question we get asked at wrk a good bit centers around finding compute resources that match a specific set of specifications.Since the compute system we haev are of all sort of various ages and hardware types, jobs that need 8GB of memory might not work everywhere, but most places.Same goes for a specific number of cores (or, minimal #), per node. Some have 4, some have 12+.</p>

<p>Well, facter, and therefore puppet, knows about these things. And there is a REST api we can query. And I needed an excuse to do a little ruby:</p>

<figure class='code'><figcaption><span> (find_compute.rb)</span> <a href='http://mattynick.com/downloads/code/find_compute.rb'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;puppet&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Welcome to the Compute Finder script!&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;This script aims to help you locate compute nodes based on simple requirements&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Such as the minimum amount of RAM or # of processor cores&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;---&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;---&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;What minimum amount of ram would you like?&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;(in GB, leave blank for no minimum)&quot;</span>
</span><span class='line'><span class="n">mem</span><span class="o">=</span><span class="nb">gets</span><span class="o">.</span><span class="n">chomp</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;What minimum number of processor cores would you like?&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;(leave blank for no minimum)&quot;</span>
</span><span class='line'><span class="n">procs</span><span class="o">=</span><span class="nb">gets</span><span class="o">.</span><span class="n">chomp</span>
</span><span class='line'>
</span><span class='line'><span class="nb">sleep</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'><span class="n">search</span> <span class="o">=</span><span class="s2">&quot;facts.compute_node=true&quot;</span>
</span><span class='line'><span class="k">if</span> <span class="n">mem</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span>
</span><span class='line'>  <span class="n">search</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;&amp;facts.memorysize.ge=</span><span class="si">#{</span><span class="n">mem</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">procs</span> <span class="o">!=</span><span class="s2">&quot;&quot;</span>
</span><span class='line'>  <span class="n">search</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;&amp;facts.processorcount.ge=</span><span class="si">#{</span><span class="n">procs</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">procs</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">mem</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="p">)</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;You must specify some requirments!&quot;</span>
</span><span class='line'>  <span class="nb">exit</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">puppet_base</span> <span class="o">=</span> <span class="s2">&quot;https://puppet:8140&quot;</span>
</span><span class='line'><span class="n">path</span><span class="o">=</span><span class="s2">&quot;/production/facts_search/search?&quot;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Finding matching nodes, please wait...&quot;</span>
</span><span class='line'><span class="n">cmd</span> <span class="o">=</span> <span class="s2">&quot;curl -s -k -H </span><span class="se">\&quot;</span><span class="s2">Accept: yaml</span><span class="se">\&quot;</span><span class="s2"> </span><span class="se">\&quot;</span><span class="si">#{</span><span class="n">puppet_base</span><span class="si">}#{</span><span class="n">path</span><span class="si">}#{</span><span class="n">search</span><span class="si">}</span><span class="se">\&quot;</span><span class="s2">&quot;</span>
</span><span class='line'><span class="n">ans</span> <span class="o">=</span> <span class="sx">%x[</span><span class="si">#{</span><span class="n">cmd</span><span class="si">}</span><span class="sx">]</span>
</span><span class='line'><span class="n">nodes</span> <span class="o">=</span> <span class="no">YAML</span><span class="o">::</span><span class="nb">load</span><span class="p">(</span><span class="n">ans</span><span class="p">)</span>
</span><span class='line'><span class="n">nodearr</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'><span class="n">nodes</span><span class="o">.</span><span class="n">sort</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">node</span><span class="o">|</span>
</span><span class='line'>  <span class="n">nodearr</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">nodearr</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Would you like more info on the nodes found? This may take bit longer...&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;(y/n)&quot;</span>
</span><span class='line'><span class="n">more</span><span class="o">=</span><span class="nb">gets</span><span class="o">.</span><span class="n">chomp</span>
</span><span class='line'><span class="k">if</span> <span class="n">more</span> <span class="o">==</span> <span class="s2">&quot;y&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">node_array</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="n">nodes</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">node</span><span class="o">|</span>
</span><span class='line'>      <span class="n">node_url</span><span class="o">=</span><span class="s2">&quot;https://puppet:8140/production/facts/</span><span class="si">#{</span><span class="n">node</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>      <span class="n">node_cmd</span><span class="o">=</span><span class="s2">&quot;curl -s -k -H </span><span class="se">\&quot;</span><span class="s2">Accept: yaml</span><span class="se">\&quot;</span><span class="s2"> </span><span class="si">#{</span><span class="n">node_url</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>      <span class="n">node_ans</span><span class="o">=</span> <span class="sx">%x[</span><span class="si">#{</span><span class="n">node_cmd</span><span class="si">}</span><span class="sx">]</span>
</span><span class='line'>      <span class="n">node_array</span> <span class="o">&lt;&lt;</span> <span class="no">YAML</span><span class="o">::</span><span class="nb">load</span><span class="p">(</span><span class="n">node_ans</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">results</span> <span class="o">=[]</span>
</span><span class='line'>  <span class="n">node_array</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">node</span><span class="o">|</span>
</span><span class='line'>      <span class="nb">name</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'>      <span class="n">facts</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">values</span>
</span><span class='line'>      <span class="n">ram</span><span class="o">=</span><span class="n">facts</span><span class="o">[</span><span class="s1">&#39;memorysize&#39;</span><span class="o">]</span>
</span><span class='line'>      <span class="n">procs</span><span class="o">=</span><span class="n">facts</span><span class="o">[</span><span class="s1">&#39;processorcount&#39;</span><span class="o">]</span>
</span><span class='line'>      <span class="n">results</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="s2">&quot;Host: </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2"> RAM: </span><span class="si">#{</span><span class="n">ram</span><span class="si">}</span><span class="s2"> ProcessorCores: </span><span class="si">#{</span><span class="n">procs</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">results</span><span class="o">.</span><span class="n">sort!</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">results</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The output of which looks like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Welcome to the Compute Finder script!
</span><span class='line'>This script aims to help you locate compute nodes based on simple requirements
</span><span class='line'>Such as the minimum amount of RAM or # of processor cores
</span><span class='line'>---
</span><span class='line'>---
</span><span class='line'>What minimum amount of ram would you like?
</span><span class='line'>(in GB, leave blank for no minimum)
</span><span class='line'>64
</span><span class='line'>What minimum number of processor cores would you like?
</span><span class='line'>(leave blank for no minimum)
</span><span class='line'>12
</span><span class='line'>Finding matching nodes, please wait...
</span><span class='line'>node01.local
</span><span class='line'>node02.local
</span><span class='line'>node03.local
</span><span class='line'>node04.local
</span><span class='line'>Would you like more info on the nodes found? This may take bit longer...
</span><span class='line'>(y/n)
</span><span class='line'>y
</span><span class='line'>Host: node01.local RAM: 94.28 GB ProcessorCores: 12
</span><span class='line'>Host: node02.local RAM: 94.28 GB ProcessorCores: 12
</span><span class='line'>Host: node03.local RAM: 86.39 GB ProcessorCores: 12
</span><span class='line'>Host: node04.local RAM: 251.89 GB ProcessorCores: 32</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Puppet Facts About Puppet Classes]]></title>
    <link href="http://mattynick.com/blog/2011/10/24/puppet-facts-about-puppet-classes/"/>
    <updated>2011-10-24T09:53:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/10/24/puppet-facts-about-puppet-classes</id>
    <content type="html"><![CDATA[<p>So, obviously,we use puppet a great deal. One thing a few of us have wanted for a while was the ability to ssee that nodes/node groups would be affected by a change to a particular class. In other words, what hosts get $This class?</p>

<p>Now, nodes are aware what classes they get, but the puppet master seemingly is not, not really. It compiles teh catalog on a per-run basis, and while durring that it DOES know what classes a system gets, it doesn&#8217;t really store that info. So, a simple custom fact to pull that data in from each host:</p>

<figure class='code'><figcaption><span> (puppet_classes.rb)</span> <a href='http://mattynick.com/downloads/code/puppet_classes.rb'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#list puppet classes, on per fact</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;facter&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">IO</span><span class="o">.</span><span class="n">popen</span><span class="p">(</span><span class="s1">&#39;cat /var/lib/puppet/classes.txt | tail -n+3&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">readlines</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">line</span><span class="o">|</span>
</span><span class='line'>        <span class="no">Facter</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;puppet_class_</span><span class="si">#{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>                <span class="n">setcode</span> <span class="k">do</span>
</span><span class='line'>                        <span class="s2">&quot;true&quot;</span>
</span><span class='line'>                <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, now we get, for each host, a bunch of facts like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>puppet_class_syslog =&gt; true </span></code></pre></td></tr></table></div></figure>


<p>Reported from facter -p, and therefor sent back to teh puppet master, into a DB, which we can query directly, via teh puppet api, or via Foreman.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby for Scripting]]></title>
    <link href="http://mattynick.com/blog/2011/10/20/ruby-for-scripting/"/>
    <updated>2011-10-20T10:57:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/10/20/ruby-for-scripting</id>
    <content type="html"><![CDATA[<p>So, this isn&#8217;t &#8220;new&#8221;, I wrote it a few weeks back, but, well, meh, figured I&#8217;d share. First &#8220;useful&#8221; ruby-instead-of-bash script for a little automation/keeping things consistent.</p>

<p>@ work we have the need to move a whole mess of storage (just under 100TB) from one thing to another, and to preserve quotas as we do so. Most of the quotas are simple 1TB tree/project quotas. Some are bigger, but by default we want to start @ 1TB and then we can bump the ones needed. Anyways, I need to do this for about 8 groups of 5-20 &#8220;projects/trees&#8221;, so by hand isn&#8217;t really an option. Hence the script:</p>

<figure class='code'><figcaption><span> (mkscratch.rb)</span> <a href='http://mattynick.com/downloads/code/mkscratch.rb'>download</a></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#Usage: mkscartch &lt;project/group name&gt; </span>
</span><span class='line'><span class="c1">#Makes the needed project/projid entires turns on the project quota, and sets a 1TB default hard/soft limit. </span>
</span><span class='line'><span class="k">if</span> <span class="no">ARGV</span><span class="o">.</span><span class="n">length</span> <span class="o">!=</span> <span class="mi">2</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;usage: mkscartch &lt;project/group name&gt; &lt;full path to directory&gt;&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;This script takes a lab/group name, and a path as arguments&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;It will make a directory for the lab/group at the path, and turn it into a default 1TB project quota&quot;</span>
</span><span class='line'>  <span class="nb">exit</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">new_scratch</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">;</span>
</span><span class='line'><span class="n">new_path</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span><span class="p">;</span>
</span><span class='line'><span class="n">project_nums</span><span class="o">=</span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="c1">#first, we need to figure out what project ID to start with</span>
</span><span class='line'><span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;/etc/projects&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">reverse_each</span> <span class="p">{</span> <span class="o">|</span><span class="n">projects</span><span class="o">|</span>
</span><span class='line'>        <span class="n">project_nums</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">projects</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="n">last_project</span> <span class="o">=</span> <span class="n">project_nums</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">to_i</span><span class="p">;</span>
</span><span class='line'><span class="n">new_project</span> <span class="o">=</span> <span class="n">last_project</span><span class="o">+</span><span class="mi">1</span>
</span><span class='line'><span class="n">project_line</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">new_project</span><span class="si">}</span><span class="s2">:</span><span class="si">#{</span><span class="n">new_path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="n">projid_line</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">new_scratch</span><span class="si">}</span><span class="s2">:</span><span class="si">#{</span><span class="n">new_project</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="n">mkdir_cmd</span><span class="o">=</span><span class="s2">&quot;mkdir </span><span class="si">#{</span><span class="n">new_path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="n">quota_set</span><span class="o">=</span><span class="s2">&quot;xfs_quota -x -c &#39;project -s </span><span class="si">#{</span><span class="n">new_scratch</span><span class="si">}</span><span class="s2">&#39;&quot;</span>
</span><span class='line'><span class="n">quota_limit</span><span class="o">=</span><span class="s2">&quot;xfs_quota -x -c &#39;limit -p bhard=1024g bsoft=1024g </span><span class="si">#{</span><span class="n">new_scratch</span><span class="si">}</span><span class="s2">&#39;&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Adding </span><span class="si">#{</span><span class="n">project_line</span><span class="si">}</span><span class="s2"> to /etc/projects...&quot;</span>
</span><span class='line'><span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;/etc/projects&quot;</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
</span><span class='line'>        <span class="n">f</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">project_line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="nb">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Adding </span><span class="si">#{</span><span class="n">projid_line</span><span class="si">}</span><span class="s2"> to /etc/projid...&quot;</span>
</span><span class='line'><span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;/etc/projid&quot;</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">f2</span><span class="o">|</span>
</span><span class='line'>        <span class="n">f2</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">projid_line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Making </span><span class="si">#{</span><span class="n">new_path</span><span class="si">}</span><span class="s2"> with </span><span class="si">#{</span><span class="n">mkdir_cmd</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="no">Dir</span><span class="o">::</span><span class="n">mkdir</span><span class="p">(</span><span class="n">new_path</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Setting quota with </span><span class="si">#{</span><span class="n">quota_set</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">quota_set</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Setting quota limits @ 1TB with </span><span class="si">#{</span><span class="n">quota_limit</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">quota_limit</span><span class="si">}</span><span class="s2">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, I can, from the place I want to sync <em>from</em>, do something like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ for i in *; do /usr/bin/mkscratch.rb $i /new/location/$i; done</span></code></pre></td></tr></table></div></figure>


<p>And be done with it. Really basic, I know. But, first thing I would have normally shell scripted done in ruby instead. And you know what? I liked it, Its nice. So there.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Follow Up to Lazy: Reboot]]></title>
    <link href="http://mattynick.com/blog/2011/10/09/follow-up-to-lazy-reboot/"/>
    <updated>2011-10-09T10:54:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/10/09/follow-up-to-lazy-reboot</id>
    <content type="html"><![CDATA[<p>Weekend time and time to do a bit of house clenaing. For a bit the macbook pro has beend draining a bit too fast and getting a bit too hot. I&#8217;m not convinced its hardware. I did an upgrade from Snow Leopard to Lion, and there is a good bit of cruft around. So, I decide to do a nice clean wipe, fresh Lion install, and keep it basic.</p>

<p>How basic?</p>

<p>I normally tend to say/think that all I really need to do 98% of my day to day work is Chrome and a Terminal. One of those is built in. So, a clean reinstall, install Chrome (which I&#8217;ve rebased to have very few extensions etc), install RVM, get my gems, pull dotfiles/etc from github, install homebrew for building UNIX app (Thanks to Phil for the recommendation, I already like it far better than macports), get XCode from the app store, and well, thats about it. Really.</p>

<p>I&#8217;m going for the minimal number of apps installed. No Office if I can get away with it (Google Docs), no Mail.app/Thunderbird (Gmail/Google Apps), No GUI text editors (VIM!). I&#8217;m goign to try to avoid Dropbox, though that won&#8217;t last long, but I&#8217;m going to give it a thorough cleaning  and move lots to github/a private git server.</p>

<p>Thats the next task up, a git server/repo @ home. Might got KVM on my home server, and stand up a handful of minimal VMS, for testing, playing around, sperating services a bit.</p>

<p>More to come!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Progress]]></title>
    <link href="http://mattynick.com/blog/2011/09/30/progress/"/>
    <updated>2011-09-30T17:02:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/09/30/progress</id>
    <content type="html"><![CDATA[<p>Made a little progress:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>nichols2::LSCI-NICHOLS2-2 { 17:00:53 Fri Sep 30 }
</span><span class='line'>~/Development/rudo-> rake init
</span><span class='line'>RuDo init started, creatding SQLite DB...
</span><span class='line'>nichols2::LSCI-NICHOLS2-2 { 17:00:56 Fri Sep 30 }
</span><span class='line'>~/Development/rudo-> rake new_list["Todo"]
</span><span class='line'>New List "Todo" created with ID#[1]
</span><span class='line'>nichols2::LSCI-NICHOLS2-2 { 17:01:05 Fri Sep 30 }
</span><span class='line'>~/Development/rudo-> rake new_list["Work"]
</span><span class='line'>New List "Work" created with ID#[2]
</span><span class='line'>nichols2::LSCI-NICHOLS2-2 { 17:01:09 Fri Sep 30 }
</span><span class='line'>~/Development/rudo-> rake new_list["Home"]
</span><span class='line'>New List "Home" created with ID#[3]
</span><span class='line'>nichols2::LSCI-NICHOLS2-2 { 17:01:17 Fri Sep 30 }
</span><span class='line'>~/Development/rudo-> rake lists
</span><span class='line'>RuDo has the following lists:
</span><span class='line'>1
</span><span class='line'>Todo
</span><span class='line'>2
</span><span class='line'>Work
</span><span class='line'>3
</span><span class='line'>Home</span></code></pre></td></tr></table></div></figure>


<p>It works. Sending the push to github for the day.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On Learning Ruby and a New Task List]]></title>
    <link href="http://mattynick.com/blog/2011/09/30/on-learning-ruby-and-a-new-task-list/"/>
    <updated>2011-09-30T13:24:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/09/30/on-learning-ruby-and-a-new-task-list</id>
    <content type="html"><![CDATA[<p>Puppet is all ruby base. This blog (octopress), is all ruby based. Ruby seems neat, and I&#8217;d like to learn a  new language, and I know the only way I&#8217;ll evern learn a new one is to have some goal to accomplish.</p>

<p>So, since I&#8217;m always looking for a new Todo/Task list option, I&#8217;m thinking of writing my own&#8230;.</p>

<p>I liked todo.txt, and honestly may go back to that at some point, but first I want to try this out. I figure a task list is simple, and I only have the following requirments:</p>

<ul>
<li>Multiple tasks lists/&#8221;tags&#8221; for tasks, as I want to seperate work from personal, etc etc</li>
<li>Simple done/not done functionality.</li>
<li>no need for due dates or priority</li>
<li>store teh date created and date marked done, incase i want them later.</li>
</ul>


<p>So, For now I&#8217;m thinking:</p>

<ul>
<li>Write this in Ruby.</li>
<li>Sqlite .db file to store the data</li>
<li>use a Rakefile to run everything?, ala &#8220;rake new_list[&#8220;work&#8221;], rake new_task[&#8220;get back to work&#8221;,&#8221;work&#8221;], rake complete[task#] &#8221; ?</li>
</ul>


<p>So, for database tables, I&#8217;m thinking:</p>

<ul>
<li>Tasks table store, well, tasks (taskid, status, title, notes, listid(or listids?), date created, date completed)</li>
<li>lists table has task list names matched to listids.</li>
</ul>


<p>Thats it!</p>

<p>ruby + sqlite should to the trick. I can put this in dropbox and keep it in sync everywhere. This doesn&#8217;t solve the mobile device use case, but, thisis for learning more than anything.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testing Post 2 From a Different System]]></title>
    <link href="http://mattynick.com/blog/2011/09/27/testing-post-2-from-a-different-system/"/>
    <updated>2011-09-27T10:17:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/09/27/testing-post-2-from-a-different-system</id>
    <content type="html"><![CDATA[<p>Okay, so, on another system, I did (roughly):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>git clone -b source &lt;remote-url> octopress
</span><span class='line'>  cd octopress
</span><span class='line'>  &lt;run through the ocotpress getting started guide if neede dto get all teh ruby bits installed,no need to rake install>
</span><span class='line'>  rake new_post["title"]
</span><span class='line'>  rake setup_github_pages</span></code></pre></td></tr></table></div></figure>


<p>and here it is..
Neato. And The publishing routine is:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rake generate
</span><span class='line'>  rake deploy 
</span><span class='line'>  git add /path/to/new/stuff
</span><span class='line'>  git commit -a 
</span><span class='line'>  git push origin source</span></code></pre></td></tr></table></div></figure>


<p>I think thats it&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Trying Octopress]]></title>
    <link href="http://mattynick.com/blog/2011/09/27/trying-octopress/"/>
    <updated>2011-09-27T10:02:00-04:00</updated>
    <id>http://mattynick.com/blog/2011/09/27/trying-octopress</id>
    <content type="html"><![CDATA[<p>trying out octopress a bit. mostly to force myself to learn git way better. lets see&#8230;</p>
]]></content>
  </entry>
  
</feed>

