VagrantのBox作成 を手動ではなくて自動で作りたいと思って調べると Packer という Vagrant の作者によって作られている仮想マシンのイメージを作成するツールがありました。他にも jedi4ever/veewee · GitHub というツールも有名みたいですが、Packer の方が汎用性が高そうだったので使ってみた内容をまとめます。
Packerのインストール
公式サイトからパッケージを Downloads するか、Homebrew を使用してインストールします。
$ brew tap home-brew/binary $ brew install packer $ packer version Packer v0.7.5
Install Packer - Packer by HashiCorp
Packerのコマンド
packer build
コマンドのオプションは以下の通りです。
Option | Note |
---|---|
-except=<builder> | 指定したbuilderを実行しない。カンマ区切りで複数可。 |
-only=<builder> | 指定したbuilderのみ実行する。カンマ区切りで複数可。 |
-color=false | 色付きの出力を無効にする。デフォルト有効。 |
-force | 前回の実行結果が残っていても強制実行。 |
-debug | デバッグオプション |
Build - Command-Line - Packer by HashiCorp
packer inspect
とpacker validate
は引数にテンプレートのJSONファイルを指定すると検証してくれます。基本的にJSON形式の構文チェックをする点は同じですが以下のような違いがあります。
packer inspect
は構文チェックのみで、出力結果ではテンプレートに記載してあるVariables
Builder
Provisioners
を一覧表示してくれます。
$ packer inspect packer.json Variables: <No variables> Builders: virtualbox-iso Provisioners: shell
Inspect - Command-Line - Packer by HashiCorp
packer validate
は構文チェックと設定項目のチェックもしてくれます。-syntax-only
オプションを付けると構文チェックのみになります。次の例ではssh_port
という項目をタイポでssh_part
としてしまっていた場合の結果です。
$ packer validate packer.json Template validation failed. Errors are shown below. Errors validating build 'virtualbox-iso'. 1 error(s) occurred: * Unknown configuration key: ssh_part
Validate - Command-Line - Packer by HashiCorp
Templateの作成
Templateファイルはマシンイメージを作成するためのJSONファイルです。初めての時は公式を見てもどうすればいいのかよくわからないと思いますので、「packer template」で検索したりして参考にするのがいいと思います。今回はVirtualBoxの仮想マシンでVagrant用のボックスを作成する事がメインですので次のような形式になります。
{ "builders": [ { "type": "virtualbox-iso", "vm_name": "centos6", "guest_os_type": "RedHat_64", "iso_url": "http://ftp.riken.jp/Linux/centos/6/isos/x86_64/CentOS-6.6-x86_64-minimal.iso", "iso_checksum": "eb3c8be6ab668e6d83a118323a789e6c", "iso_checksum_type": "md5", "ssh_username": "vagrant", "ssh_password": "vagrant", "ssh_port": 22, "ssh_wait_timeout": "10000s", "disk_size": 102400, "shutdown_command": "echo 'vagrant' | sudo -S shutdown -P now", "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso", "virtualbox_version_file": ".vbox_version", "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "512"], ["modifyvm", "{{.Name}}", "--cpus", "1"] ], "http_directory": "./centos6/builders", "boot_wait": "10s", "boot_command": [ "<tab> text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg<enter><wait>" ] } ], "provisioners": [ { "type": "shell", "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'", "override": { "virtualbox-iso": { "scripts": [ "./centos6/provisioners/base.sh", "./centos6/provisioners/vagrant.sh", "./centos6/provisioners/virtualbox.sh", "./centos6/provisioners/netpersist.sh", "./centos6/provisioners/cleanup.sh" ] } } } ], "post-processors": [ { "type": "vagrant", "keep_input_artifact": false, "override": { "virtualbox": { "output": "./centos6/box/CentOS-6.6-x86_64-minimal-en.box" } } } ] }
builders
provisioners
post-processors
の各ブロック毎に分けて説明を書いていきます。
builders
builders は Template では唯一必須です。仮想マシンを作成するための設定項目一覧になります。
Required - Key | Value |
---|---|
iso_checksum | isoファイルのチェックサム。md5のchecksumはmd5 <iso-file> で確認できます。 |
iso_checksum_type | isoファイルのチェックサムタイプ。 |
iso_url | インストールするisoファイルのURLを指定します。ローカルのファイルパスでも問題ありません。 |
ssh_username | SSHの実行ユーザー。Vagrantを使用する場合は「vagrant」にしておきます。 |
ssh_password | SSHの実行ユーザーのパスワード。Vagrantを使用する場合は「vagrant」にしておきます。 |
Optional - Key | Value |
---|---|
boot_command | 仮想マシンが起動したときに実行するコマンド。拡張子が~.cfg のkickstartファイルを指定します。 |
boot_wait | 仮想マシンが起動してboot_command が実行される前の待機時間。デフォルト10秒(10s) |
guest_os_type | VBoxManage list ostypes コマンドで確認できます。 |
http_directory | kickstartファイルを置いてあるディレクトリを指定します。 |
headless | (boolean) true の場合は GUI を起動しない。 |
一部だけ設定内容を書きましたがその他の項目については以下のリンクに記載されています。
VirtualBox Builder (from an ISO)
kickstartに関しては、OSのインストールを自動化することができるものです。kickstartファイルの詳細についての説明は省きますが、自分で作成する場合は以下のリンク先や、別途インストールした仮想マシンにある/root/anaconda-ks.cfg
ファイルなどを参考にするとよいです。
provisioners
provisionersは仮想マシンが作成された後に実行する処理です。今回はShellで実行していますが、Chef や Puppet 等を使用することもできます。スクリプトに関してはinline
で指定することもscripts
で外部ファイルを指定する事も可能です。
{ "type": "shell", "inline": [ "yum -y install kernel-devel-`uname -r`", "yum -y install gcc", ... ] } --- { "type": "shell", "scripts": [ "./centos6/provisioners/base.sh", "./centos6/provisioners/vagrant.sh", ... ] }
詳細は以下のリンク先を参考にしてください。
Templates: Provisioners
Shell Provisioner
post-processors
post-processorsは仮想マシンが作成され、provisionersも全て完了した後に実行する処理です。Vagrantのボックスを作成するので"type": "vagrant"
と"output": ~
で出力先ディレクトリーが指定されていればOKです。
"post-processors": [ { "type": "vagrant", "output": "./packer/vagrant-boxes/CentOS-6.4-x86_64-minimal.box" } ]
Templates: Post-Processors
Vagrant Post-Processor
その他の項目
Variables
を使用するとユーザーが使用する変数を定義する事ができます。使用する時は {{user `variable`}} と記述します。
"variables": { "aws_access_key": "", "aws_secret_key": "" }
description
は説明を記載しておくだけのものです。packer inspect
を実行した時にも表示されます。
"description": "Create vagrant box", ... --- $ packer inspect centos6/packer.json Description: Create vagrant box Variables: ...
ビルドの実行
サンプルとして作成したテンプレートを使用します。GitHubに登録しましたので参考にしてみて下さい。
$ git clone https://github.com/tasukujp/vagrant-boxes-packer.git $ packer build centos6/packer.json ... $ vagrant add box centos66 centos6/box/CentOS-6.6-x86_64-minimal-en.box $ vagrant init centos66 $ vagrant up ... $ vagrant ssh
tasukujp/vagrant-boxes-packer · GitHub