|
@@ -4,65 +4,135 @@
|
|
|
BOX_NAME = ENV['BOX_NAME'] || "ubuntu"
|
|
|
BOX_URI = ENV['BOX_URI'] || "http://files.vagrantup.com/precise64.box"
|
|
|
VF_BOX_URI = ENV['BOX_URI'] || "http://files.vagrantup.com/precise64_vmware_fusion.box"
|
|
|
+AWS_BOX_URI = ENV['BOX_URI'] || "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
|
|
|
AWS_REGION = ENV['AWS_REGION'] || "us-east-1"
|
|
|
-AWS_AMI = ENV['AWS_AMI'] || "ami-d0f89fb9"
|
|
|
+AWS_AMI = ENV['AWS_AMI'] || "ami-69f5a900"
|
|
|
+AWS_INSTANCE_TYPE = ENV['AWS_INSTANCE_TYPE'] || 't1.micro'
|
|
|
+
|
|
|
FORWARD_DOCKER_PORTS = ENV['FORWARD_DOCKER_PORTS']
|
|
|
|
|
|
+SSH_PRIVKEY_PATH = ENV["SSH_PRIVKEY_PATH"]
|
|
|
+
|
|
|
+# A script to upgrade from the 12.04 kernel to the raring backport kernel (3.8)
|
|
|
+# and install docker.
|
|
|
+$script = <<SCRIPT
|
|
|
+# The username to add to the docker group will be passed as the first argument
|
|
|
+# to the script. If nothing is passed, default to "vagrant".
|
|
|
+user="$1"
|
|
|
+if [ -z "$user" ]; then
|
|
|
+ user=vagrant
|
|
|
+fi
|
|
|
+
|
|
|
+# Adding an apt gpg key is idempotent.
|
|
|
+wget -q -O - https://get.docker.io/gpg | apt-key add -
|
|
|
+
|
|
|
+# Creating the docker.list file is idempotent, but it may overrite desired
|
|
|
+# settings if it already exists. This could be solved with md5sum but it
|
|
|
+# doesn't seem worth it.
|
|
|
+echo 'deb http://get.docker.io/ubuntu docker main' > \
|
|
|
+ /etc/apt/sources.list.d/docker.list
|
|
|
+
|
|
|
+# Update remote package metadata. 'apt-get update' is idempotent.
|
|
|
+apt-get update -q
|
|
|
+
|
|
|
+# Install docker. 'apt-get install' is idempotent.
|
|
|
+apt-get install -q -y lxc-docker
|
|
|
+
|
|
|
+usermod -a -G docker "$user"
|
|
|
+
|
|
|
+tmp=`mktemp -q` && {
|
|
|
+ # Only install the backport kernel, don't bother upgrade if the backport is
|
|
|
+ # already installed. We want parse the output of apt so we need to save it
|
|
|
+ # with 'tee'. NOTE: The installation of the kernel will trigger dkms to
|
|
|
+ # install vboxguest if needed.
|
|
|
+ apt-get install -q -y --no-upgrade linux-image-generic-lts-raring | \
|
|
|
+ tee "$tmp"
|
|
|
+
|
|
|
+ # Parse the number of installed packages from the output
|
|
|
+ NUM_INST=`awk '$2 == "upgraded," && $4 == "newly" { print $3 }' "$tmp"`
|
|
|
+ rm "$tmp"
|
|
|
+}
|
|
|
+
|
|
|
+# If the number of installed packages is greater than 0, we want to reboot (the
|
|
|
+# backport kernel was installed but is not running).
|
|
|
+if [ "$NUM_INST" -gt 0 ];
|
|
|
+then
|
|
|
+ echo "Rebooting down to activate new kernel."
|
|
|
+ echo "/vagrant will not be mounted. Use 'vagrant halt' followed by"
|
|
|
+ echo "'vagrant up' to ensure /vagrant is mounted."
|
|
|
+ shutdown -r now
|
|
|
+fi
|
|
|
+SCRIPT
|
|
|
+
|
|
|
+# We need to install the virtualbox guest additions *before* we do the normal
|
|
|
+# docker installation. As such this script is prepended to the common docker
|
|
|
+# install script above. This allows the install of the backport kernel to
|
|
|
+# trigger dkms to build the virtualbox guest module install.
|
|
|
+$vbox_script = <<VBOX_SCRIPT + $script
|
|
|
+# Install the VirtualBox guest additions if they aren't already installed.
|
|
|
+if [ ! -d /opt/VBoxGuestAdditions-4.2.12/ ]; then
|
|
|
+ # Update remote package metadata. 'apt-get update' is idempotent.
|
|
|
+ apt-get update -q
|
|
|
+
|
|
|
+ # Kernel Headers and dkms are required to build the vbox guest kernel
|
|
|
+ # modules.
|
|
|
+ apt-get install -q -y linux-headers-generic-lts-raring dkms
|
|
|
+
|
|
|
+ echo 'Downloading VBox Guest Additions...'
|
|
|
+ wget -cq http://dlc.sun.com.edgesuite.net/virtualbox/4.2.12/VBoxGuestAdditions_4.2.12.iso
|
|
|
+
|
|
|
+ mount -o loop,ro /home/vagrant/VBoxGuestAdditions_4.2.12.iso /mnt
|
|
|
+ /mnt/VBoxLinuxAdditions.run --nox11
|
|
|
+ umount /mnt
|
|
|
+fi
|
|
|
+VBOX_SCRIPT
|
|
|
+
|
|
|
Vagrant::Config.run do |config|
|
|
|
# Setup virtual machine box. This VM configuration code is always executed.
|
|
|
config.vm.box = BOX_NAME
|
|
|
config.vm.box_url = BOX_URI
|
|
|
|
|
|
- config.ssh.forward_agent = true
|
|
|
-
|
|
|
- # Provision docker and new kernel if deployment was not done.
|
|
|
- # It is assumed Vagrant can successfully launch the provider instance.
|
|
|
- if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty?
|
|
|
- # Add lxc-docker package
|
|
|
- pkg_cmd = "wget -q -O - https://get.docker.io/gpg | apt-key add -;" \
|
|
|
- "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list;" \
|
|
|
- "apt-get update -qq; apt-get install -q -y --force-yes lxc-docker; "
|
|
|
- # Add Ubuntu raring backported kernel
|
|
|
- pkg_cmd << "apt-get update -qq; apt-get install -q -y linux-image-generic-lts-raring; "
|
|
|
- # Add guest additions if local vbox VM. As virtualbox is the default provider,
|
|
|
- # it is assumed it won't be explicitly stated.
|
|
|
- if ENV["VAGRANT_DEFAULT_PROVIDER"].nil? && ARGV.none? { |arg| arg.downcase.start_with?("--provider") }
|
|
|
- pkg_cmd << "apt-get install -q -y linux-headers-generic-lts-raring dkms; " \
|
|
|
- "echo 'Downloading VBox Guest Additions...'; " \
|
|
|
- "wget -q http://dlc.sun.com.edgesuite.net/virtualbox/4.2.12/VBoxGuestAdditions_4.2.12.iso; "
|
|
|
- # Prepare the VM to add guest additions after reboot
|
|
|
- pkg_cmd << "echo -e 'mount -o loop,ro /home/vagrant/VBoxGuestAdditions_4.2.12.iso /mnt\n" \
|
|
|
- "echo yes | /mnt/VBoxLinuxAdditions.run\numount /mnt\n" \
|
|
|
- "rm /root/guest_additions.sh; ' > /root/guest_additions.sh; " \
|
|
|
- "chmod 700 /root/guest_additions.sh; " \
|
|
|
- "sed -i -E 's#^exit 0#[ -x /root/guest_additions.sh ] \\&\\& /root/guest_additions.sh#' /etc/rc.local; " \
|
|
|
- "echo 'Installation of VBox Guest Additions is proceeding in the background.'; " \
|
|
|
- "echo '\"vagrant reload\" can be used in about 2 minutes to activate the new guest additions.'; "
|
|
|
- end
|
|
|
- # Add vagrant user to the docker group
|
|
|
- pkg_cmd << "usermod -a -G docker vagrant; "
|
|
|
- # Activate new kernel
|
|
|
- pkg_cmd << "shutdown -r +1; "
|
|
|
- config.vm.provision :shell, :inline => pkg_cmd
|
|
|
+ # Use the specified private key path if it is specified and not empty.
|
|
|
+ if SSH_PRIVKEY_PATH
|
|
|
+ config.ssh.private_key_path = SSH_PRIVKEY_PATH
|
|
|
end
|
|
|
-end
|
|
|
|
|
|
+ config.ssh.forward_agent = true
|
|
|
+end
|
|
|
|
|
|
# Providers were added on Vagrant >= 1.1.0
|
|
|
+#
|
|
|
+# NOTE: The vagrant "vm.provision" appends its arguments to a list and executes
|
|
|
+# them in order. If you invoke "vm.provision :shell, :inline => $script"
|
|
|
+# twice then vagrant will run the script two times. Unfortunately when you use
|
|
|
+# providers and the override argument to set up provisioners (like the vbox
|
|
|
+# guest extensions) they 1) don't replace the other provisioners (they append
|
|
|
+# to the end of the list) and 2) you can't control the order the provisioners
|
|
|
+# are executed (you can only append to the list). If you want the virtualbox
|
|
|
+# only script to run before the other script, you have to jump through a lot of
|
|
|
+# hoops.
|
|
|
+#
|
|
|
+# Here is my only repeatable solution: make one script that is common ($script)
|
|
|
+# and another script that is the virtual box guest *prepended* to the common
|
|
|
+# script. Only ever use "vm.provision" *one time* per provider. That means
|
|
|
+# every single provider has an override, and every single one configures
|
|
|
+# "vm.provision". Much saddness, but such is life.
|
|
|
Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
|
|
|
config.vm.provider :aws do |aws, override|
|
|
|
- aws.access_key_id = ENV["AWS_ACCESS_KEY_ID"]
|
|
|
- aws.secret_access_key = ENV["AWS_SECRET_ACCESS_KEY"]
|
|
|
+ username = "ubuntu"
|
|
|
+ override.vm.box_url = AWS_BOX_URI
|
|
|
+ override.vm.provision :shell, :inline => $script, :args => username
|
|
|
+ aws.access_key_id = ENV["AWS_ACCESS_KEY"]
|
|
|
+ aws.secret_access_key = ENV["AWS_SECRET_KEY"]
|
|
|
aws.keypair_name = ENV["AWS_KEYPAIR_NAME"]
|
|
|
- override.ssh.private_key_path = ENV["AWS_SSH_PRIVKEY"]
|
|
|
- override.ssh.username = "ubuntu"
|
|
|
+ override.ssh.username = username
|
|
|
aws.region = AWS_REGION
|
|
|
aws.ami = AWS_AMI
|
|
|
- aws.instance_type = "t1.micro"
|
|
|
+ aws.instance_type = AWS_INSTANCE_TYPE
|
|
|
end
|
|
|
|
|
|
- config.vm.provider :rackspace do |rs|
|
|
|
- config.ssh.private_key_path = ENV["RS_PRIVATE_KEY"]
|
|
|
+ config.vm.provider :rackspace do |rs, override|
|
|
|
+ override.vm.provision :shell, :inline => $script
|
|
|
rs.username = ENV["RS_USERNAME"]
|
|
|
rs.api_key = ENV["RS_API_KEY"]
|
|
|
rs.public_key_path = ENV["RS_PUBLIC_KEY"]
|
|
@@ -71,20 +141,25 @@ Vagrant::VERSION >= "1.1.0" and Vagrant.configure("2") do |config|
|
|
|
end
|
|
|
|
|
|
config.vm.provider :vmware_fusion do |f, override|
|
|
|
- override.vm.box = BOX_NAME
|
|
|
override.vm.box_url = VF_BOX_URI
|
|
|
override.vm.synced_folder ".", "/vagrant", disabled: true
|
|
|
+ override.vm.provision :shell, :inline => $script
|
|
|
f.vmx["displayName"] = "docker"
|
|
|
end
|
|
|
|
|
|
- config.vm.provider :virtualbox do |vb|
|
|
|
- config.vm.box = BOX_NAME
|
|
|
- config.vm.box_url = BOX_URI
|
|
|
+ config.vm.provider :virtualbox do |vb, override|
|
|
|
+ override.vm.provision :shell, :inline => $vbox_script
|
|
|
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
|
|
|
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
|
|
|
end
|
|
|
end
|
|
|
|
|
|
+# If this is a version 1 config, virtualbox is the only option. A version 2
|
|
|
+# config would have already been set in the above provider section.
|
|
|
+Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config|
|
|
|
+ config.vm.provision :shell, :inline => $vbox_script
|
|
|
+end
|
|
|
+
|
|
|
if !FORWARD_DOCKER_PORTS.nil?
|
|
|
Vagrant::VERSION < "1.1.0" and Vagrant::Config.run do |config|
|
|
|
(49000..49900).each do |port|
|