<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>MorganGoose.com</title>
    <link>http://morgangoose.com/blog</link>
    <description>notes about various technical subjects</description>
    <pubDate>Thu, 08 Dec 2016 01:14:37 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How fabric gets it right</title>
      <link>http://morgangoose.com/blog/2010/02/how-fabric-gets-it-right/</link>
      <pubDate>Thu, 11 Feb 2010 00:56:33 PST</pubDate>
      <category><![CDATA[Tools]]></category>
      <category><![CDATA[Programming]]></category>
      <category><![CDATA[Linux]]></category>
      <guid>http://morgangoose.com/blog/?p=76</guid>
      <description>How fabric gets it right</description>
      <content:encoded><![CDATA[<div class="document">
<div class="section" id="i-like-fabric-a-lot">
<h1>I like <a class="reference external" href="http://docs.fabfile.org">fabric</a>. A lot.</h1>
<p>Its a easy to use tool that continually makes my life simpler, and my projects smarter and more automated. Not much out there can really say that. At least nothing I use daily, without noticing, and dependably.</p>
<p>I used to use vellum, and that did what I needed. But fabric being under active development, and getting new features each version it seems is a huge plus. That and it does the network stuff for you, along with the nitty gritty.</p>
<p>Recently I have been giving presentations to the <a class="reference external" href="http://opensource.osu.edu/">Ohio State University's Open Source Club</a> about <a class="reference external" href="http://morgangoose.com/p/gnu_tools/">gnu tools</a>, <a class="reference external" href="http://morgangoose.com/p/tool_oriented_python/">python tools</a>, and soon some cli apps. Fabric really helped make this simple for me to get a whole system down for making and uploading these.</p>
<p>I made all of those presentations in restrctured text, and compiled them into their final formats. All of which was scripted in fabric. I became really attached to ReST after getting introduced to it watching <a class="reference external" href="http://catherinedevlin.pythoneers.com/">Catherine Devlin</a> give a <a class="reference external" href="ahref=&quot;http://catherinedevlin.pythoneers.com/presentations/rst/olf.html">talk about restructured text</a> at Ohio Linux Fest. I ended up finding a cool rst2s5 command that makes nice presentations and with a little tweaking it now also has syntax highlighted code blocks, and can make nice pdfs.</p>
<p>In starting to use fabric you'll notice the basic idea is that you'd make a fabfile that works a lot like a Makefile or a SConstruct file would, with make and scons respectively. You'll make calls with the fab command in the directory the fabfile is located and it will supply the targets.</p>
<p>Below in this example, two targets are made, pack and deploy. The pack target will just makes a tarball, using the local function fabric provides. The deploy target calls pack to make this tarball, then using the put function will place the tarball into the tmp directory, then change into the web dir provided, and extract the archive. It knows automaticly to do this to both hosts I provided, and since I am using an ssh key does all this trickery autonomously.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">fabfile.py:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
<div class="highlight"><pre><span class="kn">from</span> <span class="nn">fabric.api</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">env</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="s">&#39;username&#39;</span>
<span class="n">env</span><span class="o">.</span><span class="n">hosts</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;host1.com&#39;</span><span class="p">,</span> <span class="s">&#39;host2.com&#39;</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">pack</span><span class="p">():</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&#39;tar czf /tmp/project_foo.tgz project_foo/&#39;</span><span class="p">,</span> <span class="n">capture</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">deploy</span><span class="p">():</span>
    <span class="n">pack</span><span class="p">()</span>
    <span class="n">put</span><span class="p">(</span><span class="s">&#39;/tmp/project_foo.tgz&#39;</span><span class="p">,</span> <span class="s">&#39;/tmp/&#39;</span><span class="p">)</span>

    <span class="k">with</span> <span class="n">cd</span><span class="p">(</span><span class="s">&#39;/var/www/foo/&#39;</span><span class="p">):</span>
        <span class="n">run</span><span class="p">(</span><span class="s">&#39;tar xzf /tmp/project_foo.tgz&#39;</span><span class="p">)</span>
</pre></div>
</div>
<div class="section" id="fabric-can-do-a-lot-more-than-just-deploy">
<h1>Fabric can do a lot more than just deploy</h1>
<p>It's <a class="reference external" href="http://docs.fabfile.org">docs</a> have a lot of detail, and explain most everything well. A last example of some a cool fabric config would be the one I use to publish my presentations to this site.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">fabfile.py:</th><td class="field-body"></td>
</tr>
</tbody>
</table>
<div class="highlight"><pre><span class="kn">from</span> <span class="nn">fabric.api</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">env</span><span class="o">.</span><span class="n">roledefs</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">&#39;production&#39;</span><span class="p">:</span> <span class="p">[</span><span class="s">&quot;morgangoose.com&quot;</span><span class="p">],</span>
    <span class="p">}</span>


<span class="k">def</span> <span class="nf">setup_vars</span><span class="p">(</span><span class="n">project</span><span class="p">):</span>
    <span class="k">global</span> <span class="n">presentation</span>
    <span class="k">global</span> <span class="n">presentation_archive</span>
    <span class="k">global</span> <span class="n">rst_source</span>
    <span class="k">global</span> <span class="n">pdf</span>

    <span class="n">project</span> <span class="o">=</span> <span class="n">project</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s">&quot;/&quot;</span><span class="p">)</span>
    <span class="n">presentation</span> <span class="o">=</span> <span class="n">project</span>
    <span class="n">presentation_archive</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.tar.gz&quot;</span> <span class="o">%</span> <span class="n">presentation</span>
    <span class="n">rst_source</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.rst&quot;</span> <span class="o">%</span> <span class="n">presentation</span>
    <span class="n">pdf</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.pdf&quot;</span> <span class="o">%</span> <span class="n">presentation</span>

<span class="nd">@roles</span><span class="p">(</span><span class="s">&#39;production&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">upload</span><span class="p">(</span><span class="n">project</span><span class="p">):</span>
    <span class="n">env</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="s">&quot;username&quot;</span>
    <span class="n">p_dir</span> <span class="o">=</span> <span class="s">&quot;/var/www/html/p/&quot;</span>

    <span class="n">package</span><span class="p">(</span><span class="n">project</span><span class="p">)</span>
    <span class="n">put</span><span class="p">(</span><span class="n">presentation_archive</span><span class="p">,</span> <span class="n">p_dir</span><span class="p">)</span>
    <span class="n">put</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">presentation</span><span class="p">,</span> <span class="n">pdf</span><span class="p">),</span> <span class="n">p_dir</span><span class="p">)</span>
    <span class="k">with</span> <span class="n">cd</span><span class="p">(</span><span class="n">p_dir</span><span class="p">):</span>
        <span class="n">run</span><span class="p">(</span><span class="s">&quot;rm -rf </span><span class="si">%s</span><span class="s">/&quot;</span> <span class="o">%</span> <span class="n">presentation</span><span class="p">)</span>
        <span class="n">run</span><span class="p">(</span><span class="s">&quot;tar zxvf </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">presentation_archive</span><span class="p">)</span>

    <span class="n">local</span><span class="p">(</span><span class="s">&quot;rm -f </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">presentation_archive</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">package</span><span class="p">(</span><span class="n">project</span><span class="p">):</span>
    <span class="n">setup_vars</span><span class="p">(</span><span class="n">project</span><span class="p">)</span>
    <span class="n">make_presentation</span><span class="p">()</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;tar zcvf </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">presentation_archive</span><span class="p">,</span> <span class="n">presentation</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">make_presentation</span><span class="p">():</span>
    <span class="c">#PDF first</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;rst2pdf </span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s"> -o </span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span>
        <span class="n">presentation</span><span class="p">,</span> <span class="n">rst_source</span><span class="p">,</span> <span class="n">presentation</span><span class="p">,</span> <span class="n">pdf</span><span class="p">,</span> <span class="p">))</span>

    <span class="c">#Then s5 html presentation</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;python rst-directive.py </span><span class="se">\</span>
<span class="s">            --stylesheet=pygments.css </span><span class="se">\</span>
<span class="s">            --theme=small-black </span><span class="se">\</span>
<span class="s">            --quiet </span><span class="se">\</span>
<span class="s">            </span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s"> &gt; </span><span class="si">%s</span><span class="s">/index.html&quot;</span> <span class="o">%</span> <span class="p">(</span>
                <span class="n">presentation</span><span class="p">,</span> <span class="n">rst_source</span><span class="p">,</span> <span class="n">presentation</span><span class="p">,</span> <span class="p">))</span>

<span class="k">def</span> <span class="nf">new</span><span class="p">(</span><span class="n">project</span><span class="p">):</span>
    <span class="n">setup_vars</span><span class="p">(</span><span class="n">project</span><span class="p">)</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;mkdir -p </span><span class="si">%s</span><span class="s">/{,files}&quot;</span> <span class="o">%</span> <span class="n">presentation</span><span class="p">)</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;cp -R ui </span><span class="si">%s</span><span class="s">/&quot;</span> <span class="o">%</span> <span class="n">presentation</span><span class="p">)</span>
    <span class="n">local</span><span class="p">(</span><span class="s">&quot;touch </span><span class="si">%s</span><span class="s">/</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">presentation</span><span class="p">,</span> <span class="n">rst_source</span><span class="p">))</span>
</pre></div>
<p>This has some more complicated bits, where it uses the role decorator to specify only to use the hosts listed in the production role definitions.</p>
<p>It also takes advantage of an awesome feature I didn't know fabric had where, one can send arguments to a fabric target. So the project parameter in the targets here can be, and is, supplied via the command line.</p>
</div>
<div class="section" id="for-example">
<h1>For example</h1>
<p>I used this to deploy the updates to my most recent presentation:</p>
<div class="highlight"><pre><span class="nv">$ </span>fab upload:tool_oriented_python
</pre></div>
<p>That's telling fabric to run the upload target, and send the string &quot;tool_oriented_python&quot; as an argument to the function.</p>
<p>If you forget the targets you have just do:</p>
<div class="highlight"><pre><span class="nv">$ </span>fab -l
</pre></div>
</div>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
