PackerとVagrantを使ってみる

最近色々な検証にVirtualBoxを使っていますが、VMを毎回作るのも辛いので、VagrantとPackerを試してみたときのメモです。
今回試した環境は以下の通りです。


Packerで作成するVMはCentO6.5の64bit版を選定しました。

環境構築


まずはベースになる環境を作ります。

VirtualBoxのインストール


ここから、最新版のVirtualBoxをダウンロードし、インストールします。

Vagrantのインストール


ここから、最新版のVagrantをダウンロードし、インストールします。

Packerのインストール


ここから、最新版のPackerをダウンロードします。


ダウンロードしたZipファイルを適当な場所に展開します。
私は「C:\Packer」にしました。

Packer実行前の準備


今回はローカルネットワークで通信できる環境にKickstart用のVMを1ノード立てました。
デフォルトでApacheをインストールし、ドキュメントルートにKickstart用のコンフィグと、Centos6.5のISOファイルを配置しました。


Kickstartのコンフィグは以下の通りです。(特に複雑なことはしていません)

# Kickstart file automatically generated by anaconda.

install
lang ja_JP.UTF-8 
keyboard jp106
network --bootproto dhcp
rootpw  --iscrypted <your password>
firewall --enabled --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone JST
bootloader --location=mbr

text
skipx
zerombr

clearpart --all --initlabel
autopart

auth --useshadow --enablemd5
firstboot --disabled

reboot

%packages --nobase
@core
%post

%end

Packer用コンフィグの作成


VMを作るためのコンフィグを作成します。今回は以下のように作成しました。
Kickstart用のコンフィグ及びOSのISOファイルはローカル環境からダウンロードする構成です。

{
    "builders": [
        {
            "type": "virtualbox",
            "vm_name": "centos6_x86_64-base",
            "guest_os_type": "RedHat_64",
            "disk_size": "8000",
            "format": "ovf",
            "hard_drive_interface":"sata",
            "boot_wait": "5s",
            "iso_url": "http://192.168.xxx.xxx/CentOS-6.5-x86_64-minimal.iso",
            "iso_checksum_type": "md5",
            "iso_checksum": "0d9dc37b5dd4befa1c440d2174e88a87",
            "ssh_username":"root",
            "ssh_password":"xxxxxxxx",
            "ssh_port": 22,

            "shutdown_command": "shutdown -h now",
            "guest_additions_path": "VBoxGuestAdditions_.iso",
            "virtualbox_version_file": ".vbox_version",
            "vboxmanage":[
                ["modifyvm", "centos6_x86_64-base", "--memory", "512"],
                ["modifyvm", "centos6_x86_64-base", "--cpus", "1"]
            ],
            "boot_command": [
                "<tab> text ks=http://192.168.xxx.xxx/ks.cfg<enter><wait>"
            ]
        }
    ],
    "provisioners": [{
        "type": "shell",
        "scripts": [
            "scripts/eth1.sh"
            ]
    }],
    "post-processors": [{
        "type": "vagrant",
        "output": "centos6_x86_64-base.box"
    }]
}


VMの環境を簡単にまとめます。

  • 仮想CPUを1つ割り当て
  • メモリは512MB
  • ディスクは8GB
  • VMNICはeth0はNAT, eth1は内部ネットワーク


NIC指定は、eth1.shのスクリプトを用意し、以下のような記述をしました。
若干強引ですが、eth1のIPアドレス設定を明示して事前に書き込んでいます。


ちなみに、最後の一行が胆です。
このファイルをVMパッケージング時に削除しておかないと、Vagrantで起動するときに、NICのデバイスがeth2になってしまいます。
色々試してみたのですが、今回はどうしてもうまくいかなかったのでこのようにしました。

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=192.168.xxx.xxx
NETMASK=255.255.255.0
NETWORK=192.168.xxx.xxx
EOF

rm -f /etc/udev/rules.d/70-persistent-net.rules


Packerコマンドを使ってビルドします。今回はvirtualbox形式のVMのみビルドします。

C:\Packer>packer.exe build -only=virtualbox centos6_x86_64-base.json
virtualbox output will be in this color.

==> virtualbox: Downloading or copying Guest additions checksums
    virtualbox: Downloading or copying: http://download.virtualbox.org/virtualbo
