Example Sample App and Notes on Setting up OSX, Vagrant, Virtual Box and Rails with Postgres
- Using Vagrant for Rails Development
- Vlad Igleba
- Learn Chef
- Debugging Chef Runs with Ruby
- Rails Server IP Binding
#Start Downloads
-
Start Download Vagrant for MAC OS X - here 84MB Installer
-
Start Download Virtual Box v5.0.18-10 for OSX amd64 - here 86MB Installer
#Install Virtual Box (Requires 180MB disk space)
- Run VirtualBox.pkg
- Run VirtualBox as an OSX application
- Should bring up
Oracle VM VirtualBox Manager
window
#Install Vagrant (Requires 235MB disk space)
- Run Vagrant.pkg
$ vagrant -v
Vagrant 1.8.1
#Install Vagrant Plugins
$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.11.0)'!
Took a minute or so (as promised)
$ vagrant plugin install vagrant-librarian-chef-nochef
Installing the 'vagrant-librarian-chef-nochef' plugin. This can take a few minutes...
Installed the plugin 'vagrant-librarian-chef-nochef (0.2.0)'!
Took a minute or so (as promised)
Update: Try this to download and install the box first (may save the wait later on)
$ vagrant box add ubuntu/trusty64
Note: No need to wait for this to complete at this point, but it is needed by the time you use vagrant up
$ rails new pizzastore --skip-spring --skip-test-unit --database=postgresql
Using -d=postgresql -T -B --skip-spring from /Users/stuart/.railsrc
create
create README.rdoc
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/assets/javascripts/application.js
create app/assets/stylesheets/application.css
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/views/layouts/application.html.erb
create app/assets/images/.keep
create app/mailers/.keep
create app/models/.keep
create app/controllers/concerns/.keep
create app/models/concerns/.keep
create bin
create bin/bundle
create bin/rails
create bin/rake
create bin/setup
create config
create config/routes.rb
create config/application.rb
create config/environment.rb
create config/secrets.yml
create config/environments
create config/environments/development.rb
create config/environments/production.rb
create config/environments/test.rb
create config/initializers
create config/initializers/assets.rb
create config/initializers/backtrace_silencers.rb
create config/initializers/cookies_serializer.rb
create config/initializers/filter_parameter_logging.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/session_store.rb
create config/initializers/wrap_parameters.rb
create config/locales
create config/locales/en.yml
create config/boot.rb
create config/database.yml
create db
create db/seeds.rb
create lib
create lib/tasks
create lib/tasks/.keep
create lib/assets
create lib/assets/.keep
create log
create log/.keep
create public
create public/404.html
create public/422.html
create public/500.html
create public/favicon.ico
create public/robots.txt
create tmp/cache
create tmp/cache/assets
create vendor/assets/javascripts
create vendor/assets/javascripts/.keep
create vendor/assets/stylesheets
create vendor/assets/stylesheets/.keep
$ cd pizzastore/
$ git init
$ git add .
$ git commit -m'Intial Commit'
$ vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
Put this content in the Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Use Ubuntu 14.04 Trusty Tahr 64-bit as our operating system
config.vm.box = "ubuntu/trusty64"
# Configurate the virtual machine to use 2GB of RAM
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
end
# Forward the Rails server default port to the host
config.vm.network :forwarded_port, guest: 3000, host: 3001
config.vm.network "private_network", type: "dhcp"
# Use Chef Solo to provision our virtual machine
config.vm.provision :chef_solo do |chef|
chef.log_level = ENV.fetch("CHEF_LOG", "info").downcase.to_sym
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.add_recipe "apt"
chef.add_recipe "ruby_build"
chef.add_recipe "rbenv::user"
chef.add_recipe "rbenv::vagrant"
chef.add_recipe "vim"
chef.add_recipe "postgresql::server"
chef.add_recipe "postgresql::ruby"
chef.add_recipe "pizzastore::database"
# Install Ruby 2.2.1 and Bundler
# Set an empty root password for MySQL to make things simple
chef.json = {
rbenv: {
user_installs: [{
user: 'vagrant',
rubies: ["2.2.1"],
global: "2.2.1",
gems: {
"2.2.1" => [
{ name: "bundler" }
]
}
}]
},
postgresql: {
password: {
postgres: "postgres"
}
}
}
end
end
$ git add .
$ git commit -m'Add Vagrantfile'
vi: set ft=ruby :
- 'magical modeline' Tells vi to support ruby syntax for this fileconfig.vm.provision :chef_solo do |chef|
- Chef Solo is a simple provisioner which usessolo-mode
and doesn't need a lot of configurationchef.add_recipe "xxx"
- Tells chef to installxxx
recipechef.json = {
- Place to provide configuration for the recipies
$ touch Cheffile
Add this content to the file
site "http://community.opscode.com/api/v1"
cookbook 'apt'
cookbook 'build-essential'
cookbook 'database', '~> 5.1.2'
cookbook 'postgres', '~> 2.17.3'
cookbook 'ruby_build'
cookbook 'rbenv', git: 'https://github.com/aminin/chef-rbenv'
cookbook 'vim'
$ git add .
$ git commit -m'Add Cheffile'
When you spin up the VM, there will not be a database or a user for the rails app to connect with.
You can handle this manually within the vagrant ssh
shell using postgres createuser vagrant
and bin/rake db:create
But I wanted to play with chef a bit so I tried this:
- Review the files in the site-cookbooks folder
If you don't want to go through the hassle of creating your own recipe then just
remove chef.add_recipe "pizzastore::database"
from your Vagrantfile
and fix the
database problems as described above
Note: It could take several hours to download this image, in this case ubuntu/trusty64
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/trusty64'
default: URL: https://atlas.hashicorp.com/ubuntu/trusty64
==> default: Adding box 'ubuntu/trusty64' (v20160406.0.0) for provider: virtualbox
default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions/20160406.0.0/providers/virtualbox.box
default: Progress: 3% (Rate: 239k/s, Estimated time remaining: 1:03:30)
If you experience problems with vagrant up
and need to debug you have a few choices
$ vagrant destroy
- will completely destroy in the box and let you try again$ vagrant provision
- will just run the chef part again$ CHEF_LOG=debug vagrant provision
- will run the chef part will full logging
You can get in via
$ ssh [email protected] -p 2222
The default password for vagrant
is vagrant
But I think the official way is
$ vagrant ssh
Note: You should be in an ssh shell on the vm at this point
$ cd /vagrant
$ bin/bundle install
$ bin/rake db:migrate
$ bin/rails s -b 0.0.0.0
Open the forwarded port on the host OSX http://localhost:3001/