Packerを使ってVirtualBoxやKVM/Xen向けの仮想マシンイメージを作成する
PackerにはVirtualBoxやQEMU(KVMおよびXen)などの仮想マシンイメージを作成する機能が用意されており、仮想マシン作成を自動化できる。今回は、Packerを使ってVirtualBoxおよびQEMU(KVM)用の仮想マシンにOSをインストールしてディスクイメージを作成する例を紹介する。
Packerを使って各種仮想マシン用のディスクイメージを作る
前回記事ではPackerを使ってDocker用のイメージを作成する方法を紹介したが、今回はDockerではなく仮想化ソフトウェア向けのイメージを作成する方法を紹介していこう。
Packerではさまざまな仮想マシンやクラウドインフラ向けのディスクイメージを作成できるが、今回はCentOS 7のインストールISOイメージを元に、VirtualBoxとQEMU(KVM)向けのディスクイメージを作成する流れを紹介する。
VirtualBox向けのディスクイメージを作成する
まずはVirtualBox向けのディスクイメージの作成について説明しよう。PackerではVirtualBox向けのbuilderとして、「virtualbox-ovf」と「virtualbox-iso」の2つが用意されている。
virtualbox-ovfは前回紹介したDocker向けbuilderと似たような動作を行うもので、既存のVirtualBox用の仮想マシンファイル(OVFファイル)やディスクイメージを使って仮想マシンを起動し、指定されたprovisionerでプロビジョニングを実行したのち仮想マシンをエクスポートする、というものだ。
いっぽうのvirtualbox-isoはインストール用のISOイメージから仮想マシンを起動してインストール作業やプロビジョニング作業を実行し、その結果作成された仮想ディスクからディスクイメージを作成するものになる。具体的な作業の流れとしては、下記のようになる。
- 新規に仮想マシンを作成する
- 指定されたインストールCD/DVDのISOイメージファイルからインストーラを起動してインストールを行う
- プロビジョニングを実行する
- プロビジョニング後の環境を仮想マシンファイルとしてエクスポートする
なお、2.のステップにおいては、Packerでは仮想マシンの起動までを行い、その後のインストール作業については関与しない。そのため手動でインストール作業を進めるか、もしくはkickstartなどの自動インストール機能を別途利用する必要がある。
今回は、こちらのvirtualbox-iso builderを使ってVirtualBox向け仮想ディスクイメージファイルを作成することにする。なお、virtualbox-isoもしくはvirtualbox-ovf builderを利用する場合、Packerを実行するマシン上に事前にVirtualBoxがインストールされている必要がある。また、後述するheadlessインストールを行わない場合は、GUIでVirtualBoxを操作できるよう設定しておく必要もある。それぞれ事前に準備をしておこう。
VirtualBox用ディスクイメージを作成する設定を追加する
それでは、まずはvirtualbox-iso builder用の設定を前回作成した設定ファイルに追加していこう。今回追加したのは、下記の太字で示している部分だ。
{ "builders": [ { "type": "docker", "image": "centos:centos7", "export_path": "packer-centos7-docker.tar" }, { ↓「virtualbox-iso」builderの設定であることを宣言する "type": "virtualbox-iso", ↓使用するISOイメージのチェックサムが記載されたファイル "iso_checksum_url": "file:///home/hylom/packer-test/md5sum.txt", ↓使用するチェックサムの形式 "iso_checksum_type": "md5", ↓ISOイメージのダウンロード元URL "iso_url": "file:///home/hylom/packer-test/CentOS-7-x86_64-NetInstall-1511.iso", ↓プロビジョニングに使用するユーザー名 "ssh_username": "root", ↓プロビジョニング実行時に仮想マシンにログインするために使用するパスワード "ssh_password": "SSH_Password", ↓インストール作業のタイムアウト時間 "ssh_wait_timeout": "40m", ↓作成する仮想マシンのディスクサイズ "disk_size": "8000", ↓作成する仮想マシンのタイプ "guest_os_type": "RedHat_64", ↓仮想マシンをシャットダウンする際に使用するコマンド "shutdown_command": "/sbin/shutdown -h now", ↓シャットダウンコマンドを実行してから完了するまでの待機時間 "shutdown_timeout": "20s", ↓作成する仮想マシンの名称 "vm_name": "packer-centos7-vbox" }, ], "provisioners": [ { "type": "chef-solo", "cookbook_paths": ["cookbooks"], "run_list": ["webserver"], "prevent_sudo": true } ] }
virtualbox-iso builderでは、インストールに使用するISOイメージを「iso_url」パラメータで指定する。ここではHTTP経由でISOイメージをダウンロードして使用するよう指定しているが、「file://」プロトコルを指定すればローカルのファイルを使用することも可能だ。また、「iso_checksum_url」および「iso_checksum_type」パラメータはそのISOイメージファイルのチェックサムが記載されているファイルとその形式を指定するもので、必須のパラメータとなっている。チェックサムはISOイメージの配布元で公開されており、たとえばCentOSの場合md5sum.txtにMD5形式のチェックサムが記載されているので、それを指定すれば良い。
「ssh_username」および「ssh_password」はインストールの完了後にPackerがプロビジョニングに使用するアカウント名とそのログインパスワードを指定するものだ。今回はrootユーザーでプロビジョニングを実行するよう指定している。
注意したいのが「ssh_wait_timeout」設定だ。Packerは仮想マシンを実行後、「ssh_username」で指定したアカウントを使って仮想マシンに対しログインを試みる。インストール作業中は当然ながらログインを行えないため、Packerは定期的に仮想マシンに対してログインを試行し続け、ログインに成功したら仮想マシンへのインストールが完了したと判断する仕組みになっている。このとき、ログインに成功しないまま「ssh_wait_timeout」で指定した時間が経過すると、Packerはインストール時に問題が発生したと判断して作業を中断してしまう。そのため、ここでは十分な時間を指定しておく必要がある。今回は「40m」(40分)を指定している。
そのほか、ここで指定しているパラメータの詳細についてはPackerのドキュメントを参照してほしい。
さて、設定ファイルの編集が終わったら、次のようにpacker buildコマンドを実行しよう。
$ ~/packer/packer build --only=virtualbox-iso centos7.json
ここで指定している「--only=virtualbox-iso」は、使用するbuilderを選択するためのオプションだ。設定ファイル内では複数のbuilderを指定でき、このオプションが省略された場合、Packerは設定ファイル内のすべてのbuilderを順に実行してイメージを作成する。今回はVirtualBox向けのイメージのみ作成したいので、「virtualbox-iso」を指定する。
packer buildコマンドを実行すると、図1のようにVirtualBoxが起動してインストール画面が表示される。
今回はインストールの自動化に関する設定は行っていないので、ここではインストーラの起動画面が表示されるのみで、その後の作業には進まない。そのため続けて手動でインストーラを操作し、インストール作業を進めていく。このときrootパスワードにはPackerの設定ファイル内で「ssh_password」として指定したものを設定することに注意したい。
手動でのインストールの完了後に仮想マシンを再起動すると、PackerがSSHで仮想マシンにログインし、プロビジョニング作業を実行する(図2)。
プロビジョニング作業が正常に修了すると、イメージファイルのエクスポートが行われ、「output-virtualbox-iso」というディレクトリ内に保存される。「.vmdk」という拡張子のものがディスクイメージ、「.ovf」のものが仮想マシンの設定ファイルだ。
$ ls output-virtualbox-iso/ packer-centos7-vbox-disk1.vmdk packer-centos7-vbox.ovf