Save this as **Vagrantfile**:
```ruby
# Instructions
# -----------------
# Follow these instructions to set up a new development environment.
#
# Setup tools
# -----------------
# gem install vagrant
#
# # librarian is chef's bundler
# gem install librarian-chef
#
# Install Chef cookbooks
# -----------------
# librarian-chef install
#
# Install VM
# -----------------
# vagrant up
#
# Provision VM, i.e install software with Chef
# -----------------
# vagrant provision
#
# Setup SSH
# -----------------
# vagrant ssh-config >> ~/.ssh/config
#
# sudo echo "10.11.12.13 development" >> /etc/hosts
#
# SSH into your dev environment
# -----------------
# ssh development
Vagrant::Config.run do |config|
# Configure IP, etc
config.vm.network :hostonly, "10.11.12.13"
config.vm.host_name = "development"
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
# Use 1GB RAM
config.vm.customize ["modifyvm", :id, "--memory", 1024]
# Link ~/projects on local machine to ~/projects on VM
config.vm.share_folder "projects", "/home/vagrant/projects", "~/projects", :nfs => true
config.vm.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/", "1"]
# Forward ports
config.vm.forward_port 80, 80
config.vm.forward_port 6080, 6080
config.vm.forward_port 8080, 8080
config.vm.forward_port 3000, 3000
config.vm.forward_port 9200, 9200
config.vm.forward_port 8888, 8888
config.vm.provision :chef_solo, :log_level => :debug do |chef|
chef.cookbooks_path = "cookbooks"
#chef.cookbooks_path = ["cookbooks", "vendor/cookbooks"]
chef.add_recipe "apt"
chef.add_recipe "vim"
chef.add_recipe "build-essential"
chef.add_recipe "git"
chef.add_recipe "curl"
chef.add_recipe "curl::devel"
chef.add_recipe "java"
chef.add_recipe "ruby_build"
chef.add_recipe "rbenv::system"
chef.add_recipe "rbenv::vagrant"
chef.add_recipe "sqlite"
chef.add_recipe "nodejs"
chef.add_recipe "percona::server"
chef.add_recipe "percona::client"
chef.add_recipe "elasticsearch"
# Run rubygems-bundler
config.vm.provision :shell, :inline => "gem regenerate_binstubs"
# To install APT packages use:
#%w(libmysql18-ruby libmysqlclient18-dev).each do |package|
#config.vm.provision :shell, :inline => "sudo aptitude -y install #{package}"
#end
chef.json = {
"rbenv" => {
"rubies" => [ "1.9.3-p448", "2.0.0-p247" ],
"global" => "2.0.0-p247",
"gems" => {
"2.0.0-p247" => [
{ :name => "bundler" }, { :name => "rubygems-bundler" }
],
"1.9.3-p448" => [
{ :name => "bundler" },{ :name => "rubygems-bundler" }
]
}
}
}
end
end
```
Save the following in Cheffile:
```ruby
site "http://community.opscode.com/api/v1"
cookbook "percona"
cookbook "rbenv",
:git => "https://github.com/fnichol/chef-rbenv",
:ref => "v0.7.2"
cookbook "percona"
cookbook "git"
cookbook "nodejs"
cookbook "ruby_build"
cookbook "sqlite"
cookbook "elasticsearch"
cookbook "curl", git: 'https://github.com/phlipper/chef-curl'
cookbook "build-essential"
cookbook "vim"
cookbook "java"
```
Read the instructions in Vagrantfile…
You should now be able to set up a virtual machine that can be used for web development in as long as it takes to compile and install all the software. No extra configuration is needed…
This VM will have software, including:
\* Ubuntu 12.04 Precise, see [vagrantbox.es](http://vagrantbox.es) for other Linux versions
\* Ruby 2 and 1.9 with rbenv
\* Elasticsearch
\* Percona MySQL
\* git and some other tools