Packer で Vagrant 用仮想マシン (base box) を作成する

Vagrantbox.esVagrant 用 base box が配布されていますが、中身がよく分からないという不安があったり、業務だと大人の事情で使えなかったりといろいろあるので base box を自作することにしました。

最近は veewee ではなく、Packer なるツールを使うのが主流みたいなので、インストールメモを残しておきます。
下記エントリの方法は古いです。

Packer とは?

Amazon EC2 AMI や VirtualBox, VMware 用の OS イメージを一貫性のあるインタフェースで作成できるオープンソースツールです。
Vagrant 作者である Mitchell Hashimoto さんが作成したツールです。

Packer のインストール

公式サイトからダウンロードします。

ダウンロードした zip を展開、packer-0.5.2 という名前に変更して、適当なディレクトリへ置きます。

$ cd ~/bin
$ ln -s packer-0.5.2 packer
$ vi ~/.bash_profile
export PATH=$HOME/bin/packer:$PATH
$ exec $SHELL -l
$ packer --version
Packer v0.5.2

base box 設定ファイルの作成

base box をビルドするために設定ファイルを作成します。
今回は CentOS 6.5 (x86_64) の base box をビルドしました。
設定ファイルは GitHub に置いてあります。

設定ファイル構成

centos
├── centos-6.5.json
├── http
│   └── ks.cfg
└── script
    ├── install-virtualbox-guest-additions.sh
    └── setup-base.sh

各設定ファイルについて

  • centos-6.5.json
    • メインな設定ファイルで、ビルドする OS 情報やビルド時に呼び出すスクリプトなどを設定
  • http/ks.cfg
    • OS インストールの自動化で使用する KickStart の設定ファイル
  • script/*
    • OS インストールが終わった後に実行する処理の設定ファイル(スクリプト)

ビルドの流れ

  1. iso イメージ (centos, virtualbox guest additions) のダウンロード
  2. 仮想マシンに OS をインストール
  3. プロビジョニング (script/*) 実行 (centos-6.5.json の provisioners に対応)
  4. base box 作成 (centos-6.5.json の post-processors に対応)

ビルドの実行

$ cd %centos-6.5.json のあるディレクトリ%
$ packer validate centos-6.5.json 
Template validated successfully.
$ packer build -only=virtualbox-iso centos-6.5.json
.....
==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: ../box/virtualbox/CentOS-6.5-x86_64-VirtualBox.box

centos-6.5.json の post-processors に指定したパスに box ファイルが作成されます。

vagrant up したらエラーが出た時の対処方法

ビルドした base box で vagrant up したら、以下のようなエラーが出ました。
仮想マシンは一応起動しているのですが、vagrant ssh したら、/vagrant がマウントされていない状態でした。

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mkdir -p /vagrant

Stdout from the command:

Stderr from the command:

sudo: sorry, you must have a tty to run sudo

/etc/sudoers で "Defaults requiretty" が有効になっているのが原因です。
"Defaults requiretty" は、sudo する時に TTY を要求するもので、外部プログラム等から sudo されないようにします。
ローカルで使用する OS なのでコメントアウトしました。
コメントアウトは、script/setup-base.sh で行っています。

sudo sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers


Packer
Vagrant