ESXiで作成したゲストVMからVagrant Boxを作成した時のメモ

#### **やってること**
ESXiで作成されたゲストVMをVagrant Box化したいという要望があった時に調べてやったこと。
とりあえずこれでできたけど、手順の抜け漏れがあるかも。

#### **検証環境**
検証環境は以下の通り。

- **登場人物**
  - **VMホスト**  
    ESXi 6.0.0 (esxi-host)
  - **Vagrant変換用サーバ**  
    CentOS 6.9 (vagrant-converter) # Minimal Desktopでインストール
  - **ゲストVM**  
    CentOS 6.9 (guest-vm) # Minimalでインストール
- **使用するソフトウェア**
  - **VirtualBox** 5.1.26  
    vagrant-converterとクライアントマシン(私の環境はWin7Pro)の双方にインストール
  - **Vagrant** 2.0.0  
    こちらもVirtualBoxと同様  
  - **ovftool**  
    VMWareが出してるツール。OVF<=>VMXの変換用

#### **事前の仕込み**  
##### **vagrant-converter**  
NFSサーバの設定を行い、ESXiのデータストアとしてマウント  

###### **1. NFS関係のパッケージをインストール**  

```
# yum -y install nfs-utils nfs-utils-lib nfs4-acl-tools
chkconfig nfs on
```

```
# mkdir -p /vargrant/{source,boxes}
# echo "/vagrant 192.168.1.0/24(rw,no_root_squash)" >> /etc/exports
```

```
# service nfs start
# service nfs status
```

###### **2. VirtualBoxをダウンロード&インストール**  

ここはGUIからやったほうが良いかも  

```
# cd /usr/local/src
# wget http://download.virtualbox.org/virtualbox/5.1.28/VirtualBox-5.1-5.1.28_117968_el6-1.x86_64.rpm
# yum localinstall VirtualBox-5.1-5.1.28_117968_el6-1.x86_64.rpm
```

###### **3. Vagrantをダウンロード&インストール**  

ここもGUIからやったほうが良いかも  

```
# cd /usr/local/src
# wget https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.rpm
# yum localinstall vagrant_2.0.0_x86_64.rpm  
```

###### **4. ovftoolのインストール**
VMWareのサイトからovftoolのインストーラをダウンロードしてくる  
(OS/アーキテクチャの組合せなど注意。my vmwareへの登録が必要かも)
ダウンロードしてきたらSCPなどで/usr/local/src下に配置

```
# cd /usr/local/src
# chmod 700 VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle
# ./VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle

Extracting VMware Installer...done.
You must accept the VMware OVF Tool component for Linux End User
License Agreement to continue.  Press Enter to proceed.[Enter]

...ライセンス条項が表示される。同意するなら[q]を入力...

Do you agree? [yes/no]:yes

The product is ready to be installed.  Press Enter to begin
installation or Ctrl-C to cancel.[Enter]

Installing VMware OVF Tool component for Linux 3.5.0
    Configuring...
[######################################################################] 100%
Installation was successful.

# ovftool --version
VMware ovftool 3.5.0 (build-1274719)
```

##### **esxi-host**  
###### **1. NFSデータストアのマウント**  
exportしたvagrant-converterのNFSボリュームをデータストアとしてマウントする  

```
# esxcfg-nas -a -o vagrant-converter -s /vagrant vagrant-converter
# ls /vmfs/volumes/vagrant-converter/
boxes   source
```

#### **guest-vm**  
###### **1. ESXi上でguest-vmを作成**  
インストールは割愛。  

###### **2. もろもろパッケージのインストール**  
VirtualBox Guest Additionsなど入れる時に必要  

```
# yum -y install kernel-devel kernel-headers gcc gcc-c++ perl wget unzip
```

###### **3. ネットワーク設定周りをいじる**  
MACアドレスとethを紐付ける設定が/etc/udev/rules.d/70-persistent-net.rulesに設定されているが、Vagrantで立ち上げた時に付与される仮想NICに意図しないethが割り振られるのを防ぐため/dev/nullにリンクする  

