0.02
No commit activity in last 3 years
No release in over 3 years
SmartOS Hypervisor provider for Vagrant
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 0
 Project Readme

Vagrant SmartOS Provider

Provision SmartOS zones using vagrant. For now, it only works with OS container zones.

Notes

This has only been demonstrated to work against a SmartOS hypervisor running in a VMware Fusion image, but since it's only interacted with via SSH, there is no reason why this won't work against a physical SmartOS hypervisor.

This is purely a prototype / proof-of-concept hacked together. I make no apologies for the state of the code or the lack of tests. Feel free to fix and pull-request :-p

Also, right now it uses a dummy box to get vagrant to play ball, whilst requiring an image_uuid parameter in the Vagrantfile. It might be much tidier if we could package up SmartOS images into vagrant-boxes and use those.

Installation

  • Get Vagrant 1.2.0+ installed (see elsewhere - I've been building using version 1.2.2).

  • Install the gem from RubyGems:

    vagrant plugin install --plugin-prerelease --plugin-source https://rubygems.org/ vagrant-smartos

  • Add the dummy box:

    vagrant box add smartos-dummy https://github.com/joshado/vagrant-smartos/raw/master/example_box/smartos.box

  • Boot a SmartOS hypervisor somewhere. It shouldn't matter if this is VMWare Fusion, VirtualBox or a dedicated machine, as long as you have SSH access to it.

  • Ensure your local ssh key is in the roots authorized_keys file on the SmartOS box. The simple way to test this is to ssh root@<hypervisor ip> from your workstation, which should drop you straight into a root shell on the hypervisor.

  • Write your Vagrantfile. See below for an example one and the options you can provide.

  • Run your VMs:

    vagrant up --provider=smartos

  • Now, try logging in :)

    vagrant ssh

Example Vagrantfile and options

There are two specific parameters required for the SmartOS provider (hypervisor and image_uuid) and a bunch of optional ones, you should be able to work it out:

Vagrant.require_plugin "vagrant-smartos"

Vagrant.configure("2") do |config|

  # For the time being, use our dummy box
  config.vm.box = "smartos-dummy"

  config.vm.provider :smartos do |smartos, override|
    # Required: This is which hypervisor to provision the VM on.
    # The format must be "<username>@<ip or hostname>"
    smartos.hypervisor = "root@172.16.251.129"

    # Required: This is the UUID of the SmartOS image to use for the VMs. 
    # It must already be imported using `imgadm` before running `vagrant up`.
    smartos.image_uuid = "cf7e2f40-9276-11e2-af9a-0bad2233fb0b"  # this is base64:1.9.1

    # Optional: The RAM allocation for the machine, defaults to the SmartOS default (256MB)
    # smartos.ram = 512

    # Optional: Disk quota for the machine, defaults to the SmartOS default (5G)
    # smartos.quota = 10

    # Optional: Specify the nic_tag to use
    # If omitted, 'admin' will be the default
    # smartos.nic_tag = "admin"

    # Optional: Specify a static IP address for the VM
    # If omitted, 'dhcp' will be used
    # smartos.ip_address = "1.2.3.4"

    # Optional: Specify the net-mask (required if not using dhcp)
    # smartos.subnet_mask = "255.255.255.0"

    # Optional: Specify the gateway (required if not using dhcp)
    # smartos.gateway = "255.255.255.0"

    # Optional: Specify a VLAN tag for this VM
    # smartos.vlan = 1234
  end

  # RSync'ed shared folders should work as normal
  config.vm.synced_folder "./", "/work-dir"

  # Multi-VMs should be fine, too; they will take the default parameters from above, and you can override
  # specifics for each VM
  #
  # config.vm.define :box1 do |box|
  #    box.vm.provider :smartos do |smartos, override|
  #      smartos.ip_address = "172.16.251.21"
  #    end
  # end
  #
  # config.vm.define :box2 do |box|
  #    box.vm.provider :smartos do |smartos, override|
  #      smartos.ip_address = "172.16.251.21"
  #    end
  # end
  #

end

## Problems, fixes?

Open an issue, or even better, a pull request :D