From 15619449677a8f546959008296215ed144a38677 Mon Sep 17 00:00:00 2001 From: Fabio Rehm Date: Sun, 21 Apr 2013 21:31:22 -0300 Subject: [PATCH] Begin to rework box packaging tasks --- boxes/ubuntu/download | 102 ++++++++++++++++++++++++++++++++++++ boxes/ubuntu/install-chef | 14 +++++ boxes/ubuntu/install-puppet | 12 +++++ tasks/boxes.rake | 64 +++++++++++++++++----- 4 files changed, 178 insertions(+), 14 deletions(-) create mode 100755 boxes/ubuntu/download create mode 100755 boxes/ubuntu/install-chef create mode 100755 boxes/ubuntu/install-puppet diff --git a/boxes/ubuntu/download b/boxes/ubuntu/download new file mode 100755 index 0000000..9766030 --- /dev/null +++ b/boxes/ubuntu/download @@ -0,0 +1,102 @@ +#!/bin/bash + +# This is the code extracted from /usr/share/lxc/templates/lxc-ubuntu +# that comes with Ubuntu 12.10 which is responsible for downloading the +# rootfs files / packages + +set -e + +suggest_flush() +{ + echo "Container upgrade failed. The container cache may be out of date," + echo "in which case flushing the case (see -F in the hep output) may help." +} + +cleanup() +{ + rm -rf $cache/partial + rm -rf $cache/rootfs +} + +write_sourceslist() +{ + # $1 => path to the rootfs + + MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu} + SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu} + + cat >> "$1/etc/apt/sources.list" << EOF +deb $MIRROR ${release} main restricted universe multiverse +deb $MIRROR ${release}-updates main restricted universe multiverse +deb $SECURITY_MIRROR ${release}-security main restricted universe multiverse +EOF +} + +download_ubuntu() +{ + packages=vim,ssh,curl,wget,bash-completion,manpages,man-db,psmisc + echo "installing packages: $packages" + + trap cleanup EXIT SIGHUP SIGINT SIGTERM + # check the mini ubuntu was not already downloaded + mkdir -p "$cache/partial" + if [ $? -ne 0 ]; then + echo "Failed to create '$cache/partial' directory" + return 1 + fi + + # download a mini ubuntu into a cache + echo "Downloading ubuntu $release minimal ..." + if [ -n "$(which qemu-debootstrap)" ]; then + qemu-debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial $MIRROR + else + debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial $MIRROR + fi + + if [ $? -ne 0 ]; then + echo "Failed to download the rootfs, aborting." + return 1 + fi + + # Serge isn't sure whether we should avoid doing this when + # $release == `distro-info -d` + echo "Installing updates" + > $cache/partial/etc/apt/sources.list + write_sourceslist $cache/partial/ $arch + + chroot "$1/partial" apt-get update + if [ $? -ne 0 ]; then + echo "Failed to update the apt cache" + return 1 + fi + cat > "$1/partial"/usr/sbin/policy-rc.d << EOF +#!/bin/sh +exit 101 +EOF + chmod +x "$1/partial"/usr/sbin/policy-rc.d + + lxc-unshare -s MOUNT -- chroot "$1/partial" apt-get dist-upgrade -y || { suggest_flush; false; } + + rm -f "$1/partial"/usr/sbin/policy-rc.d + + chroot "$1/partial" apt-get clean + + mv "$1/partial" "$1/rootfs" + trap EXIT + trap SIGINT + trap SIGTERM + trap SIGHUP + echo "Download complete" + return 0 +} + +declare cache=`readlink -f .` \ + arch=$1 \ + release=$2 + +if [ -d "${cache}/rootfs" ]; then + echo 'The rootfs cache has been built already, please remove it if you want to update' + exit 1 +fi + +download_ubuntu $cache $arch $release diff --git a/boxes/ubuntu/install-chef b/boxes/ubuntu/install-chef new file mode 100755 index 0000000..55fd5e3 --- /dev/null +++ b/boxes/ubuntu/install-chef @@ -0,0 +1,14 @@ +#!/bin/bash + +cache=`readlink -f .` +rootfs="${cache}/rootfs" + +echo "installing chef" +cat > $rootfs/tmp/install-chef.sh << EOF +#!/bin/sh +curl -L https://www.opscode.com/chef/install.sh -k | sudo bash +EOF +chmod +x $rootfs/tmp/install-chef.sh +chroot $rootfs /tmp/install-chef.sh + +rm -rf $rootfs/tmp/* diff --git a/boxes/ubuntu/install-puppet b/boxes/ubuntu/install-puppet new file mode 100755 index 0000000..7055b48 --- /dev/null +++ b/boxes/ubuntu/install-puppet @@ -0,0 +1,12 @@ +#!/bin/bash + +cache=`readlink -f .` +rootfs="${cache}/rootfs" + +echo "installing puppet" +wget http://apt.puppetlabs.com/puppetlabs-release-stable.deb -O "${rootfs}/tmp/puppetlabs-release-stable.deb" +chroot $rootfs dpkg -i "/tmp/puppetlabs-release-stable.deb" +chroot $rootfs apt-get update +chroot $rootfs apt-get install puppet -y + +rm -rf $rootfs/tmp/* diff --git a/tasks/boxes.rake b/tasks/boxes.rake index 0aadd7c..3dd9688 100644 --- a/tasks/boxes.rake +++ b/tasks/boxes.rake @@ -1,18 +1,54 @@ -namespace :boxes do - namespace :quantal64 do - desc 'Build Ubuntu Quantal 64 bits Vagrant LXC box' - task :build do - if File.exists?('./boxes/output/lxc-quantal64.box') - puts 'Box has been built already!' - exit 1 - end +require 'rake/tasklib' - sh 'mkdir -p boxes/output' - sh 'cd boxes/quantal64 && sudo ./download-ubuntu' - sh 'rm -f boxes/quantal64/rootfs.tar.gz' - sh 'cd boxes/quantal64 && sudo tar --numeric-owner -czf rootfs.tar.gz ./rootfs/*' - sh 'cd boxes/quantal64 && sudo rm -rf rootfs' - sh "cd boxes/quantal64 && sudo chown #{ENV['USER']}:#{ENV['USER']} rootfs.tar.gz && tar -czf ../output/lxc-quantal64.box ./* --exclude=download-ubuntu" +class BuildUbuntuBoxTask < ::Rake::TaskLib + include ::Rake::DSL + + attr_reader :name + + def initialize(name, release, arch, opts = {}) + @name = name + @release = release + @arch = arch + @chef = opts[:chef] + @puppet = opts[:puppet] + @file = opts[:file] || "lxc-#{@release}-#{@arch}.box" + + desc "Build an Ubuntu #{release} #{arch} box" unless ::Rake.application.last_comment + task name do + RakeFileUtils.send(:verbose, true) do + run_task + end + end + end + + def run_task + puts "./boxes/output/#{@file}" + if File.exists?("./boxes/output/#{@file}") + puts 'Box has been built already!' + exit 1 + end + + sh 'mkdir -p boxes/temp/' + Dir.chdir 'boxes/temp' do + sh "sudo ../ubuntu/download #{@arch} #{@release}" + sh "sudo ../ubuntu/install-puppet" + sh "sudo ../ubuntu/install-chef" + #sh 'rm -f rootfs.tar.gz' + #sh 'sudo tar --numeric-owner -czf rootfs.tar.gz ./rootfs/*' + #sh 'sudo rm -rf rootfs' + #sh "sudo chown #{ENV['USER']}:#{ENV['USER']} rootfs.tar.gz && tar -czf tmp-package.box ./*" + end + end +end + +namespace :boxes do + namespace :ubuntu do + namespace :build do + desc 'Build an Ubuntu Quantal 64 bits box with puppet and chef installed' + BuildUbuntuBoxTask.new(:quantal64, :quantal, 'amd64') + + desc 'Build an Ubuntu Raring 64 bits box with puppet and chef installed' + BuildUbuntuBoxTask.new(:raring64, :raring, 'amd64') end end end