x/4.3.6/SHA256SUMS
==> virtualbox: Downloading or copying Guest additions
    virtualbox: Downloading or copying: http://download.virtualbox.org/virtualbo
x/4.3.6/VBoxGuestAdditions_4.3.6.iso
    virtualbox: Download progress: 5%
    virtualbox: Download progress: 11%
    virtualbox: Download progress: 17%
    virtualbox: Download progress: 23%
    virtualbox: Download progress: 29%
    virtualbox: Download progress: 35%
    virtualbox: Download progress: 41%
    virtualbox: Download progress: 45%
    virtualbox: Download progress: 51%
    virtualbox: Download progress: 57%
    virtualbox: Download progress: 63%
    virtualbox: Download progress: 69%
    virtualbox: Download progress: 75%
    virtualbox: Download progress: 81%
    virtualbox: Download progress: 87%
    virtualbox: Download progress: 93%
    virtualbox: Download progress: 99%
==> virtualbox: Downloading or copying ISO
    virtualbox: Downloading or copying: http://192.168.xxx.xxx/CentOS-6.5-x86_64-m
inimal.iso
==> virtualbox: Creating virtual machine...
==> virtualbox: Creating hard drive...
==> virtualbox: Creating forwarded port mapping for SSH (host port 3499)
==> virtualbox: Executing custom VBoxManage commands...
    virtualbox: Executing: modifyvm centos6_x86_64-base --memory 512
    virtualbox: Executing: modifyvm centos6_x86_64-base --cpus 1
==> virtualbox: Starting the virtual machine...
==> virtualbox: Waiting 5s for boot...
==> virtualbox: Typing the boot command...
==> virtualbox: Waiting for SSH to become available...
==> virtualbox: Connected to SSH!
==> virtualbox: Uploading VirtualBox version info (4.3.6)
==> virtualbox: Uploading VirtualBox guest additions ISO...
==> virtualbox: Provisioning with shell script: scripts/eth1.sh
==> virtualbox: Gracefully halting virtual machine...
==> virtualbox: Preparing to export machine...
    virtualbox: Deleting forwarded port mapping for SSH (host port 3499)
==> virtualbox: Exporting virtual machine...
==> virtualbox: Unregistering and deleting virtual machine...
==> virtualbox: Running post-processor: vagrant
==> virtualbox (vagrant): Creating Vagrant box for 'virtualbox' provider
    virtualbox (vagrant): Copying: output-virtualbox\centos6_x86_64-base-disk1.v
mdk
    virtualbox (vagrant): Copying: output-virtualbox\centos6_x86_64-base.ovf
    virtualbox (vagrant): Renaming the OVF to box.ovf...
    virtualbox (vagrant): Compressing box...
    virtualbox (vagrant): Compressing: Vagrantfile
    virtualbox (vagrant): Compressing: box.ovf
    virtualbox (vagrant): Compressing: centos6_x86_64-base-disk1.vmdk
    virtualbox (vagrant): Compressing: metadata.json
Build 'virtualbox' finished.

==> Builds finished. The artifacts of successful builds are:
--> virtualbox: 'virtualbox' provider box: centos6_x86_64-base.box


エラーが出ず、終了したので、boxが出来たようです。

Vagrant経由でVMを起動してみる


次に作ったboxをVagrantから起動してみます。
起動に際し、以下のようなVagrantfileを用意しました。


ここで、eth1のネットワーク設定をいろいろ試したのですが、どうもうまくいかなかったので、
結局Packerで先に設定ファイルを組み込む方法をとりました。(無念)

ここでは「config.vm.network」でIPアドレスを指定していますが、このIPアドレスは実環境に反映されません。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define :centos6 do |centos6|
    centos6.vm.box = "centos6_x86_64-base"
    centos6.vm.box_url = "C:\\xxx\\xxx\\centos6_x86_64-base.box"
    centos6.vm.provider :virtualbox do |vb|
      vb.gui = true
    end
  end
  config.vm.network :private_network, ip: "192.168.xxx.xxx", virtualbox__intnet: "intnet"
end


vagrant up」すると先ほどPackerで作ったVMが正常に起動しました。
また、内部ネットワーク経由でSSHログインできることが確認できました。


今日はこんなところで。