#!/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 # It also installs puppet and chef on the container 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=amd64 \ release=quantal 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 rootfs="${cache}/rootfs" echo "installing puppet" wget http://apt.puppetlabs.com/puppetlabs-release-precise.deb -O "${rootfs}/tmp/puppetlabs-release-${release}.deb" chroot $rootfs dpkg -i "/tmp/puppetlabs-release-${release}.deb" chroot $rootfs apt-get update chroot $rootfs apt-get install puppet -y 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/*