読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

Vagrant用にUnixBenchなBoxをPackerで作った

Packer Vagrant Linux


ヒュー・グラント向けに雲丹弁なボックスをパッカーンて?

先日、Lenovo ThinkPad P70をお借りしたのです。

osa030.hatenablog.com

でもって仮想環境のベンチをしたのだけれども、毎回色々と作るのは流石に非生産的なので、楽をしようとして事前に頑張った苦労話を。

実行環境

ソフトウェア バージョン URL
Packer 0.10.0 Packer by HashiCorp
Vagrant 1.8.1 Vagrant by HashiCorp
VirtualBox 5.0.16 r105871 Oracle VM VirtualBox
Git for Windows 2.8.1 Git for Windows

なお、OSはWindows7及び10で動作確認している。以降のコマンドラインはGit Bashで。

VagrantのBoxの作成

Packerのインストール

www.packer.io

自分の環境に合わせたものをインストール。今回はWindows(x64)版。

https://releases.hashicorp.com/packer/0.10.0/packer_0.10.0_windows_amd64.zip

ダウンロードしたzipを任意の場所に展開。

$ ls /C/App/packer_0.10.0/
packer.exe

旧バージョンでは色々と会った気がするけど最新版(0.10.0)ではexeがひとつになったようだ。

カスタムBox作成の作成

まずはPackerのBox作成の雛形を取得する。今回の対象はUbuntuなのでそれだけcloneする。

github.com

$ git clone https://github.com/boxcutter/ubuntu.git
$ cd ubuntu
カスタムスクリプトの作成
$ vi script/unixbench.sh

ベースに対して、独自で追加したいものをubuntu/script配下の他のスクリプトを参考に作成する。

#!/bin/bash

if [[ ! "$UNIXBENCH" =~ ^(true|yes|on|1|TRUE|YES|ON])$ ]]; then
  exit
fi

SSH_USER=${SSH_USERNAME:-vagrant}

echo "==> Checking version of Ubuntu"
. /etc/lsb-release

if [[ $DISTRIB_RELEASE == 12.04 ]]; then
	exit

elif [[ $DISTRIB_RELEASE == 14.04 || $DISTRIB_RELEASE == 15.04 ]]; then
    echo "==> Installing unix-bench"
    apt-get install build-essential

    USERNAME=${SSH_USER}
    cd /home/${USERNAME}
    wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
    tar xf UnixBench5.1.3.tgz
    rm UnixBench5.1.3.tgz
fi

今回は14.04をターゲットなので12.04は適当

設定ファイルの作成

UbuntuサーバのBox作成用の設定ファイルに対して、先ほど作成したスクリプトを呼ぶように修正を入れる。

$ vi ubuntu.json

以下、修正内容。

--- ubuntu.json.org     2016-04-01 21:13:44.593674900 +0900
+++ ubuntu.json 2016-04-01 21:16:37.360709200 +0900
@@ -166,6 +166,7 @@
         "CM_VERSION={{user `cm_version`}}",
         "CLEANUP_PAUSE={{user `cleanup_pause`}}",
         "DESKTOP={{user `desktop`}}",
+        "UNIXBENCH={{user `unixbench`}}",
         "DOCKER={{user `docker`}}",
         "UPDATE={{user `update`}}",
         "INSTALL_VAGRANT_KEY={{user `install_vagrant_key`}}",
