VirtualBox の仮想マシンを都度作ることに対して、得られる知見も少なくなり、面倒に感じるようになってきました。
手順は同じですので、設定ファイルやコマンド、プログラムコードで仮想マシンが作れたら楽ですのに、、、と思っておりました。
Vagrant を使うようになって、Box も参考書片手に作るようになりました。ふと見てみると、仮想マシン作成の自動化について触れられているではありませんか!
早速試して、手順をまとめましたわ♪
なお、本投稿では VirtualBox へインポートできる最低限の仮想マシンを作成、動作確認を扱っております。Vagrant の Box 作成は取り扱っておりませんの。
目標
- CentOS6 64bit Minimal のインストール
Packer について
注意点
の、Packer 0.8 以降の注意事項にある、builder 側の設定で ssh_pty を true に設定する必要姓に注意!
環境
- MacBook Pro (Retina, 13-inch, Late 2012)
- OS X 10.11.4 (15E65)
- Homebrew 0.9.9
Packer のインストールと確認
# インストール brew install packer # インストールバージョン確認 packer --version
なお、brew cask install packer でもインストールできますけれども、インストール元は異なるようでした。この時点では、brew install でも brew cask install でもバージョンは等しかったですわ。
わたくしたちは、brew install でインストールし、進めましたの。
実行場所の準備
実行する場所に制限はありません。今回のテストにあたって適当にディレクトリを作成し、そこに移動します。
以降の作業はすべてこのディレクトリ内で行います。
mkdir test_packer cd test_packer
設定ファイル作成
仮想マシンのテンプレートとなる json 形式のファイルが基本となります。
注意点として、iso_url には通常ダウンロードの URL を書きます。ですけれども、iso_url はファイルパスでも可能なため、予めダウンロードした ISO ファイルの絶対パスを指定しております。
項目とその内容などは次の本家ページ参照ですの。
{
  "builders":[{
    "type": "virtualbox-iso",
    "guest_os_type": "RedHat_64",
    "iso_url": "/Users/username/Downloads/CentOS-6.7-x86_64-minimal.iso",
    "iso_checksum": "9381a24b8bee2fed0c26896141a64b69",
    "iso_checksum_type": "md5",
    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_wait_timeout": "3000s",
    "vm_name": "box",
    "ssh_pty": true,
    "http_directory": "./",
    "boot_wait": "30s",
    "boot_command":[
      "<esc><wait>",
      "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg ",
      "<enter><wait>"
    ],
    "shutdown_command": "sudo /sbin/poweroff"
  }]
}
また今回は、インストール時に Packer 側から送り込む自動操作のコマンド群を ks.cfg ファイルに分けて作成しました。boot_command で実行される内容となりますわ。
linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg はインターネット上のどこかの場所を示しているのではなく、自身で用意した kc.cfg のことです。http_directory が関わっていて、この変数の値が HTTPIP、HTTPPort へとつながります。
なお、CentOS 6 (というよりも Red Hat 6) のキックスタートファイルについての説明は次の本家ページの詳細を参考にしてくださいませ。
install cdrom lang en_US.UTF-8 keyboard jp106 network --bootproto=dhcp rootpw vagrant firewall --enabled --service=ssh authconfig --enableshadow --passalgo=sha512 timezone UTC bootloader --location=mbr text skipx zerombr clearpart --all --initlabel autopart auth --useshadow --enablemd5 firstboot --disabled reboot %packages --nobase @core %end %post /usr/bin/yum -y install sudo /usr/sbin/groupadd vagrant /usr/sbin/useradd vagrant -g vagrant -G wheel echo "vagrant"|passwd --stdin vagrant echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant chmod 0440 /etc/sudoers.d/vagrant %end
テンプレートからの仮想マシンビルド
packer build machine.json
実際のターミナルへの出力の様子は次のようになりました。ターミナルへの表示以外に自動的に VirtualBox 仮想マシンが立ち上がり、インストール作業が行われておりました。
$ packer build machine.json 
virtualbox-iso output will be in this color.
==> virtualbox-iso: Downloading or copying Guest additions
    virtualbox-iso: Downloading or copying: file:///Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: file:///Users/username/Downloads/CentOS-6.7-x86_64-minimal.iso
==> virtualbox-iso: Starting HTTP server on port 8027
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 3965)
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 30s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Connected to SSH!
==> virtualbox-iso: Uploading VirtualBox version info (5.0.20)
==> virtualbox-iso: Uploading VirtualBox guest additions ISO...
==> virtualbox-iso: Gracefully halting virtual machine...
==> virtualbox-iso: Preparing to export machine...
    virtualbox-iso: Deleting forwarded port mapping for the communicator (SSH, WinRM, etc) (host port 3965)
==> virtualbox-iso: Exporting virtual machine...
    virtualbox-iso: Executing: export box --output output-virtualbox-iso/box.ovf
==> virtualbox-iso: Unregistering and deleting virtual machine...
Build 'virtualbox-iso' finished.
==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: VM files in directory: output-virtualbox-iso
$
結果、作業ディレクトリに次のディレクトリ、ファイルが生成されました。
- output-virtualbox-iso
- box-disk1.vmdk
- box.ovf
 
- packer_cache
VirtualBox へのインポート、起動確認
- VirtualBox を起動
- メニューの、ファイル > 仮想アプライアンスのインポート (command + I)
- 先ほど作成された box.ovf を指定し、[続ける]
- [名前] を変更し、インポート先のパスである [仮想ディスクイメージ] を念のため確認して [インポート]
以上で VirtualBox へインポートできました。
最後に、Oracle VM VirtualBox マネージャーから仮想マシンを起動、ログインして操作できることを確認しました!
おわりに
次の書籍を参考に、仮想マシン作成の部分のみを抜き出して実践いたしました。
以上です。
