packerでvagrantのbox作成

初めてpackerを使いubuntu14.04のvagrant用boxを作成してみたので、その際にやったことやハマった点などメモ

最終的に作った設定はこちらにおいた
packer/ubuntu14.04 at master · y-kamiya/packer · GitHub

参考ページ

以下のページでは詰まるポイントについて個々に解説してくれているのでとても助かった。

やったこと

インストールは簡単

brew install packer

packer用のディレクトリを作って移動

mkdir -p ~/packer/ubuntu14.04
cd ~/packer/ubuntu14.04

公式ページを見つつ概要把握&最低限の設定を入れてみる
用意するファイルは以下の2つ
・ubuntu14.04.json:packer用の設定ファイル
・preseed.cfg:OSインストール時の自動設定ファイル
ubuntu14.04.json内のboot_command設定内でpreseed.cfgを読むようになっている

ubuntu14.04.json

{
    "variables": {
        "ssh_name": "vagrant"
      , "ssh_pass": "vagrant"
      , "hostname": "ubuntu1404"
    }
  , "builders": [{
        "type": "virtualbox-iso"
      , "guest_os_type": "Ubuntu_64"
      , "iso_url": "http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-server-amd64.iso"
      , "iso_checksum": "ca2531b8cd79ea5b778ede3a524779b9"
      , "iso_checksum_type": "md5"
      , "ssh_username": "{{user `ssh_name`}}"
      , "ssh_password": "{{user `ssh_pass`}}"
      , "shutdown_command": "echo 'vagrant' | sudo -S shutdown -P now"
      , "http_directory": "./"
      , "boot_command" : [
            "<esc><esc><enter><wait>"
          , "/install/vmlinuz noapic "
          , "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg "
          , "debian-installer=en_US auto locale=en_US kbd-chooser/method=us "
          , "hostname={{user `hostname`}} "
          , "fb=false debconf/frontend=noninteractive "
          , "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA "
          , "keyboard-configuration/variant=USA console-setup/ask_detect=false "
          , "initrd=/install/initrd.gz -- <enter>"
      ]
    }]
  , "post-processors": [{
        "type": "vagrant"
      , "only": ["virtualbox-iso"]
    }]
}

"variables":ユーザ変数を定義
"builders":imageを作成する際の設定
"post-processors":image生成後に行う処理

variablesは使わなくてもよいが今回は試しに定義して使ってみた。定義した変数は以下の形式で設定ファイル内に埋め込める。

{{user `変数名`}}

また、最終的にvagrantのboxにするためにpost-processorsを用いた。"only"を指定することでvmwareなどの不必要な形式が生成されないようにしている。

buildsについての詳細はこちらのページにある
VirtualBox Builder (from an ISO) - Packer

"guest_os_type"はvboxmanage list ostypesを実行して必要なIDを確認する
"iso-*"は作成したいimageに使うOSの公式ページなどで確認
"shutdown_command"は上記の公式ページに注意があるが、provisionerでの変更を反映するために必要
"http_directory"と"boot_command"はOSのインストールを自動で行うための設定


preseed.cfgはこちらのページのものを少し変更して使わせてもらった。変更点については下に書く。
veewee/preseed.cfg at master · jedi4ever/veewee · GitHub

引っかかったところ

インストールが始まってもやっている途中でウィンドウが消える

最初は公式ページの設定に従って"ssh_wait_timeout"を30secに設定していたのだが短すぎたため、最終的にこの設定は削除した。

preseed.cfgが読み込めない

最初は"http_directory"をubuntu14.04として設定していたためそのようなファイルはないということでうまくいかなかった。カレントディレクトリはpacker buildを叩いた場所になるためそれに合わせて書いておく必要がある

sshが繋がらない

OSをインストールした後、sshで繋げて確認した上でboxが生成される。その際、設定ファイルに書いたusernameやpasswordが使用されるのだが、いくつかの場所からもらってきた設定であったため噛み合わずにうまくいかなかった。
最初は以下のようなエラーが出ていた

==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Error waiting for SSH: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Deleting output directory...
Build 'virtualbox-iso' errored: Build was halted.

そこでpasswordなどの設定箇所を見直してpreseed.cfgを修正

d-i passwd/user-fullname string Vagrant
d-i passwd/username string vagrant
d-i passwd/user-password password vagrant
d-i passwd/user-password-again password vagrant

もともとの設定だとそれぞれ異なるusernameやpasswordが書かれていたため、今回用いるvagrantという文字列に修正した。

それで再度実行してみると以下の状態に

==> virtualbox-iso: Uploading VirtualBox guest additions ISO...
==> virtualbox-iso: Gracefully halting virtual machine...
    virtualbox-iso: [sudo] password for vagrant: Sorry, try again.
    virtualbox-iso: [sudo] password for vagrant:
    virtualbox-iso: sudo: 1 incorrect password attempt
==> virtualbox-iso: Timeout while waiting for machine to shut down.
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Deleting output directory...
Build 'virtualbox-iso' errored: Timeout while waiting for machine to shut down.

うまくいくよう変更したところは以下の場所
ubuntu14.04.json

"shutdown_command": "echo 'vagrant' | sudo -S shutdown -P now"

もともとはecho "packer"という形で設定していたため今回作成したvmのpasswordと一致していなかった。このechoによって作成して立ち上げたvmへログインしている模様。
なかなか気づけなかったのだがエラーメッセージからググってようやく解決した
https://groups.google.com/forum/#!topic/packer-tool/NWSXBNbOnX8

以上の変更により無事vagrantのboxを生成することができた。