概要
前回 packer を使って AWS 上に AMI を作成してみました
今回は VMware Builder という vSphere 上に VM を作成できる機能を試してみました
環境
- ESXi 6.5.0
- Ubuntu 16.04
- packer 1.0.4
ESXi 準備
今回ビルドは ESXi 上で行います
ローカルでもできるのですが、VMware workstation なるものをインストールしなければいけないらしく自分にとってはハードルが高かったのでビルド用の ESXi を用意しました
ESXi の IP は 192.168.100.6 とします
SSH の有効化
ESXi に SSH できるようにしてください
GuestIPHack の有効化
GuestIPHack という設定を有効にします
これもコマンドから行います
- esxcli system settings advanced set -o /Net/GuestIPHack -i 1
- esxcli system settings advanced list | grep -A 9 ‘/Net/GuestIPHack’
で有効になっていれば OK です
再起動は不要です
VNC ポートをオープンする
ESXi に VNC のポート (5900 番) でアクセスできる必要があります
ESXi のファイアウォールを管理するファイルを直接編集してオープンします
- chmod 644 /etc/vmware/firewall/service.xml
- chmod +t /etc/vmware/firewall/service.xml
- vi /etc/vmware/firewall/service.xml
<service id="1000">
<id>packer-vnc</id>
<rule id="0000">
<direction>inbound</direction>
<protocol>tcp</protocol>
<porttype>dst</porttype>
<port>
<begin>5900</begin>
<end>6000</end>
</port>
</rule>
<enabled>true</enabled>
<required>true</required>
</service>
- chmod 444 /etc/vmware/firewall/service.xml
- esxcli network firewall refresh
で OK です
ストレージの準備
ストレージを用意しましょう
デフォルトで付いているローカルストレージでも OK です
この領域に iso ファイルをアップロードします
今回は ESXi に datastore1 というストレージをマウントしました
packer インストール
構築した ESXi にアクセスできるサーバを準備します
今回は Ubuntu 16.04 を準備しました
そのサーバに packer をインストールします
インストール方法は以下を参考にしてください
リソースファイルの取得
今回は既存のリソースファイルを拝借します
これに含まれている preseed と scripts を使いまわします
テンプレート json の準備
実行するテンプレート json を準備します
今回は Ubuntu をビルドします
まずは変数を管理するファイルを作成します
- cd packer-esxi
- vim variables.json
{
"esxi_host": "192.168.100.6",
"esxi_datastore": "datastore1/primary",
"esxi_username": "root",
"esxi_password": "root_password"
}
特に説明は不要かなと思います
esxi_datastore は指定したパスにディレクトリを作成します
用意したストレージ上に作成されるように指定してください
次にテンプレート json です
長いです
- cd packer-esxi
- vim my-ubuntu-1604-base.json
{
"builders": [{
"name": "ubuntu-1604-base",
"vm_name": "ubuntu-1604-base",
"type": "vmware-iso",
"guest_os_type": "ubuntu-64",
"tools_upload_flavor": "linux",
"headless": false,
"iso_url": "http://releases.ubuntu.com/xenial/ubuntu-16.04.3-server-amd64.iso",
"iso_checksum": "a06cd926f5855d4f21fb4bc9978a35312f815fbda0d0ef7fdc846861f4fc4600",
"iso_checksum_type": "sha256",
"ssh_username": "nullgrid",
"ssh_password": "nullgrid",
"ssh_timeout": "15m",
"disk_type_id": "thin",
"floppy_files": [
"preseed/ubuntu.cfg"
],
"boot_command": [
"<enter><wait><f6><esc><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
"<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
"<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
"<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs>",
"/install/vmlinuz noapic ",
"preseed/file=/floppy/ubuntu.cfg ",
"debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
"hostname={{ .Name }} ",
"fb=false debconf/frontend=noninteractive ",
"keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA ",
"keyboard-configuration/variant=USA console-setup/ask_detect=false ",
"grub-installer/bootdev=/dev/sda ",
"initrd=/install/initrd.gz -- <enter>"
],
"shutdown_command": "echo 'shutdown -P now' > shutdown.sh; echo 'nullgrid'|sudo -S sh 'shutdown.sh'",
"remote_type": "esx5",
"remote_host": "{{user `esxi_host`}}",
"remote_datastore": "{{user `esxi_datastore`}}",
"remote_username": "{{user `esxi_username`}}",
"remote_password": "{{user `esxi_password`}}",
"keep_registered": true,
"vmx_data": {
"ethernet0.networkName": "VM Network"
},
"vnc_port_min": "5900",
"vnc_port_max": "5911",
"vnc_bind_address": "0.0.0.0",
"vnc_disable_password": "true"
}],
"provisioners": [
{
"type": "shell",
"scripts": [
"scripts/open-vm-tools.sh"
],
"execute_command": "echo 'nullgrid' | {{ .Vars }} sudo -E -S bash '{{ .Path }}'"
}
]
}
簡単にポイントを説明します
iso_url, iso_checksum でダウンロードする iso を指定します
フロッピーディスクを接続し preseed ディレクトリをマウントしています
そして一番のポイントは boot_command です
普通 iso から OS をインストールする場合 GUI でポチポチしていきますが packer の場合ここに記載したコマンドを自動で実行します
これを VNC を使って実行するため VNC のポートを開放しています
また作成した VM 上でも VNC が立ち上がっています
boot_command 内でフロッピーにマウントした preseed/ubuntu.cfg を元に細かい OS の初期設定を行っています
あとはビルドする ESXi の場所や VNC のポートを指定しています
packer 実行
- cd packer-esxi
- packer build -var-file variables.json my-ubuntu-1604-base.json
でビルドが始まります
結構ログが長いですが以下のようになれば成功です
ubuntu-1604-base output will be in this color.
==> ubuntu-1604-base: Downloading or copying ISO
ubuntu-1604-base: Downloading or copying: http://releases.ubuntu.com/xenial/ubuntu-16.04.3-server-amd64.iso
==> ubuntu-1604-base: Creating floppy disk...
ubuntu-1604-base: Copying files flatly from floppy_files
ubuntu-1604-base: Copying file: preseed/ubuntu.cfg
ubuntu-1604-base: Done copying files from floppy_files
ubuntu-1604-base: Collecting paths from floppy_dirs
ubuntu-1604-base: Resulting paths from floppy_dirs : []
ubuntu-1604-base: Done copying paths from floppy_dirs
==> ubuntu-1604-base: Uploading Floppy to remote machine...
==> ubuntu-1604-base: Uploading ISO to remote machine...
==> ubuntu-1604-base: Creating virtual machine disk
==> ubuntu-1604-base: Building and writing VMX file
==> ubuntu-1604-base: Registering remote VM...
==> ubuntu-1604-base: Starting virtual machine...
==> ubuntu-1604-base: Waiting 10s for boot...
==> ubuntu-1604-base: Connecting to VM via VNC
==> ubuntu-1604-base: Typing the boot command over VNC...
==> ubuntu-1604-base: Waiting for SSH to become available...
==> ubuntu-1604-base: Connected to SSH!
==> ubuntu-1604-base: Provisioning with shell script: scripts/open-vm-tools.sh
ubuntu-1604-base: Reading package lists...
ubuntu-1604-base: Building dependency tree...
ubuntu-1604-base: Reading state information...
ubuntu-1604-base: The following additional packages will be installed:
ubuntu-1604-base: ethtool libdumbnet1 libmspack0 zerofree
ubuntu-1604-base: Suggested packages:
ubuntu-1604-base: open-vm-tools-desktop
ubuntu-1604-base: The following NEW packages will be installed:
ubuntu-1604-base: ethtool libdumbnet1 libmspack0 open-vm-tools zerofree
ubuntu-1604-base: 0 upgraded, 5 newly installed, 0 to remove and 6 not upgraded.
ubuntu-1604-base: Need to get 601 kB of archives.
ubuntu-1604-base: After this operation, 2,224 kB of additional disk space will be used.
ubuntu-1604-base: Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 ethtool amd64 1:4.5-1 [97.5 kB]
ubuntu-1604-base: Get:2 http://archive.ubuntu.com/ubuntu xenial/main amd64 libdumbnet1 amd64 1.12-7 [25.7 kB]
ubuntu-1604-base: Get:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libmspack0 amd64 0.5-1ubuntu0.16.04.1 [37.0 kB]
ubuntu-1604-base: Get:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 open-vm-tools amd64 2:10.0.7-3227872-5ubuntu1~16.04.1 [433 kB]
ubuntu-1604-base: Get:5 http://archive.ubuntu.com/ubuntu xenial/main amd64 zerofree amd64 1.0.3-1 [7,928 B]
ubuntu-1604-base: [sudo] password for nullgrid: debconf: unable to initialize frontend: Dialog
ubuntu-1604-base: debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
ubuntu-1604-base: debconf: falling back to frontend: Readline
ubuntu-1604-base: debconf: unable to initialize frontend: Readline
ubuntu-1604-base: debconf: (This frontend requires a controlling tty.)
ubuntu-1604-base: debconf: falling back to frontend: Teletype
ubuntu-1604-base: dpkg-preconfigure: unable to re-open stdin:
ubuntu-1604-base: Fetched 601 kB in 1s (348 kB/s)
ubuntu-1604-base: Selecting previously unselected package ethtool.
ubuntu-1604-base: (Reading database ... 59034 files and directories currently installed.)
ubuntu-1604-base: Preparing to unpack .../ethtool_1%3a4.5-1_amd64.deb ...
ubuntu-1604-base: Unpacking ethtool (1:4.5-1) ...
ubuntu-1604-base: Selecting previously unselected package libdumbnet1:amd64.
ubuntu-1604-base: Preparing to unpack .../libdumbnet1_1.12-7_amd64.deb ...
ubuntu-1604-base: Unpacking libdumbnet1:amd64 (1.12-7) ...
ubuntu-1604-base: Selecting previously unselected package libmspack0:amd64.
ubuntu-1604-base: Preparing to unpack .../libmspack0_0.5-1ubuntu0.16.04.1_amd64.deb ...
ubuntu-1604-base: Unpacking libmspack0:amd64 (0.5-1ubuntu0.16.04.1) ...
ubuntu-1604-base: Selecting previously unselected package open-vm-tools.
ubuntu-1604-base: Preparing to unpack .../open-vm-tools_2%3a10.0.7-3227872-5ubuntu1~16.04.1_amd64.deb ...
ubuntu-1604-base: Unpacking open-vm-tools (2:10.0.7-3227872-5ubuntu1~16.04.1) ...
ubuntu-1604-base: Selecting previously unselected package zerofree.
ubuntu-1604-base: Preparing to unpack .../zerofree_1.0.3-1_amd64.deb ...
ubuntu-1604-base: Unpacking zerofree (1.0.3-1) ...
ubuntu-1604-base: Processing triggers for man-db (2.7.5-1) ...
ubuntu-1604-base: Processing triggers for libc-bin (2.23-0ubuntu9) ...
ubuntu-1604-base: Processing triggers for systemd (229-4ubuntu19) ...
ubuntu-1604-base: Processing triggers for ureadahead (0.100.0-19) ...
ubuntu-1604-base: Setting up ethtool (1:4.5-1) ...
ubuntu-1604-base: Setting up libdumbnet1:amd64 (1.12-7) ...
ubuntu-1604-base: Setting up libmspack0:amd64 (0.5-1ubuntu0.16.04.1) ...
ubuntu-1604-base: Setting up open-vm-tools (2:10.0.7-3227872-5ubuntu1~16.04.1) ...
ubuntu-1604-base: Setting up zerofree (1.0.3-1) ...
ubuntu-1604-base: Processing triggers for libc-bin (2.23-0ubuntu9) ...
ubuntu-1604-base: Processing triggers for systemd (229-4ubuntu19) ...
ubuntu-1604-base: Processing triggers for ureadahead (0.100.0-19) ...
==> ubuntu-1604-base: Gracefully halting virtual machine...
ubuntu-1604-base: Waiting for VMware to clean up after itself...
==> ubuntu-1604-base: Deleting unnecessary VMware files...
ubuntu-1604-base: Deleting: /vmfs/volumes/datastore1/primary/output-ubuntu-1604-base/vmware.log
==> ubuntu-1604-base: Compacting the disk image
==> ubuntu-1604-base: Cleaning VMX prior to finishing up...
ubuntu-1604-base: Unmounting floppy from VMX...
ubuntu-1604-base: Detaching ISO from CD-ROM device...
ubuntu-1604-base: Disabling VNC server...
==> ubuntu-1604-base: Keeping virtual machine registered with ESX host (keep_registered = true)
Build 'ubuntu-1604-base' finished.
==> Builds finished. The artifacts of successful builds are:
--> ubuntu-1604-base: VM files in directory: /vmfs/volumes/datastore1/primary/output-ubuntu-1604-base
成功すると ESXi 上に vmx ファイルと vmdk ファイルができています
[root@esxi:~] ls -ltr /vmfs/volumes/datastore1/primary/output-ubuntu-1604-base
total 2373640
-rw-r--r-- 1 root root 0 Aug 21 02:07 ubuntu-1604-base.vmsd
-rw------- 1 root root 546 Aug 21 02:16 disk.vmdk
-rw------- 1 root root 8684 Aug 21 02:16 ubuntu-1604-base.nvram
-rw------- 1 root root 41943040000 Aug 21 02:16 disk-flat.vmdk
-rw-r--r-- 1 root root 2448 Aug 21 02:16 ubuntu-1604-base.vmx
インスタンスはすでに Discoverd virtual machine ディレクトリ配下にあります
試しに起動して中を確認してみましょう
192.168.100.7 は packer で作成した Ubuntu VM です
- ssh nullgrid@192.168.100.7
nullgrid@unassigned-hostname:~$ dpkg -l | grep open-vm-tools
ii open-vm-tools 2:10.0.7-3227872-5ubuntu1~16.04.1 amd64 Open VMware Tools for virtual machines hosted on VMware (CLI)
こんな感じで open-vm-tools がインストールされていれば OK です
最後に
packer の VMware Builder を使って vmx ファイルと vmdk ファイルを作成してみました
前回試した AWS 上に AMI を作成する手順よりも、今回のほうが実行するまでの環境を準備するのが結構大変でした
vmx ファイルではなく ovf ファイルを作成することもできるので別に機会に試してみたいと思います
トラブルシューティング
mkdir: can't create directory '/vmfs/volumes/primary': Operation not permitted
が出る場合は variables.json の esxi_datastore のパスにちゃんとデータストアのパスが含まれていることを確認しましょう
参考サイト