Sharing Your Virtual Machine on the Web with Vagrant Share

Vagrant Share is a new feature of Vagrant 1.5+ that lets you share your local development environment to the web in literally seconds. You can even set it up to let others SSH into your virtual machine. I not only find this incredibly useful, but it’s quite cool as well.

Like Vagrant? Check out Scotch Box – Our Dead Simple LAMP Vagrant Box

I’m a huge fan of Vagrant! If you don’t know what it is, Vagrant is a tool for easily creating development environments. In layman’s terms, you set a whole bunch of config options in a file, then tell Vagrant to use that configuration to provision and build you a server. Your server can be provisioned locally (making local development painless) or even on a provider such as Amazon or Digital Ocean. Here’s a tutorial I wrote on getting started with Vagrant. By the end of that tutorial, you’ll have a PHP 5.4 LAMP stack running locally on your machine.

What is Vagrant Cloud?

I finally updated my Vagrant to 1.5+ (1.6.3 to be exact). I never liked to upgrade because I was afraid of things breaking or plugins not being compatible. With Vagrant 1.5+ though, Vagrant promised more stability and a ton of cool new features. It also comes with the new and awesome service Vagrant Cloud. Vagrant Cloud makes collaboration with Vagrant easy for teams small or large. Some things Vagrant Cloud offers are:

  • Box Hosting (You may have to host the box yourself)
  • Discover Public and Private Boxes
  • Vagrant Share
  • Vagrant Share Static Names
  • Vagrant Share Custom Domain
  • Organization/Teams/ACLs

So, say I need a virtual environment for Node.js, PHP, or Ruby, I can login to Vagrant Cloud, search some shared boxes, and then find one to help me get started with my development environment. Some of these boxes are full-featured and require almost no overhead configuration. This collaboration from community boxes is really cool for small teams who don’t have the luxury of full-time Server Admin and Operations people.

Vagrant Share is the other huge part of Vagrant Cloud. Vagrant Share lets you easily share your Vagrant Virtual Machine to the web and make it accessible to anyone. So, say you quickly need to share with a client or team member your progress – rather than setting up a full-blown staging environment, you can just run vagrant share to get a temporary URL on vagrantcloud.com.

This is neat, but Vagrant actually takes this a a step further. With Vagrant Share you can even share SSH access to your VM with anyone from anywhere in the world! I’ve heard of some people setting this up while on the same network, but with this, as long as the user is connected to the Vagrant Cloud, it doesn’t matter which network they are on. This is super useful for debugging and collaborating. The rest of this tutorial will walk you though how to set this up.

Update Vagrant

The first thing you need to do is make sure you have the latest Vagrant version installed. I completely uninstalled Vagrant and reinstalled from scratch (including Virtual Box) since it’s quick, easy, and clean. Here’s the official instructions on uninstalling Vagrant. To uninstall Vagrant on Mac, just run these commands from the terminal:

sudo rm -rf /Applications/Vagrant
sudo rm /usr/bin/vagrant
sudo rm -rf ~/.vagrant.d

Then install Vagrant and reinstall any plugins you use. Here are the ones from my last tutorial so you can continue to use that setup:

vagrant plugin install vagrant-berkshelf --plugin-version '>= 2.0.1'
vagrant plugin install vagrant-hostmanager
vagrant plugin install vagrant-omnibus

Create a Vagrant Cloud Account

The next thing you’ll need to do is create a Vagrant Cloud account if you already don’t have one. Vagrant Cloud is completely free for basic users (which provides plenty of support). If you need some of the more advanced options, they have some very cheap and reasonable membership prices. Everything we’ll be doing is under the free tier, however.

Create a Vagrant Cloud Account

Authenticate Your Vagrant Cloud Account with Vagrant

Now that you have successfully signed up for a Vagrant Cloud account, you’ll need to authenticate Vagrant Cloud with your install of Vagrant. From the command line, run the following code :

vagrant login

It should prompt you with steps that would look something like this:

Vagrant Login CLI

That’s it! You’re now authenticated. For whatever reason, if you ever need to logout, you can just run:

vagrant login --logout

.

Create an Environment with Vagrant

Now that we have our Vagrant Cloud setup, we’ll create a virtual environment so we can share it. We’re going to be using the exact same LAMP Stack from the last Vagrant tutorial to make things easy. Make sure you have Berkshelf installed if you didn’t follow the last tutorial.

git clone git@github.com:MiniCodeMonkey/Vagrant-LAMP-Stack.git vagrant-share-demo
cd vagrant-share-demo
vagrant up
Note: You can name this whatever you want. You can also open up the Vagrantfile and name the project something else besides “projectname”.

After that runs, you can now navigate to http://projectname.local to see your Vagrant LAMP stack is working:

Vagrant LAMP Stack

Run the Share Command

Now that everything is setup, all you need to do is run the vagrant share command:

vagrant share

It will look something like this:

Vagrant Share

That’s all there is to it! Now you can visit the outputted URL and see your VM from any network anywhere in the world. As you start developing your application, it’s important that you make sure things like URLs are relative and not absolute.

Since this works by creating a local tunnel, you can make changes and see them reflected immediately. For example, change some text and visit the URL to see it updated instantly. This is really useful for when you need:

  • Help from a colleague
  • Show or demo for a client
  • Debug using a third-party program (e.g.: BrowserStack)

The connection will automatically close after about one hour. To close the connection manually, just enter:

ctrl c
SSL Support The Vagrant Share utility supports SSL as well. You can do: vagrant share --https 443 to get an SSL encrypted URL.

SSH Sharing

HTTP sharing like the example above is great for many reasons, but you can even share SSH access to your VM through Vagrant Cloud. To do this, make sure you terminate the previous share, then enter this command:

vagrant share --ssh

This time when the command runs, you’ll be prompted to create a password. After you create your password, Vagrant will actually print the code that you can share to grant SSH access to your VM to someone else. It will look something like this:

vagrant connect --ssh terrible-bear-6896

Now, if someone is authenticated with the Vagrant Cloud and runs that command, they’ll get full SSH access to your VM. They’ll also have to enter the password you created. This can be really useful for debugging and quickly helping someone fix a bug or issue. Collaborating locally just got a whole lot easier. You can terminate the share the same way you did with HTTP Sharing.

Conclusion

That’s all there is to using Vagrant Share. Some people mimic this or get pretty close to it with local tunnel tools or pseudo DNS tools like:

Vagrant Share makes this process easier, seamless, and ultra-fast. It also has the added benefit of allowing people SSH access to a VM from anywhere in the world.

I really enjoy using Vagrant, and it has made my development much more efficient. I imagine as Vagrant Cloud grows, they’ll start managing deployment for users, too. So from Vagrant Cloud you can Share temporary links, one-click provision to Digital Ocean or Amazon, and more. I may be wrong, but I really can see them growing Vagrant Cloud to manage servers similar to Larvel’s Forge tool does.