2017年9月12日火曜日

packer + Virtualbox で ISO から ovf ファイルを作成してみる

概要

Virtualbox で VM を作成する場合 ISO が必要になります
そして Virtualbox 上で作成した VM は ovf 形式にエクスポートすることができます
この流れは Virtualbox だけでも可能ですが packer を使うことで一連の流れを自動化することができます

環境

  • macOS X 10.12.6
  • packer 1.0.4

事前準備

packer のインストール Virtualbox のインストールを行っておいてください
自分は Mac 上でビルドするので packer は homebrew と Virtualbox は公式のインストーラを使ってインストールしました

テンプレート Json の作成

今回は CentOS7 の ovf ファイルを最終的に作成します
CentOS7 のインストール用 ISO をダウンロードしてそこから ovf を作成します

  • vim centos7.json
{
    "builders": [{
        "type": "virtualbox-iso",
        "vboxmanage": [
            ["modifyvm", "{{.Name}}", "--memory", "2048"],
            ["modifyvm", "{{.Name}}", "--nic1", "nat"],
            ["modifyvm", "{{.Name}}", "--nic2", "hostonly"],
            ["modifyvm", "{{.Name}}", "--hostonlyadapter2", "vboxnet0"]
        ],
        "iso_checksum": "27bd866242ee058b7a5754e83d8ee8403e216b93d130d800852a96f41c34d86a",
        "iso_checksum_type": "sha256",
        "iso_url": "http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso",
        "ssh_username": "root",
        "ssh_password": "password",
        "ssh_wait_timeout": "40m",
        "disk_size": "8000",
        "guest_os_type": "RedHat_64",
        "shutdown_command": "/sbin/shutdown -h now",
        "shutdown_timeout": "20s",
        "vm_name": "centos7_from_packer"
    }],
    "provisioners": [{
        "type": "shell",
        "inline": ["yum install -y vim"]
    }]
}

簡単な解説

builder の type に virtualbox-iso を指定することで Virtualbox 上で ISO から VM を作成し ovf を作成することができます
ISO はネットからダウンロードできる Minimal の ISO を使います
ダウンロードされた ISO は packer のキャッシュとして以下のディレクトリに保存されます

./packer_cache/c01a0f674526c96fe4c941774a9f761f6c51e5346004457aa50aa802d978a772.iso

vboxmanage を使って Virtualbox 上に作成される VM の設定を変更する必要があります
今回 yum install をするので VM がインターネットに接続できる必要があります
かつ、packer を実行している Mac から VM に対して SSH 接続できる必要があります
なので「nat」と「hostonly」のネットワークを接続しています

あと、ssh_username と ssh_password はこのあと設定する OS のインストールで使用します
CentOS7 のインストールの設定の際に root ユーザのパスワードを決める必要がありますが、それをテンプレート内と同じ値にしないと VM に SSH できなくなるので気をつけてください

実行してみる

では実行してみます

packer build

  • packer build centos7.json

実行するとまず ISO のダウンロードが始まります
ダウンロードが完了すると Virtualbox 上に VM が作成されて OS のインストール画面が起動します

手動で OS のインストールを行う

今回の場合、残念ながらここはどうしても手動で行う必要があります
この手動の作業を自動化したい場合は別途 kickstart サーバを用意する必要があります
packer + kickstart を連携して OS のインストールを自動化する方法は別記事で紹介したいと思います

今回の場合、手動で設定する項目もそれほど多くないのでちゃちゃっと手動で設定してしまいましょう
設定するのはシステムのインストール先のパーティションと root パスワードとネットワーク設定になります 
ただ、特に注意しなければならないのはネットワークの設定です
デフォルトだと追加した 2 つのネットワークは切断状態になっています
そのため再起動後に SSH 経由で実行するプロビジョニングが失敗してしまいます
なので、OS インストール時の設定で接続した 2 つのネットワークは必ず接続するようにしてください

※どうしても SSH できない、ネットワークが上がらない場合は再起動して VM が上がったらコンソールからログインして接続してあげましょう

自動でプロビジョニングが始まるのを確認する

OS のインストールが完了し VM を手動で再起動したらプロビジョニングが始まります
今回は簡単な yum install だけなのですぐ終わると思います

確認のため終わったら VM を起動して SSH でログインしてみましょう
packer のテンプレートで指定した yum install -y vim がちゃんと実行されているはずです

成果物 (ovf) を確認する

packer build が完了したら目的の ovf + vmdk ができあがっているはずです

  • ls -ltr output-virtualbox-iso/
total 1157712
-rw-------  1 hawksnowlog  staff       7878  9 11 16:38 centos7_from_packer.ovf
-rw-------  1 hawksnowlog  staff  592738304  9 11 16:39 centos7_from_packer-disk001.vmdk

あとはこれを Virtualbox や vSpehre 環境にデプロイすれば VM として使うことができます

最後に

packer + Virtualbox を使って vmdk + ovf ファイルを作成してみました
自分がいちばん躓いたのはプロビジョニングのところで OS インストールし再起動後 VM に接続できない現象にハマリました
なぜかネットワークが disconnected になってしまったので最後はコンソールからログインして SSH のタイムアウトになる前にネットワークを起動しました

次回は今回の構成に kickstart サーバを連携して OS のインストール部分を自動化してみたいと思います

参考サイト

0 件のコメント:

コメントを投稿