Capistrano: Deploying to a Vagrant VM
I’ve been working on a tutorial around thinking through problems in graphs using my football graph and I wanted to deploy it on a local vagrant VM as a stepping stone to deploying it in a live environment. My Vagrant file for the VM looks like this:
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| config.vm.box = "precise64" config.vm.define :neo01 do |neo| neo.vm.network :hostonly, "192.168.33.101" neo.vm.host_name = 'neo01.local' neo.vm.forward_port 7474, 57474 neo.vm.forward_port 80, 50080 end config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.provision :puppet do |puppet| puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "site.pp" puppet.module_path = "puppet/modules" end end
I’m port forwarding ports 80 and 7474 to 50080 and 57474 respectively so that I can access the web app and neo4j console from my browser. There is a bunch of puppet code to configure the machine in the location specified. Since the web app is written in Ruby/Sinatra the easiest deployment tool to use is probably capistrano and I found the tutorial on the beanstalk website really helpful for getting me setup. My config/deploy.rb file which I’ve got Capistrano setup to read looks like this:
require 'capistrano/ext/multistage' set :application, "thinkingingraphs" set :scm, :git set :repository, "git@bitbucket.org:markhneedham/thinkingingraphs.git" set :scm_passphrase, "" set :ssh_options, {:forward_agent => true} set :default_run_options, {:pty => true} set :stages, ["vagrant"] set :default_stage, "vagrant"
In my config/deploy/vagrant.rb file I have the following:
set :user, "vagrant" server "192.168.33.101", :app, :web, :db, :primary => true set :deploy_to, "/var/www/thinkingingraphs"
So that IP there is the same one that I assigned in Vagrantfile. If you didn’t do that then you’d need to use ‘vagrant ssh’ to go onto the VM and then ‘ifconfig’ to grab the IP instead. I figured there was probably another step required to tell Capistrano where it should get the vagrant public key from but I thought I’d try and deploy anyway just to see what would happen.
$ bundle exec cap deploy
It asked me to enter the vagrant user’s password which is ‘vagrant’ by default and I eventually found a post on StackOverflow which suggested changing the ‘ssh_options’ to the following:
set :ssh_options, {:forward_agent => true, keys: ['~/.vagrant.d/insecure_private_key']}
And with that the deployment worked flawlessly! Happy days.