Packerを使用してVirtualBoxの仮想マシンからVagrantのBoxを作成する

スポンサーリンク

 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 inspectpacker 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": ""
}

 User Variables in Templates

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