```
# ln -sf /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

ネットワーク設定ファイルを再定義する  

```
# cat << 'EOF' > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
TYPE=Ethernet
BOOTPROTO=dhcp
ONBOOT=yes
NETBOOT=yes
IPV6INIT=no
EOF
```

###### **4. vagrantユーザを作成する**  

```
# useradd -u 2000 vagrant
```

vagrantユーザでパスワードなしsudoが出来るように設定  

```
# echo "vagrant	ALL=(ALL)	NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
# chmod 400 /etc/sudoers.d/vagrant
```

###### **5. 公開鍵の設定**  
vagrantユーザで公開鍵認証出来るように公開鍵を設定する  
(コレvagrant upの時にinsecure_key使ってるからっていって再生成されちゃうみたい。Vagranfileで設定入れれば再生成を抑止できる)

```
# mkdir -p /home/vagrant/.ssh
# chmod 700 /home/vagrant/.ssh
# cd /usr/local/src
# wget https://github.com/hashicorp/vagrant/archive/master.zip
# unzip master.zip
# cat vagrant-master/keys/vagrant.pub >> /home/vagrant/.ssh/authorized_keys
# chmod 600 /home/vagrant/.ssh/authorized_keys
# chown -R vagrant:vagrant /home/vagrant/.ssh
# rm -rf master.zip vagrant-master
```

###### **6. ゲストVMをシャットダウン**  

```
# shutdown -h now
```

#### **esxi-host**
###### **1. ゲストVMをコピー**  
ゲストVMをVagrant Box8変換用サーバの所定ディレクトリにコピーしておく

```
# mkdir -p /vmfs/volumes/vagrant-converter/source/guest-vm
# \cp -p /vmfs/volumes/datastore1/guest-vm/guest-vm.vmx /vmfs/volumes/vagrant-converter/source/guest-vm/guest-vm.vmx
# vmkfstool -i /vmfs/volumes/datastore1/guest-vm/guest-vm.vmdk # /vmfs/volumes/vagrant-converter/source/guest-vm/guest-vm.vmdk -d thin
```

#### **vagrant-converter**
###### **1. ovftoolでVMの形式を変換**
コピーしたゲストVMをovftoolを使ってovf形式に変換する

```
# cd /vagrant/source/guest-vm
# ovftool guest-vm.vmx guest-vm.ovf
```

**※ここから先、Linux環境でやる場合とWin環境でやる場合を分けて書いてる。**

> 今回の検証環境がNestedVMな環境なので、ゲストを起動しようとするとVirtualBoxに怒られて起動できない。
> 仕方ないのでovfファイルとguest-vm-disk1.vmdkをローカル(Win環境)にSCPする。 

###### **2. VirtualBoxに変換したVMをインポートする**  

**Linux環境**  
VMインポート後、起動してVirtualBox Guest Additionsをインストールする

```
# インポート
# VBoxManage import guest-vm.ovf --vsys 0 --ostype "RedHat_64" --vsys 0 --vmname guest-vm --vsys 0 --cpus 1 --vsys 0 --memory 2048 --vsys 0 --unit 10 --disk /vagrant/VirtualBox\ VMs/guest-vm/guest-vm-disk1.vmdk

# 光学ドライブが消えちゃうのでstorageattachコマンドで光学ドライブを追加している。  
# VBoxManage storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
```

###### **VirtualBox Guest Additionsをインストールする**  
ゲストVM実行中に**[デバイス]** -> **[Guest Additions CDイメージの挿入]**をクリック
ゲストVM内でインストール作業を実行

```
# mount /dev/sr0 /media
# export KERN_DIR=/usr/src/kernels/x.x.xx-xxx.xx.x.el6.x86_64  # ここは任意のカーネルバージョンになる
# /media/VBoxLinuxAdditions.run
# umount /dev/sr0
# shutdown -h now
```

CDイメージの取り出し

```
# VBoxManage storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
```

**Win環境**
VMインポート後、起動してVirtualBox Guest Additionsをインストールする

```
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" import guest-vm.ovf --vsys 0 --ostype "RedHat_64" --vsys 0 --vmname guest-vm --vsys 0 --cpus 1 --vsys 0 --memory 2048  

> "C:\Program Files\Oracle\VirtualBox\VBoxManage" storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive

> "C:\Program Files\Oracle\VirtualBox\VBoxManage" modifyvm guest-vm --nic1 nat
```

###### **VirtualBox Guest Additionsをインストールする**  
ゲストVM実行中に [デバイス] -> [Guest Additions CDイメージの挿入]をクリック
ゲストVM内でインストール作業を実行

```
# mount /dev/sr0 /media
# export KERN_DIR=/usr/src/kernels/x.x.xx-xxx.xx.x.el6.x86_64  # ここは任意のカーネルバージョンになる
# /media/VBoxLinuxAdditions.run
# umount /dev/sr0
# shutdown -h now
```

CDイメージの取り出し

```
> "C:\Program Files\Oracle\VirtualBox\VBoxManage" storageattach guest-vm --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium emptydrive
```


###### **3. Vagrant Box化する**

```
# vagrant package --base guest-vm --output /vagrant/boxes/guest-vm.box
==> guest-vm: Exporting VM...
==> guest-vm: Compressing package to: /vagrant/boxes/guest-vm.box
```

###### **4. Vagrantfileの作成**  
Vagrantfileを作成する。
とりあえず起動するのに必要最小限で。

```
# vagrant init
# vi Vagrantfile
```

```file:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "guest-vm.box"
  # vagrant up時にinsecure_private_keyのペアから書き換えられるのを防ぐ(推奨されないけども)
  config.ssh.insert_key = false
end
```

###### **5. vagrant upを実行**  
起動してみる

```
# vagrant box add guest-vm guest-vm.box
# vagrant up
```

こんな感じ。