<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Leif Madsen. on Leif Madsen.</title>
    <link>http://blog.leifmadsen.com/</link>
    <description>Recent content in Leif Madsen. on Leif Madsen.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Leif Madsen</copyright>
    <lastBuildDate>Wed, 08 Nov 2017 08:40:26 -0500</lastBuildDate>
    <atom:link href="/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Blog License</title>
      <link>http://blog.leifmadsen.com/license/</link>
      <pubDate>Wed, 08 Nov 2017 08:40:26 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/license/</guid>
      <description>Blog by Leif Madsen is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Based on a work at https://github.com/leifmadsen/blog.</description>
    </item>
    
    <item>
      <title>AWX: The Poor Man&#39;s CI?</title>
      <link>http://blog.leifmadsen.com/blog/2017/11/07/awx-the-poor-mans-ci/</link>
      <pubDate>Tue, 07 Nov 2017 13:48:19 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/11/07/awx-the-poor-mans-ci/</guid>
      <description>&lt;p&gt;



  





&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css&#34; integrity=&#34;sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=&#34; crossorigin=&#34;anonymous&#34; /&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css&#34; integrity=&#34;sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=&#34; crossorigin=&#34;anonymous&#34; /&gt;



&lt;div class=&#34;pswp&#34; tabindex=&#34;-1&#34; role=&#34;dialog&#34; aria-hidden=&#34;true&#34;&gt;

&lt;div class=&#34;pswp__bg&#34;&gt;&lt;/div&gt;

&lt;div class=&#34;pswp__scroll-wrap&#34;&gt;
    
    &lt;div class=&#34;pswp__container&#34;&gt;
      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;
      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;
      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;
    &lt;/div&gt;
    
    &lt;div class=&#34;pswp__ui pswp__ui--hidden&#34;&gt;
    &lt;div class=&#34;pswp__top-bar&#34;&gt;
      
      &lt;div class=&#34;pswp__counter&#34;&gt;&lt;/div&gt;
      &lt;button class=&#34;pswp__button pswp__button--close&#34; title=&#34;Close (Esc)&#34;&gt;&lt;/button&gt;
      &lt;button class=&#34;pswp__button pswp__button--share&#34; title=&#34;Share&#34;&gt;&lt;/button&gt;
      &lt;button class=&#34;pswp__button pswp__button--fs&#34; title=&#34;Toggle fullscreen&#34;&gt;&lt;/button&gt;
      &lt;button class=&#34;pswp__button pswp__button--zoom&#34; title=&#34;Zoom in/out&#34;&gt;&lt;/button&gt;
      
      
      &lt;div class=&#34;pswp__preloader&#34;&gt;
        &lt;div class=&#34;pswp__preloader__icn&#34;&gt;
          &lt;div class=&#34;pswp__preloader__cut&#34;&gt;
            &lt;div class=&#34;pswp__preloader__donut&#34;&gt;&lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&#34;pswp__share-modal pswp__share-modal--hidden pswp__single-tap&#34;&gt;
      &lt;div class=&#34;pswp__share-tooltip&#34;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;button class=&#34;pswp__button pswp__button--arrow--left&#34; title=&#34;Previous (arrow left)&#34;&gt;
    &lt;/button&gt;
    &lt;button class=&#34;pswp__button pswp__button--arrow--right&#34; title=&#34;Next (arrow right)&#34;&gt;
    &lt;/button&gt;
    &lt;div class=&#34;pswp__caption&#34;&gt;
      &lt;div class=&#34;pswp__caption__center&#34;&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

I&amp;rsquo;m just going to go ahead and blame &lt;a href=&#34;https://twitter.com/dougbtv&#34;&gt;@dougbtv&lt;/a&gt;
for all my awesome and terrible ideas. We&amp;rsquo;ve been working on several
&lt;a href=&#34;https://github.com/ansible/ansible&#34;&gt;Ansible&lt;/a&gt; playbooks to spin up development
environments; like
&lt;a href=&#34;https://github.com/redhat-nfvpe/kube-centos-ansible&#34;&gt;kucean&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Due to the rapid development nature of things like Kubernetes, Heketi,
GlusterFS, and other tools, it&amp;rsquo;s both possible and probable that our playbooks
could become broken at any given time. We&amp;rsquo;ve been wanting to get some continous
integration spun up to test this with &lt;a href=&#34;https://docs.openstack.org/infra/zuul/feature/zuulv3/index.html&#34;&gt;Zuul v3&lt;/a&gt;
but the learning curve for that is a bit more than we&amp;rsquo;d prefer to
tackle for some simple periodic runs. Same goes for &lt;a href=&#34;https://jenkins.io/doc/&#34;&gt;Jenkins&lt;/a&gt;
or any other number of continous integration software bits.&lt;/p&gt;

