vagrant-lxc用のCentOS Boxを自作する方法
前回の内容(vagrant-lxcで軽量仮想環境を手に入れる)の続きです。 VagrantではあらかじめBoxと呼ばれる仮想マシンの雛形を用意しておいて、起動時にそれを複製して環境を用意します。したがってLXCとVagrantを組み合わせた場合でも当然のことながらBoxが必要となります。前回の記事ではBoxは公開されているものを使いましたが、今回はBoxを自分で作成する方法を説明します。なお、Boxの作成方法はvagrant-lxcの配布物に含まれているubuntuなどのBox作成のスクリプトをかなり参考にしています。
事前準備:LXCでCentOSを利用できるようにする
vagrant-lxcで利用するBoxの作成では、LXCで先に元となるOSの環境を作成できるようにする必要があります(なのでLXCを母艦にインストールしてください。必然的に環境はUbuntu系のディストリビューションに限られます。ただしVirtualBoxを使ってUbuntuの環境を作っても問題ありません。Amazon EC2上にUbuntu環境を作成しても大丈夫です)。今回はCentOSの環境を作ります。が、標準ではLXCの配布物の中に含まれているのは、Ubuntu、Fedora、OpenSuseなどで、CentOSは含まれていません(標準で何が用意されているかは/usr/lib/lxc/templatesをみてください)ので、LXC用のテンプレートを入手します。sudo wget -O /usr/lib/lxc/templates/lxc-centos \
https://gist.github.com/hagix9/3514296/raw/7f6bb4e291fad1dad59a49a5c02f78642bb99a45/lxc-centos
またこのファイルには実行権限を付与しておきます。
sudo chmod 755 /usr/lib/lxc/templates/lxc-centos
次に、母艦(Ubuntu系OS)からyumコマンドなど複数のコマンドを実行するため、以下のようにインストールします。
sudo apt-get install yum curl wget
作成
ここから先はスクリプトを用意しておきました。こちらから入手してください。 やっていることの概要は以下のとおりです。- lxc-createコマンドを使ってCentOS環境を作成する
- vagrantユーザーを作成して公開鍵の設定やsudoの設定などを行う
- 追加で最低限必要なパッケージを入れる
- Chefをインストールする
- LXCのファイルシステム領域をtarで固めてその他の必要なmetadataとともにアーカイブしてBox化する
- 後片付け
#!/bin/bash
set -e
NOW=$(date -u -R)
RELEASE=${1:-"6"}
RELEASE_MINOR=${2:-"4"}
ARCH=${3:-"x86_64"}
LXC_NAME=CentOS-${RELEASE}.${RELEASE_MINOR}
PKG=vagrant-lxc-${LXC_NAME}-${ARCH}-ja.box
WORKING_DIR=/tmp/vagrant-lxc-${LXC_NAME}
ROOTFS=/var/lib/lxc/${LXC_NAME}/rootfs
# Path to files bundled with the box
CWD=`readlink -f .`
LXC_TEMPLATE=${CWD}/common/lxc-template
LXC_CONF=${CWD}/common/lxc.conf
METATADA_JSON=${CWD}/common/metadata.json
# Set up a working dir
mkdir -p $WORKING_DIR
if [ -f "${WORKING_DIR}/${PKG}" ]; then
echo "Found a box on ${WORKING_DIR}/${PKG} already!"
exit 1
fi
## Create container
if $(lxc-ls | grep -q "${LXC_NAME}"); then
echo "Base container already exists, please remove it with \`lxc-destroy -n ${LXC_NAME}\`!"
exit 1
else
lxc-create -n ${LXC_NAME} -t centos -- --release ${RELEASE}
fi
# Fixes some networking issues
# See https://github.com/fgrehm/vagrant-lxc/issues/91 for more info
echo 'ff02::3 ip6-allhosts' >> ${ROOTFS}/etc/hosts
## Create vagrant user
chroot ${ROOTFS} /usr/sbin/groupadd vagrant
chroot ${ROOTFS} /usr/sbin/useradd vagrant -g vagrant -G wheel
echo -n 'vagrant:vagrant' | chroot ${ROOTFS} chpasswd
mkdir -p ${ROOTFS}/home/vagrant/.ssh
wget --no-check-certificate 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' \
-O ${ROOTFS}/home/vagrant/.ssh/authorized_keys
chroot ${ROOTFS} chown -R vagrant: /home/vagrant/.ssh
sed -i "s/#UseDNS yes/UseDNS no/" ${ROOTFS}/etc/ssh/sshd_config
echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> ${ROOTFS}/etc/sudoers.d/vagrant
chmod 0440 ${ROOTFS}/etc/sudoers.d/vagrant
sed -i "s/^.*requiretty/#Defaults requiretty/" ${ROOTFS}/etc/sudoers
## Additional packages and update
chroot ${ROOTFS} yum install -y vim curl wget tar
chroot ${ROOTFS} yum upgrade -y
## Installing Chef
chroot ${ROOTFS} curl -L http://www.opscode.com/chef/install.sh | chroot ${ROOTFS} bash
## Clean up on instance
rm -rf ${ROOTFS}/tmp/*
chroot ${ROOTFS} yum clean all
## Building box
# Compress container's rootfs
cd $(dirname $ROOTFS)
tar --numeric-owner -czf $WORKING_DIR/rootfs.tar.gz ./rootfs/*
# Prepare package contents
cd $WORKING_DIR
cp $LXC_TEMPLATE .
cp $LXC_CONF .
cp $METATADA_JSON .
chmod +x lxc-template
sed -i "s/<today>/${NOW}/" metadata.json
# Vagrant box
tar -czf $PKG ./*
chmod +rw ${WORKING_DIR}/${PKG}
mkdir -p ${CWD}/output
mv ${WORKING_DIR}/${PKG} ${CWD}/output
# Cleanup working directory and working instance
cd ${CWD}
rm -rf ${WORKING_DIR}
lxc-destroy -n ${LXC_NAME}
## Ending
echo "The ${PKG} box was built successfully to ${CWD}/output/"
これを
sudo sh ./build-centos-box.sh
として実行すれば数分でBoxが出力されます。あとはvagrant box add コマンドを使ってBoxを追加すればOKです。
まとめ
今回作成したBoxはこちらからダウンロード可能です。 前回紹介したようにLXCを使う方がVirtualBoxを使うよりも高速かつ軽量です。次回はこれを使ってChefのCookbookを素早くテストする方法とかについて紹介しようと思います。アジャイルコーチングやトレーニングを提供しています
株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。
詳細はこちら