All Blog Posts

Starting an Ephemeral VM Pipeline using macOS

Starting an Ephemeral VM Pipeline using macOS

Many organizations have working products based on the static build concept, and that approach works just fine for some use cases. However, as Dev and Ops teams move toward a more combined DevOps practice, they’re faced with a major pain point: writing infrastructure to go into ephemeral builds.

Orka has many plugins that allow the use of standard CI tools such as Jenkins, Teamcity, BuildKite, and more (see a full list here). In the event a pipeline is not using a standard CI/CD tool, or the use case is different from normal CI/CD use cases, teams can code their own ephemeral-based architecture using the Orka CLI.

As teams move to virtual machines, they seek to ease a few pain points but find old practices don’t hold up well. For example, one of the old methods with bare metal build machines is a clean-up process to get rid of any artifacts that may interfere with new builds, often followed by a reboot. In VMware, this is replaced with a snapshot revert, and with Orka, this is achieved with a vm delete command followed by vm create, and as of Orka 1.2.0, vm revert has been introduced as another option.

While these pain points can give teams new to infrastructure as code (IaC) pause, the important thing to remember is the workflow changes, but standards do not change. With Orka, the process to start with ephemeral VMs takes as little as two files, but the same general principles apply to VMware and any other system.

At MacStadium, we based our early quality control scripts, and our current Ansible benchmarking scripts, on two key files, an execution file, and basic parser file. This code was written with three conditions:

  • Needs to run on any macOS or Linux OS system
  • No VM customization beyond installing macOS and enabling SSH
  • No extra dependencies could be used on the VM side; staff is allowed to use locally installed dependencies

For these reasons, the benchmarking team chose to use a sh script with AWK. Although it is an older language, AWK conveniently runs on all macOS and Linux OS systems. These files are written against the CLI as opposed to API; this lets the staff do integration testing. However, your team might want to code against the API directly.

Our kick-off script is run-bench.sh and uses six core VMs on Orka:

# Usage: One field, the name of the VM you wish to create and test
# Example: ./run-bench.sh examplevm

orka vm create-config -v $1 -b benchmark.img -c 6 --C 6 -y
# User should see an Orka response at this point

orka vm deploy -v $1 -y
# User should see an Orka response at this point
echo ""

# The only json output from the CLI is currently by calling the --json
orka vm list -f all --json > acton.tmp

# Formatting json so awk can read it without a plugin
awk '{tmp=$0;gsub(/ /,"_",tmp);print tmp}' acton.tmp > tmp.tmp
awk '{tmp=$0;gsub(/,/," ",tmp);print tmp}' tmp.tmp > acton.tmp

# Add in the name of the VM to the awk commands
sed s/nodetest/$1/ benchcommands.awk > run.awk

# Call awk to parse the Orka vm list
awk -f run.awk acton.tmp > comm.sh
chmod +x comm.sh

# Wait for macOS bootup
sleep 30s

# Act on the new VM with random ports
./comm.sh

And then uses benchcommands.awk

{
# Loop through hte number of fields (NF) on the json output
for (loop = 1; loop <= NF; loop ++)
     {if ($loop~/nodetest/){name=$loop;
           # Find the field with "virtual_machine_name" and use it to gather data
     # Format so "name" is the VM name, in the above it will be "examplevm"
          sub(/virtual_machine_name..../,"",name);
          gsub(/\"/,"",name);
     
    # Set the information gathering flags
         portflag = 1;
         ipflag = 1 
    }
    # Find the Virtual Machine IP of interest inside of the proper VM name
    if(($loop~/virtual_machine_ip/)&&(ipflag == 1))
         {
              IP = $loop;
              sub(/^.virtual_machine_ip.../,"",IP);
              sub(/.$/,"",IP);
              ipflag = 0
    }
    # Find the port of interest, always after the base IP. Output the SSH command.
     if((portflag == 1)&&($loop~/ssh_port/)){Port = $loop; sub(/.ssh_port.../,"",Port);
         sub(/.$/,"",Port)
         if((Port~/[a-z]/)||(Port~/[A-Z]/)){}
         else {
              # known_hosts will often conflict when spinning up multiple VMs on the same base Host IP
              print "mv ~/.ssh/known_hosts garbage.out"

                   # A simple "ls" is done here to show success, but any command can be used
                   print "ssh -o \"StrictHostKeyChecking no\" -p " Port, " admin@"IP " '\''ls'\''";
                   }
              }
         }
    }

These scripts have a lot of room for customization. Not only can the API be used in place of the CLI, but it is fairly easy to add in extras like opening ports or assigning to specific nodes. Extra feedback can also be quickly added, and more intermediate files can be easily created for bug tracking.

These two simple scripts have formed the basis for several companies' first steps into infrastructure as code. And these companies have quickly and efficiently innovated on both scripts run from a master as well as those that live on the base image.

Try Orka Yourself

Want to learn more about Orka? Why not jump right in with our Orka demo? You get a two-hour window to spin up VMs, try the Jenkins plugin, and more! And if you want to stay up to date on the latest on what’s happening at MacStadium, be sure to join the MacStadium Community Slack channel - we post all the latest news to keep you up-to-date on everything we’re doing!

You May Also Like

Was this article helpful?

Vote Submitted
Oops! Something went wrong while submitting the form.
Vote Submitted
Oops! Something went wrong while submitting the form.
Return to Blog Home