2017年8月22日火曜日

packer を使って vmx ファイルを作成し vSphere 上に VM を作成してみた

概要

前回 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 のパスにちゃんとデータストアのパスが含まれていることを確認しましょう

参考サイト

0 件のコメント:

コメントを投稿