Skip to content

Instantly share code, notes, and snippets.

@mrnugget
Created May 23, 2012 15:59
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mrnugget/2776089 to your computer and use it in GitHub Desktop.
Save mrnugget/2776089 to your computer and use it in GitHub Desktop.
Vagrant Post-Install
# **postinstall.sh** is a script executed after Debian/Ubuntu has been
# installed and restarted. There is no user interaction so all commands must
# be able to run in a non-interactive mode.
#
# If any package install time questions need to be set, you can use
# `preeseed.cfg` to populate the settings.
### Setup Variables
# The version of Ruby to be installed supporting the Chef and Puppet gems
ruby_ver="1.8.7-p358"
# The base path to the Ruby used for the Chef and Puppet gems
ruby_home="/opt/vagrant_ruby"
# The non-root user that will be created. By vagrant conventions, this should
# be `"vagrant"`.
account="vagrant"
# Enable truly non interactive apt-get installs
export DEBIAN_FRONTEND=noninteractive
# Determine the platform (i.e. Debian or Ubuntu) and platform version
platform="$(lsb_release -i -s)"
platform_version="$(lsb_release -s -r)"
# Run the script in debug mode
set -x
### Customize Sudoers
# The main user (`vagrant` in our case) needs to have **password-less** sudo
# access as described in the Vagrant base box
# [documentation](http://vagrantup.com/docs/base_boxes.html#setup_permissions).
# This user belongs to the `admin`/`sudo` group, so we'll change that line.
sed -i -e '/Defaults\s\+env_reset/a Defaults\texempt_group=admin' /etc/sudoers
case "$platform" in
Debian)
sed -i -e 's/%sudo ALL=(ALL) ALL/%sudo ALL=(ALL) NOPASSWD:ALL/g' /etc/sudoers
;;
Ubuntu)
groupadd -r admin || true
usermod -a -G admin $account
sed -i -e 's/%admin ALL=(ALL) ALL/%admin ALL=(ALL) NOPASSWD:ALL/g' /etc/sudoers
;;
esac
### Installing Ruby
#### Compiling Ruby
# The choice was made by the Vagrant and VeeWee authors to compile a Ruby from
# source so that the user of this base box can install their own Rubies using
# packages, RVM, source, etc. It will be installed into $ruby_home so as not
# to collide with /usr/local.
#
# Currently we must install Ruby 1.8 since Puppet doesn't fully support Ruby
# 1.9 yet.
# Install packages necessary to compile Ruby from source
case "$platform" in
Debian)
apt-get -y install build-essential zlib1g-dev libssl-dev \
libreadline5-dev make curl git-core
;;
Ubuntu)
apt-get -y install build-essential zlib1g-dev libssl-dev \
libreadline-dev make curl git-core
;;
esac
# Use ruby-build to install Ruby
clone_dir=/tmp/ruby-build-$$
git clone https://github.com/sstephenson/ruby-build.git $clone_dir
$clone_dir/bin/ruby-build "$ruby_ver" "$ruby_home"
rm -rf $clone_dir
unset clone_dir
### Installing Chef and Puppet Gems
# Install prerequisite gems used by Chef and Puppet
${ruby_home}/bin/gem install polyglot net-ssh-gateway mime-types --no-ri --no-rdoc
# The Vagrant base box
# [documentation](http://vagrantup.com/docs/base_boxes.html#boot_and_setup_basic_software)
# specifies that both the Puppet and Chef gems should be installed to qualify
# as a complete Vagrant base box.
${ruby_home}/bin/gem install chef --no-ri --no-rdoc
${ruby_home}/bin/gem install puppet --no-ri --no-rdoc
# Add the Puppet group so Puppet runs without issue
groupadd puppet
# If a packaged Ruby or RVM is installed then the path to the Chef and Puppet
# binaries will be "lost". To guard against this, we'll add the compiled Ruby's
# bin directory to PATH.
echo "PATH=\$PATH:${ruby_home}/bin" >/etc/profile.d/vagrant_ruby.sh
### Vagrant SSH Keys
# Since Vagrant only supports key-based authentication for SSH, we must
# set up the vagrant user to use key-based authentication. We can get the
# public key used by the Vagrant gem directly from its Github repository.
vssh="/home/${account}/.ssh"
mkdir -p $vssh
chmod 700 $vssh
(cd $vssh &&
wget --no-check-certificate \
'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' \
-O $vssh/authorized_keys)
chmod 0600 $vssh/authorized_keys
chown -R ${account}:vagrant $vssh
unset vssh
### VirtualBox Guest Additions
# The netboot installs the VirtualBox support (old) so we have to remove it
apt-get -y remove virtualbox-ose-guest-dkms
apt-get -y remove virtualbox-ose-guest-utils
# The Guest Additions installer will require the use of the linux headers, so
# we'll install it for the moment
apt-get -y install linux-headers-$(uname -r)
# Now use the current VirtualBox guest additions that VeeWee uploaded, mount,
# and install it
VBOX_VERSION=$(cat /home/${account}/.vbox_version)
mount -o loop /home/$account/VBoxGuestAdditions_$VBOX_VERSION.iso /mnt
yes|sh /mnt/VBoxLinuxAdditions.run
umount /mnt
# Cleanup the downloaded ISO
rm -f /home/$account/VBoxGuestAdditions_$VBOX_VERSION.iso
# Remove the linux headers to keep things pristine
apt-get -y remove linux-headers-$(uname -r)
### Misc. Tweaks
# Install NFS client
apt-get -y install nfs-common
# Tweak sshd to prevent DNS resolution (speed up logins)
echo 'UseDNS no' >> /etc/ssh/sshd_config
# Customize the message of the day
case "$platform" in
Debian)
echo 'Welcome to your Vagrant-built virtual machine.' > /var/run/motd
;;
Ubuntu)
echo 'Welcome to your Vagrant-built virtual machine.' > /etc/motd.tail
;;
esac
# Record when the basebox was built
date > /etc/vagrant_box_build_time
### Clean up
# Remove the build tools to keep things pristine
apt-get -y remove build-essential make curl git-core
apt-get -y autoremove
apt-get -y clean
# Removing leftover leases and persistent rules
rm -f /var/lib/dhcp3/*
# Make sure Udev doesn't block our network, see: http://6.ptmc.org/?p=164
rm /etc/udev/rules.d/70-persistent-net.rules
mkdir /etc/udev/rules.d/70-persistent-net.rules
rm -rf /dev/.udev/
rm /lib/udev/rules.d/75-persistent-net-generator.rules
# Add a 2 sec delay to the interface up, to make the dhclient happy
echo "pre-up sleep 2" >> /etc/network/interfaces
# Remove any temporary work files, including the postinstall.sh script
rm -f /home/${account}/{*.iso,postinstall*.sh}
### Compress Image Size
# Zero out the free space to save space in the final image
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
exit
# And we're done.
@gvt
Copy link

gvt commented Jun 21, 2013

super helpful. thanks for posting

@mmbrian
Copy link

mmbrian commented Sep 25, 2013

thank you so much for sharing this here! saved my day!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment