Packerを使ってWheezyのVagrant Boxを作る
以前、「VeeWeeを使わずWheezyのVagrantのBoxを作る」というエントリを書きましたが、それの続きです。 VagrantでDebianの情報、というよりPacker自体の情報がないのでメモってみました。
参考
- Build an Image - Packer: http://www.packer.io/intro/getting-started/build-image.html
- Packer: http://www.packer.io/docs/builders/virtualbox.html
- ffuenf/vagrant-boxes: https://github.com/ffuenf/vagrant-boxes
- [続報]PackerでVagrant用のBoxを作成する | Ryuzee.com: http://www.ryuzee.com/contents/blog/6706
Packerとは
Packerは、一つの設定から複数のプラットフォーム用のマシンイメージを作成するためのツールツールです。 VirtualBoxのほかにもVMwaraやAmazon EC2のAMIなど、さまざまな仮想化ソフトウェア/クラウド環境に対応しています。
- Packer: http://www.packer.io/
インストール
Packerのダウンロードページに、それぞれのOS/アーキテクチャ用のバイナリが用意されています。自分の環境にあったものをダウンロードし、パスの通った場所に展開してください。
- Downloads - Packer: http://www.packer.io/downloads.html
メモをまとめている間に、0.2.3から0.3.1にバージョンが上がりましたが、0.3.0/0.3.1ではGuestAdditionsがアップロードされないようなので(バグ?)、こちらから0.2.3をダウンロードして利用すると良いでしょう。
Packerの設定ファイルを書く前に
Debianのインストールは、Preseedを使って自動インストールするので、あらかじめPreseedファイルを用意しておく必要があります。 Preseedファイルの作成について、くわしくはこちらをどうぞ。
packerの設定ファイルを書く
今回作ったpackerの設定ファイルの構成はこのようになります。
-
https://github.com/nogajun/vagrant-boxes
. |-- preseed |
-- preseed.cfg |-- scripts | |-- base.sh | |-- cleanup.sh |
-- guestadditions.sh `-- wheezy.json
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ファイルでは反映されないホスト名とドメイン名を指定しています。 「
ブートパラメータ自体については、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のほうに書きなおそう。