Wizardlab: How it Works

The Wizardlab project consists of a multi-machine Vagrantfile, a collection of Ansible playbooks, and a Makefile

The Makefile

I define how to configure the VMs with Ansible through a Makefile. The Makefile that instructs make (man make) to execute targets. This utility is typically used for defining how to compile source-code into binary executable files, but we use it as another layer of automation. See wizardlab/Makefile

While working out of either /home/vagrant or /vagrant/ This command will run a playbook that regenerates SSH keys

$ make keys

While this one will setup a Debian PXE installation environment

$ make pxe

This takes things a step further, and we setup a Clonezilla based imaging environment.

$ make imaging

Instead of playing with PXE, stand up DNS, DHCP, and Docker like so:

$ make docker_lab

Wizardlab is designed to automate standing up a set of services, so you can get right into your configuration idea.

An Example Ansible Directory Structure

Ansible configuration directories can be organized a number of ways, but let’s suppose I have two roles (role0 and role1) that I design to setup two services: service0 and service1.

I might have a testing inventory called test-inventory, and a folder with various ‘production’ host inventory files organized by infrastrucure context. For example 1-cluster targets machines in the compute cluster while 3-research.yml targets research desktops. Adopting a folder structure like the one below allows us to tap into features of ansible that help us build very adaptive deployment strategies.

test-inventory          #  If we pass a single file as the inventory, it runs just one. 
inventory/              #  If you pass a folder as your inventory file, it runs multiple.
  0-desktops            #  We can prefix our files to manipulate the order
  1-cluster             #  ini format is a row separated list of hosts, "simple"
  2-openstack.yml       #  yml format is avaiable too. Nice for compicated structures.
  3-research.yml        #  Pick a format you like. Either one works the same.
  group_vars/           #  Have multiple files to organize variables to apply to groups.
    all.yml             #  Variables that will be supplied to the special 'all' group.
    services.yml        #  Variables that will be supplied to only the 'services' group.
playbooks/              #  Not a special folder name. Here I am grouping a set of roles 
  role0/                #  This folder groups all the resources for a configuration together
    tasks/              #  Special folder name
      main.yml          #  The tasks in this file will run when role0 applies to a group. 
    files/              #  Special folder name
      service0.conf     #  You may hardcode a configuration file
    templates/          #  Special folder name
      service.conf.j2   #  Or, you may create a template instead. End files in .j2 
    vars/               #  Special folder name
      main.yml          #  The variables specific to this role
  role1/                #  We may develop as many roles we like.
  ...

Wizardlab’s file structure

I try to stick to the prescribed structure, but I prefer to use only a subset of the special role-associated folders: tasks, files, templates. I may be adding some handlers in the near future. Since the Vagrantfile only stands up a few VMs, we use a single inventory file.

inventory               #  ini format inventory of the Vagrant machines
playbooks/
  controller/           #  Role for the controller
    tasks/
    files/              #  Role for configuring Docker
  docker/
    tasks/
    files/
  infra/                #  Role for DHCP/DNS
    tasks/
    templates/
  pxe/                  #  Role for Debian PXE intaller
    tasks/
    templates/
    files/
  clonezilla/           #  Role for Clonezilla imaging environment
    tasks/
    templates/
    files/
  fog/                  #  Role for Fog imaging environment
  windows/              #  Role for Windows configuration management
    tasks/
    vars/