Packerを使ってWheezyのVagrant Boxを作る

Posted by nogajun - 2013/08/16

_

以前、「VeeWeeを使わずWheezyのVagrantのBoxを作る」というエントリを書きましたが、それの続きです。 VagrantでDebianの情報、というよりPacker自体の情報がないのでメモってみました。

参考

Packerとは

Packerは、一つの設定から複数のプラットフォーム用のマシンイメージを作成するためのツールツールです。 VirtualBoxのほかにもVMwaraやAmazon EC2のAMIなど、さまざまな仮想化ソフトウェア/クラウド環境に対応しています。

インストール

Packerのダウンロードページに、それぞれのOS/アーキテクチャ用のバイナリが用意されています。自分の環境にあったものをダウンロードし、パスの通った場所に展開してください。

メモをまとめている間に、0.2.3から0.3.1にバージョンが上がりましたが、0.3.0/0.3.1ではGuestAdditionsがアップロードされないようなので(バグ?)、こちらから0.2.3をダウンロードして利用すると良いでしょう。

Packerの設定ファイルを書く前に

Debianのインストールは、Preseedを使って自動インストールするので、あらかじめPreseedファイルを用意しておく必要があります。 Preseedファイルの作成について、くわしくはこちらをどうぞ。


packerの設定ファイルを書く

今回作ったpackerの設定ファイルの構成はこのようになります。

wheezy.jsonは、JSON形式で書かれたPackerの設定ファイルです。

preseedディレクトリにあるpreseed.cfgは、Debianの自動インストールに使われる設定ファイルです。

scriptsディレクトリ以下は、Debianインストール後、プロビジョニングをおこなうためのシェルスクリプトです。

wheezu.json

Packerの設定ファイルは、このようになります。

{
  "builders": [
    {
      "type": "virtualbox",
      "guest_os_type": "Debian",
      "disk_size": 10240,
      "iso_url": "http://cdimage.debian.org/debian-cd/current/i386/iso-cd/debian-7.1.0-i386-netinst.iso",
      "iso_checksum_type": "md5",
      "iso_checksum": "a70efb67ca061175eabe7c5dc04ab323",
      "http_directory": "preseed",
      "boot_wait": "5s",
      "boot_command": [
        "<esc><wait>",
        "auto <wait>",
        "url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
        "netcfg/get_hostname={{ .Name }} <wait>",
        "netcfg/get_domain=vagrantup.com <wait>",
        "debconf/frontend=noninteractive <wait>",
        "<enter><wait>"
      ],
      "ssh_password": "vagrant",
      "ssh_username": "vagrant",
      "ssh_port": 22,
      "ssh_wait_timeout": "20m",
      "shutdown_command": "sudo /sbin/shutdown -h now",
      "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
      "virtualbox_version_file": ".vbox_version"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "scripts": [
        "scripts/base.sh",
        "scripts/guestadditions.sh",
        "scripts/cleanup.sh"
      ],
      "override": {
        "virtualbox": {
          "execute_command": "echo 'vagrant'|sudo -S bash '{{.Path}}'"
        }
      }
    }
  ],
  "post-processors": [
    {
      "type": "vagrant",
      "output": "debian-wheezy-i386.box"
    }
  ]
}

設定ファイルは3つのセクションに分かれて、それぞれの働きはこのようになります。

  • builders(必須): マシンイメージの設定。
  • provisioners(オプション): 作成したマシンイメージに対してプロビジョニングする設定。
  • post-processors(オプション): マシンイメージ作成後の設定。

それではセクションごとに詳しく見てみましょう。


builders

buildersには作成するマシンイメージの設定を書きます。

"type": "virtualbox",
"guest_os_type": "Debian",
"disk_size": 10240,

typeには、作成するイメージのタイプを書きます。今回はVirtualBoxのイメージを作成するので「virtualbox」と書きます。

guest_os_typeには、「vboxmanage list ostypes」でリストアップされる対応OSの種類を書きます。今回はi386を使いましたが、amd64の場合は「Debian_64」になります。

disk_sizeはマシンのディスクサイズを書きます。40GBとか50GBとか確保しても実際のところそんなに使うこともなかったので、今回は10GBにしました。

"iso_url": "http://cdimage.debian.org/debian-cd/current/i386/iso-cd/debian-7.1.0-i386-netinst.iso",
"iso_checksum_type": "md5",
"iso_checksum": "a70efb67ca061175eabe7c5dc04ab323",

インストールに使用するISOイメージの場所とチェックサム、チェックサムの種類を書きます。

"http_directory": "preseed",

http_directoryには、preseedファイルのあるディレクトリを指定します。

"boot_wait": "5s",
"boot_command": [
  "<esc><wait>",
  "auto <wait>",
  "url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
  "hostname={{ .Name }} <wait>",
  "domain=vagrantup.com <wait>",
  "frontend=noninteractive <wait>",
  "<enter><wait>"
],

boot_waitは、VirtualBoxが起動してインストーラが起動するまでの時間です。起動に時間がかかる場合は増やしてください。

boot_commandは、インストーラに与えるブートパラメータを指定をします。

ここで与えているブートパラメータは、preseedファイルを指定するための「url=」と、preseedファイルでは反映されないホスト名とドメイン名を指定しています。 「」「」「」は、それぞれESCキー、Enterキー、1秒間待つ(ウェイト)となっています。

ブートパラメータ自体については、Debian GNU/Linuxインストールガイドの「5.3. ブートパラメータ」を参考にしてください。

"ssh_password": "vagrant",
"ssh_username": "vagrant",
"ssh_port": 22,
"ssh_wait_timeout": "20m",
"shutdown_command": "sudo /sbin/shutdown -h now",

Debianインストール後、SSHでログインをしてプロビジョニングをおこないますが、その時に利用するSSHの設定です。

ssh_wait_timeoutは、SSHが利用できるようになるまでの待ち時間です。

"guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
"virtualbox_version_file": ".vbox_version"

VirtualBoxのGuestAdditionsのバージョンとアップロードされるファイル名を含むパスです。


provisioners

ここからはプロビジョニングについての設定です。

"type": "shell",
"scripts": [
  "scripts/base.sh",
  "scripts/guestadditions.sh",
  "scripts/cleanup.sh"
],

プロビジョニングに使うスクリプトのタイプとスクリプトについて指定しています。 プロビジョニングにはシェルスクリプト以外も使えると思いますが、ドキュメントを探しきれなかったので、そのままシェルスクリプトを使いました。

"override": {
  "virtualbox": {
    "execute_command": "echo 'vagrant'|sudo -S bash '{{.Path}}'"
  }
}

root権限でプロビジョニングのスクリプトを実行させるので、オーバーライドしています。 ここもドキュメントそのまま引き写しです。


post-processors
"type": "vagrant",
"output": "debian-wheezy-i386.box"

作成するマシンイメージのタイプとファイル名を指定しています。

preseed.cfg

基本的な設定は、「Debianのインストールを自動化 - nofuture.tv」と同じです。

「Debianのインストールを自動化」のpreseedファイルと違う部分は、vagrantユーザーがパスワード無しで管理者権限になれるように、インストール終了後、/etc/sudoers.d/vagrantに設定を追加しています。

d-i preseed/late_command string \
echo 'vagrant ALL=(ALL:ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/vagrant; \
chmod 440 /target/etc/sudoers.d/vagrant

scripts

VeeWeeを使わずWheezyのVagrantのBoxを作る」と同じ設定をしています。 特にトリッキーなことはしていないので、それぞれのスクリプトを見てください。


Vagrant Boxを作成する

Packerには3つのコマンドがあります。

$ packer --help
usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build        build image(s) from template
    fix          fixes templates from old versions of packer
    validate     check that a template is valid

Globally recognized options:
    -machine-readable    Machine-readable output format.
  • packer build: 設定ファイルからマシンイメージを作成。
  • packer validate: 設定ファイルを検証する。
  • packer fix: 古い設定ファイルを修復する

早速ビルドに入りたいところですが、まずは検証してみます。

$ packer validate wheezy.json
Template validated successfully.

問題がなければこのようにメッセージが出ます。 問題があればこのようにエラーメッセージが出るので修正して検証します。

$ packer validate wheezy.json
Failed to parse template: Error in line 36, char 8: invalid character '"' after array element
  "scripts/cleanup.sh"

問題がなければ、ビルドします。

$ packer build wheezy.json

_ 書いてみたのはいいけれど見づらいな

tDiaryの書き方のスタイルと自分の書く文章のスタイルが合わないなと思うことが最近たびたびある。 かといって、WordPressは使う気はないし。

とりあえず、Wikiのほうに書きなおそう。