@@ -181,6 +182,7 @@
       "scripts": [
         "script/update.sh",
         "script/desktop.sh",
+        "script/unixbench.sh",
         "script/vagrant.sh",
         "script/sshd.sh",
         "script/vmware.sh",
$ cp ubuntu1404.json ubuntu1404-unixbench.json
$ vi ubuntu1404-unixbench.json

以下、修正内容。

--- ubuntu1404.json     2016-04-01 21:11:08.147149400 +0900
+++ ubuntu1404-unixbench.json   2016-04-01 21:28:14.757243800 +0900
@@ -1,6 +1,7 @@
 {
-  "_comment": "Build with `packer build -var-file=ubuntu1404.json ubuntu.json`",
-  "vm_name": "ubuntu1404",
+  "_comment": "Build with `packer build -var-file=ubuntu1404-unixbench.json ubuntu.json`",
+  "vm_name": "ubuntu1404-unixbench",
+  "unixbench": "true",
   "cpus": "1",
   "disk_size": "65536",
   "iso_checksum": "3ffb7a3690ce9a07ac4a4d1b829f990681f7e47d",

設定ファイルが作成できたのでいよいよBox作成の開始。VagrantでVirtualBoxを使うだけなのでvirtualBox用のイメージだけ作成する。コマンド実行後、isoイメージのダウンロードからVM作成して色々インストールが走るのでそこそこ時間がかかる。

$ packer build -only=virtualbox-iso -var-file=ubuntu1404-unixbench.json ubuntu.json
(snip)
   virtualbox-iso: ==> Installing unix-bench
    virtualbox-iso: Reading package lists...
    virtualbox-iso: Building dependency tree...
    virtualbox-iso: Reading state information...
    virtualbox-iso: build-essential is already the newest version.
    virtualbox-iso: 0 upgraded, 0 newly installed, 0 to remove and 30 not upgraded.
    virtualbox-iso: [sudo] password for vagrant: --2016-04-01 21:25:21--  http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
    virtualbox-iso: Resolving byte-unixbench.googlecode.com (byte-unixbench.googlecode.com)... 74.125.23.82
    virtualbox-iso: Connecting to byte-unixbench.googlecode.com (byte-unixbench.googlecode.com)|74.125.23.82|:80... connected.
    virtualbox-iso: HTTP request sent, awaiting response... 200 OK
    virtualbox-iso: Length: 143259 (140K) [application/x-gzip]
    virtualbox-iso: Saving to: ‘UnixBench5.1.3.tgz’
(snip)
==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: box/virtualbox/ubuntu1404-unixbench-nocm-0.1.0.box

Box作成が完了すると以下にBoxイメージができる。

$ ls box/virtualbox/
ubuntu1404-unixbench-nocm-0.1.0.box

Vagrantで起動

Vagrantのインストール

www.vagrantup.com

自分の環境に合わせたものをインストール。今回はWindows版。

https://releases.hashicorp.com/vagrant/1.8.1/vagrant_1.8.1.msi

ダウンロードしたインストーラを起動して任意の場所にインストール。

Boxの登録

先ほどのPackerで作成したBoxをvagrantに登録。以下は先程作業したディレクトリで叩いた例

$ vagrant box add ubuntu1404unixbench box/virtualbox/ubuntu1404-unixbench-nocm-0.1.0.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu1404unixbench' (v0) for provider:
    box: Unpacking necessary files from: file://C:/AppData/Packer/ubuntu/box/virtualbox/ubuntu1404-unixbench-nocm-0.1.0.box
    box: Progress: 100% (Rate: 164M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'ubuntu1404unixbench' (v0) for 'virtualbox'!
$ vagrant box list
ubuntu1404unixbench       (virtualbox, 0)

Vagrantの起動/sshログイン

$ vagrant init ubuntu1404unixbench
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.2.0-27-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
----------------------------------------------------------------
  Ubuntu 14.04.4 LTS                          built 2016-04-01
----------------------------------------------------------------
Last login: Fri Apr  1 12:39:14 2016 from 10.0.2.2
vagrant@vagrant:~$ ls
UnixBench
vagrant@vagrant:~$ nproc
1
vagrant@vagrant:~$ cat /proc/meminfo | grep MemTotal
MemTotal:         500808 kB

とここまでは成功。

Vagrantで起動するVMのスペックをホストPCのスペックで変える

デフォルトの設定だとホストPCの性能が異なってもVMのCPUとメモリが固定になる。ホストPCのスペックに応じて変える用にしてみる。

$ vagrant destroy
$ vi Vagrantfile

以下、修正内容。

--- Vagrantfile.org     2016-04-01 21:37:56.332517700 +0900
+++ Vagrantfile 2016-04-01 21:49:12.047308900 +0900
 @@ -68,4 +68,11 @@
   #   sudo apt-get update
   #   sudo apt-get install -y apache2
   # SHELL
+  cpus = `wmic cpu get NumberOfLogicalProcessors`.split("\n")[2].to_i / 2
+  mem = `wmic OS get TotalVisibleMemorySize`.split("\n")[2].to_i / 1024 /4
+  config.vm.provider :virtualbox do |v|
+    v.customize ["modifyvm", :id, "--memory", mem]
+    v.customize ["modifyvm", :id, "--cpus", cpus]
+  end
 end

今回はVagrantの実行環境がWindowsなのでWindowsのコマンドで論理プロセッサ数と実メモリを取得しているが、他のOSでもコマンド実行部分を変更すれば動くでしょう、多分。

$ vagrant up
$ vagrant ssh
vagrant@vagrant:~$ nproc
2
vagrant@vagrant:~$ cat /proc/meminfo | grep MemTotal
MemTotal:        3045040 kB

Vagrantで複数VMを起動する

今度は同じ構成のVMをN個起動したい場合のやつ。ベタに記述してもいいのだけれどもせっかくなので環境変数で任意の数を指定しちゃおう。

$ vagrant destroy
$ vi Vagrantfile
--- Vagrantfile.org     2016-04-14 19:24:07.765267500 +0900
+++ Vagrantfile 2016-04-14 19:48:12.595722000 +0900
@@ -12,8 +12,13 @@

   # Every Vagrant development environment requires a box. You can search for
   # boxes at https://atlas.hashicorp.com/search.
-  config.vm.box = "base"
-
+  config.vm.box = "ubuntu1404unixbench"
+
+  if ENV.has_key?("MULTI")
+    (1..ENV["MULTI"].to_i).each do |i|
+      config.vm.define "vm-#{i}"
+    end
+  end
   # Disable automatic box update checking. If you disable this, then
   # boxes will only be checked for updates when the user runs
   # `vagrant box outdated`. This is not recommended.


環境変数が指定されている場合のみ複数起動する。なければ通常のまま。

 $ MULTI=3 vagrant up
 $ MULTI=3 vagrant status
Current machine states:

vm-1                      running (virtualbox)
vm-2                      running (virtualbox)
vm-3                      running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

$ MULTI=3 vagrant ssh vm-1
$ MULTI=3 vagrant destroy

注意点としては、vagrantコマンドを実行する度にVagrantfileが解釈されるので、常に環境変数を指定しないと駄目ということ。

ということで、これでホストPCのスペック次第で10個とか同時に起動できます。

f:id:osa030:20160405224344j:plain

DevOpsを支えるHashiCorpツール大全 Think IT Books

DevOpsを支えるHashiCorpツール大全 Think IT Books

Vagrant入門ガイド

Vagrant入門ガイド

おうちで学べる仮想化のきほん

おうちで学べる仮想化のきほん

スポンサーリンク