Having seen this blog post about setting up a development Linux VM in a recent Morning Brew, I had to have a shot at doing it all in a script instead, since it looked like an awful lot of hard work to do it manually.
The post I read covers downloading and installing VirtualBox (which could be scripted also, using the amazing Chocolatey) and then installing Ubuntu, logging in to the VM, downloading and installing Chrome, SublimeText2, MonogDB, Robomongo, NodeJs, NPM, nodemon, and mocha.
Since all of this can be handled via apt-get and a few other cunning configs, here’s my attempt using Vagrant. Firstly, vagrant init a directory, then paste the following into the Vagrantfile:
Vagrantfile
Vagrant.configure(2) do |config| config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" end
Setup script
Now create new file in the same dir as the Vagrantfile (since this directory is automatically configured as a shared folder, saving you ONE ENTIRE LINE OF CONFIGURATION), calling it something like set_me_up.sh. I apologise for the constant abuse of > /dev/null – I just liked having a clear screen sometimes..:
#!/bin/sh clear echo "******************************************************************************" echo "Don't go anywhere - I'm going to need your input shortly.." read -p "[Enter to continue]" ### Set up dependencies # Configure sources & repos echo "** Updating apt-get" sudo apt-get update -y > /dev/null echo "** Installing prerequisites" sudo apt-get install libexpat1-dev libicu-dev git build-essential curl software-properties-common python-software-properties -y > /dev/null ### deal with intereactive stuff first ## needs someone to hit "enter" echo "** Adding a new repo ref - hit Enter" sudo add-apt-repository ppa:webupd8team/sublime-text-2 echo "** Creating a new user; enter some details" ## needs someone to enter user details sudo adduser developer echo "******************************************************************************" echo "OK! All done, now it's the unattended stuff. Go make coffee. Bring me one too." read -p "[Enter to continue]" ### Now the unattended stuff can kick off # For mongo db - http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ echo "** More prerequisites for mongo and chrome" sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 > /dev/null sudo sh -c 'echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee /etc/apt/sources.list.d/mongodb.list' > /dev/null # For chrome - http://ubuntuforums.org/showthread.php?t=1351541 wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - echo "** Updating apt-get again" sudo apt-get update -y > /dev/null ## Go, go, gadget installations! # chrome echo "** Installing Chrome" sudo apt-get install google-chrome-stable -y > /dev/null # sublime-text echo "** Installing sublimetext" sudo apt-get install sublime-text -y > /dev/null # mongo-db echo "** Installing mongodb" sudo apt-get install mongodb-10gen -y > /dev/null # desktop! echo "** Installing ubuntu-desktop" sudo apt-get install ubuntu-desktop -y > /dev/null # node - the right(?) way! # http://www.joyent.com/blog/installing-node-and-npm # https://gist.github.com/isaacs/579814 echo "** Installing node" echo 'export "PATH=$HOME/local/bin:$PATH"' >> ~/.bashrc . ~/.bashrc mkdir ~/local mkdir ~/node-latest-install cd ~/node-latest-install curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1 ./configure --prefix=~/local make install # other node goodies sudo npm install nodemon > /dev/null sudo npm install mocha > /dev/null ## shutdown message (need to start from VBox now we have a desktop env) echo "******************************************************************************" echo "**** All good - now quitting. Run *vagrant halt* then restart from VBox to go to desktop ****" read -p "[Enter to shutdown]" sudo shutdown 0
The gist is here, should you want to fork and edit it.
You can now open a prompt in that directory and run
vagrant up && vagrant ssh
which will provision your VM and ssh into it. Once connected, just execute the script by running:
. /vagrant/set_me_up.sh
(/vagrant is the shared directory created for you by default)
Nitty Gritty
Let’s break this up a bit. First up, I decided to group together all of the apt-get configuration so I didn’t need to keep calling apt-get update after each reconfiguration:
# Configure sources & repos echo "** Updating apt-get" sudo apt-get update -y > /dev/null echo "** Installing prerequisites" sudo apt-get install libexpat1-dev libicu-dev git build-essential curl software-properties-common python-software-properties -y > /dev/null ### deal with intereactive stuff first ## needs someone to hit "enter" echo "** Adding a new repo ref - hit Enter" sudo add-apt-repository ppa:webupd8team/sublime-text-2
Then I decided to set up a new user, since you will be left with either the vagrant user or a guest user once this script has completed; and the vagrant one doesn’t have a desktop/home nicely configured for it. So let’s create our own one right now:
echo "** Creating a new user; enter some details" ## needs someone to enter user details sudo adduser developer echo "******************************************************************************" echo "OK! All done, now it's the unattended stuff. Go make coffee. Bring me one too." read -p "[Enter to continue]"
Ok, now the interactive stuff is done, let’s get down to the installation guts:
### Now the unattended stuff can kick off # For mongo db - http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ echo "** More prerequisites for mongo and chrome" sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 > /dev/null sudo sh -c 'echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee /etc/apt/sources.list.d/mongodb.list' > /dev/null # For chrome - http://ubuntuforums.org/showthread.php?t=1351541 wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - echo "** Updating apt-get again" sudo apt-get update -y > /dev/null
Notice the URLs in there referencing where I found out the details for each section.
The only reason these config sections are not at the top with the others is that they can take a WHILE and I don’t want the user to have to wait too long before creating a user and being told they can go away. Now we’re all configured, let’s get installing!
## Go, go, gadget installations! # chrome echo "** Installing Chrome" sudo apt-get install google-chrome-stable -y > /dev/null # sublime-text echo "** Installing sublimetext" sudo apt-get install sublime-text -y > /dev/null # mongo-db echo "** Installing mongodb" sudo apt-get install mongodb-10gen -y > /dev/null # desktop! echo "** Installing ubuntu-desktop" sudo apt-get install ubuntu-desktop -y > /dev/null
Pretty easy so far, right? ‘Course it is. Now let’s install nodejs on linux the – apparently – correct way. Well it works better than compiling from source or apt-getting it.
# node - the right(?) way! # http://www.joyent.com/blog/installing-node-and-npm # https://gist.github.com/isaacs/579814 echo "** Installing node" echo 'export "PATH=$HOME/local/bin:$PATH"' >> ~/.bashrc . ~/.bashrc mkdir ~/local mkdir ~/node-latest-install cd ~/node-latest-install curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1 ./configure --prefix=~/local make install
Now let’s finish up with a couple of nodey lovelies:
# other node goodies sudo npm install nodemon > /dev/null sudo npm install mocha > /dev/null
All done! Then it’s just a case of vagrant halting the VM and restarting from Virtualbox (or edit the Vagrantfile to include a line about booting to GUI); you’ll be booted into an Ubuntu desktop login. Use the newly created user to log in and BEHOLD THE AWE.
Enough EPICNESS, now the FAIL…
Robomongo Fail 🙁
The original post also installs Robomongo for mongodb administration, but I just couldn’t get that running from a script. Booo! Here’s the script that should have worked; please have a crack and try to sort it out! qt5 fails to install for me which then causes everything else to bomb out.
# robomongo INSTALL_DIR=$HOME/opt TEMP_DIR=$HOME/tmp # doesn't work sudo apt-get install -y git qt5-default qt5-qmake scons cmake # Get the source code from Git. Perform a shallow clone to reduce download time. mkdir -p $TEMP_DIR cd $TEMP_DIR sudo git clone --depth 1 https://github.com/paralect/robomongo.git # Compile the source. sudo mkdir -p robomongo/target cd robomongo/target sudo cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR make make install # As of the time of this writing, the Robomongo makefile doesn't actually # install into the specified install prefix, so we have to install it manually. mkdir -p $INSTALL_DIR mv install $INSTALL_DIR/robomongo mkdir -p $HOME/bin ln -s $INSTALL_DIR/robomongo/bin/robomongo.sh $HOME/bin/robomongo # Clean up. rm -rf $TEMP_DIR/robomongo
Not only is there the gist, but the whole shebang is over on github too.
ENJOOOYYYYY!
FWIW you can get rid of the last two interactive bits like so:
sudo adduser --quiet --gecos ''
sudo add-apt-repository -y
I have literally no idea why the flag to enter blank user info is called “gecos” and I refuse to find out. 🙂
You can also configure Vagrant to automatically run your provisioning script:
config.vm.provision :shell do |s|
s.path = "path/to/bootstrap/script"
end
Then it’s just “vagrant up” (or “vagrant provision” if the box is already running), no need to ssh in.
Blast, tag stripping has removed two things, that should have read:
sudo adduser --quiet --gecos '' [username]
sudo add-apt-repository -y [repo]