&lt;p&gt;Enter the brilliantly mad mind of @dougbtv. He wondered if AWX (Ansible Tower)
could be turned into a sort of &amp;ldquo;Poor Man&amp;rsquo;s CI&amp;rdquo;? Hold my beer. Challenge
accepted!
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Deploying AWX to OpenStack RDO Cloud</title>
      <link>http://blog.leifmadsen.com/blog/2017/11/07/deploying-awx-to-openstack-rdo-cloud/</link>
      <pubDate>Tue, 07 Nov 2017 10:20:24 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/11/07/deploying-awx-to-openstack-rdo-cloud/</guid>
      <description>&lt;p&gt;Recently I&amp;rsquo;ve been playing around with AWX (the upstream, open source code base
of Ansible Tower), and wanted to make it easy to deploy. Standing on the
shoulders of giants (namely &lt;a href=&#34;https://galaxy.ansible.com/geerlingguy/&#34;&gt;@geerlingguy&lt;/a&gt;)
I built out a wrapper playbook that would let me easily deploy AWX into a VM on
an OpenStack cloud (in my case, the RDO Cloud). In this blog post, I&amp;rsquo;ll show
you the wrapper playbook I built, and how to consume it to deploy a development
AWX environment.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Persistent volumes with GlusterFS</title>
      <link>http://blog.leifmadsen.com/blog/2017/09/19/persistent-volumes-with-glusterfs/</link>
      <pubDate>Tue, 19 Sep 2017 13:28:56 -0400</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/09/19/persistent-volumes-with-glusterfs/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I had the original vision of how storage might work
with Kubernetes. I had seen a project called Heketi that helped to make
GlusterFS live inside the Kubernetes infrastructure itself. I wasn&amp;rsquo;t entirely
convinced on this approach because I wasn&amp;rsquo;t necessarily comfortable with
Kubernetes managing its own storage infrastructure. This is the story about how
wrong I was.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>yakLab Part 1c: Bootstrapping Bifrost with Ansible</title>
      <link>http://blog.leifmadsen.com/blog/2017/08/04/yaklab-part-1c-bootstrapping-bifrost-with-ansible/</link>
      <pubDate>Fri, 04 Aug 2017 15:02:00 -0400</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/08/04/yaklab-part-1c-bootstrapping-bifrost-with-ansible/</guid>
      <description>&lt;p&gt;In this scene I&amp;rsquo;ll explore some of the bootstrapping I&amp;rsquo;ve been working on for a
while that will result in a clean, shiny new Bifrost deployment, populated with
inventory, executed from your laptop to a virtual machine.&lt;/p&gt;

&lt;p&gt;Bifrost is an OpenStack project that utilizes OpenStack Ironic to provision
baremetal nodes. This is related to my previous post on &lt;a href=&#34;http://blog.leifmadsen.com/blog/2017/07/12/yaklab-part-1a-building-the-virtual-cobbler-deployment/&#34;&gt;Building the virtual
Cobbler deployment&lt;/a&gt;.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>yakLab Part 1b: Kickstart File Build Out</title>
      <link>http://blog.leifmadsen.com/blog/2017/07/19/yaklab-part-1b-kickstart-file-build-out/</link>
      <pubDate>Wed, 19 Jul 2017 13:54:42 -0400</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/07/19/yaklab-part-1b-kickstart-file-build-out/</guid>
      <description>&lt;p&gt;In scene 1b, we&amp;rsquo;ll continue with our work from the &lt;a href=&#34;http://blog.leifmadsen.com/blog/2017/07/12/yaklab-part-1a-building-the-virtual-cobbler-deployment/&#34;&gt;Building the virtual
Cobbler deployment&lt;/a&gt; and
get a &lt;em&gt;kickstart&lt;/em&gt; file loaded into Cobbler. I&amp;rsquo;m going to be mostly reviewing
the kickstart file itself, and not really getting into how to manage the
Cobbler process itself (that&amp;rsquo;s left as an exercise for the reader).
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>yakLab Part 1a: Building the virtual Cobbler deployment</title>
      <link>http://blog.leifmadsen.com/blog/2017/07/12/yaklab-part-1a-building-the-virtual-cobbler-deployment/</link>
      <pubDate>Wed, 12 Jul 2017 20:45:01 -0400</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/07/12/yaklab-part-1a-building-the-virtual-cobbler-deployment/</guid>
      <description>&lt;p&gt;In this scene I&amp;rsquo;ll discuss how I&amp;rsquo;ve built out a local Cobbler deployment into
my virtual host in order to bootstrap the operating system onto my baremetal
nodes via kickstart files and PXE booting.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>yakLab build out</title>
      <link>http://blog.leifmadsen.com/blog/2017/07/12/yaklab-build-out/</link>
      <pubDate>Wed, 12 Jul 2017 15:00:00 -0400</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/07/12/yaklab-build-out/</guid>
      <description>&lt;p&gt;&lt;em&gt;Edit 2017-08-09: Updated diagram 1-1 to a graphic showing the entire lab
physical topology&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The yakLab is a place where yaks are electronically instantiated for the
purpose of learning and documenting. The lab consists of a virtualization host
(virthost) which has 64GB of memory and hosts all the virtual machines,
primarily for infrastructure.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Finding available Ansible tags in playbooks and roles</title>
      <link>http://blog.leifmadsen.com/blog/2017/01/04/finding-available-ansible-tags-in-playbooks-and-roles/</link>
      <pubDate>Wed, 04 Jan 2017 15:42:23 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/01/04/finding-available-ansible-tags-in-playbooks-and-roles/</guid>
      <description>&lt;p&gt;Today I went down a yak shaving path trying to figure out how to get all the
available tags in a fairly complicated plethora of Ansible playbooks and roles.
One of these such situations involves TripleO Quickstart, which is made up of
several different playbooks and repositories of different roles.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Installing Python 2.7 on CentOS 6.x</title>
      <link>http://blog.leifmadsen.com/blog/2017/01/03/installing-python-2.7-on-centos-6.x/</link>
      <pubDate>Tue, 03 Jan 2017 14:34:38 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2017/01/03/installing-python-2.7-on-centos-6.x/</guid>
      <description>&lt;p&gt;I recently had a need to install Python 2.7 on an older CentOS 6 machine since
I wanted to generate some SSL certificates for my web server. On CentOS 6, then
default Python installation is 2.6, which doesn&amp;rsquo;t seem to work for Let&amp;rsquo;s
Encrypt.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Create a virtual undercloud with TripleO Quickstart</title>
      <link>http://blog.leifmadsen.com/blog/2016/12/28/create-a-virtual-undercloud-with-tripleo-quickstart/</link>
      <pubDate>Wed, 28 Dec 2016 13:01:21 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2016/12/28/create-a-virtual-undercloud-with-tripleo-quickstart/</guid>
      <description>&lt;p&gt;In this blog post I&amp;rsquo;ll discuss how I&amp;rsquo;m currently using &lt;a href=&#34;https://github.com/openstack/tripleo-quickstart&#34;&gt;TripleO
Quickstart&lt;/a&gt; to instantiate a virtual machine on a remote virtual machine
host from my workstation. In follow up blog posts I&amp;rsquo;ll discuss how to utilize
the virtual machine to provision both virtual and baremetal overclouds from the
virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Creating virtual machines in libvirt with virt-install</title>
      <link>http://blog.leifmadsen.com/blog/2016/12/16/creating-virtual-machines-in-libvirt-with-virt-install/</link>
      <pubDate>Fri, 16 Dec 2016 14:36:23 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2016/12/16/creating-virtual-machines-in-libvirt-with-virt-install/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been wanting to automate my virtual machine instantiation for a while now,
but I&amp;rsquo;ve always hated the idea of having to spin up multiple bits of
infrastruction to deal with PXE booting, web server to host a kickstart file,
etc. Luckily, I ran into some stuff today, and figured out how to automate
virtual machine instantitation without having to resort to anything outside of
localhost.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Initial Fedora libvirt Setup</title>
      <link>http://blog.leifmadsen.com/blog/2016/12/16/initial-fedora-libvirt-setup/</link>
      <pubDate>Fri, 16 Dec 2016 10:30:35 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2016/12/16/initial-fedora-libvirt-setup/</guid>
      <description>&lt;p&gt;There are always a few things I need to do to get libvirt working with a
non-root user on Fedora that I need to do, and typically results in some Google
researching. Here are some notes of what I recently did to get my libvirt setup
going on a new Fedora 25 installation and working with a non-root user.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Create network bridge with nmcli for libvirt</title>
      <link>http://blog.leifmadsen.com/blog/2016/12/01/create-network-bridge-with-nmcli-for-libvirt/</link>
      <pubDate>Thu, 01 Dec 2016 14:51:52 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2016/12/01/create-network-bridge-with-nmcli-for-libvirt/</guid>
      <description>&lt;p&gt;In order to get libvirt working properly with bridged networking, we first need
to configure our local network to have network bridge slaved to our wired
ethernet adapter. I don&amp;rsquo;t have to set this up too often (as once I do, it just
sits there running happily). Here are some basic steps I did to get this going
locally.
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>TripleO: Using the fake_pxe driver with Ironic</title>
      <link>http://blog.leifmadsen.com/blog/2016/11/11/tripleo-using-the-fake_pxe-driver-with-ironic/</link>
      <pubDate>Fri, 11 Nov 2016 17:00:00 -0500</pubDate>
      
      <guid>http://blog.leifmadsen.com/blog/2016/11/11/tripleo-using-the-fake_pxe-driver-with-ironic/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on testing things with TripleO and normally I use &lt;a href=&#34;https://github.com/openstack/tripleo-quickstart/&#34;&gt;TripleO
Quickstart&lt;/a&gt; to spin things up
in a virtual environment.&lt;/p&gt;

&lt;p&gt;Often when doing NFV work though, you need things that can&amp;rsquo;t be used in a
virtual environment (such as DPDK, SR-IOV, etc) so you need some baremetal
nodes.&lt;/p&gt;

&lt;p&gt;In my home lab environment though, I don&amp;rsquo;t have the luxury of IPMI, so I need
to make use of the &lt;code&gt;fake_pxe&lt;/code&gt; driver in Ironic, which allows for standard PXE
control, but requires you to deal with powering on and off the machines
manually. Let me show you how I make use of that.
&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
