最近色々な検証にVirtualBoxを使っていますが、VMを毎回作るのも辛いので、VagrantとPackerを試してみたときのメモです。
今回試した環境は以下の通りです。
- Windows7 Enterprise ServicePack1 64bit版
- VirtualBox 4.3.6-91406
- Vagrant 1.4.1
- Packer 0.4.1
Packerで作成するVMはCentO6.5の64bit版を選定しました。
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の環境を簡単にまとめます。
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ログインできることが確認できました。
今日はこんなところで。