hidemium's blog

日々学んだことをアウトプットする。

vSphere7.0U3でのcloud-initを利用した仮想マシンのカスタマイズ

vSphere7.0U3からcloud-initを使った仮想マシンのカスタマイズがサポートされるようになりました。vSphere環境でのcloud-initの設定方法について書いてみようと思います。

構成

  • vCenter 7.0 U3
  • ESXi 7.0 Update 3
  • Ubuntu 22.04 (テンプレートVM)

cloud-initを利用するための要件

以下のKBにcloud-initを利用するための要件の記載がありました。

https://kb.vmware.com/s/article/82250

Prerequisites
• Ensure that vSphere version is 7.0 Update 3 or later
• Ensure that VMware Tools version 11.3.0 or later is installed.
• Ensure that cloud-init version 21.1 or later is installed.

このあたりのバージョンを満たしているUbuntu 22.04を利用して手順を試してみました。

テンプレートVMの作成

テンプレートVMを用意するために以下の設定を行っていきます。

まずは、Ubuntu 22.04のISOイメージを用意し、Ubuntu 22.04のOSをインストールします。

OSのインストール後に、スナップショットを取っておきます。(その後の操作でログインができない状態となるとOSのインストールから再開する必要があるため)

次に、cloud-initの構成ファイルの末尾のエントリに次を追加します。

この設定は分かりにくいですが、 disable_vmware_customizationfalse でcloud-initによるカスタマイズを有効にする設定となり、 true仮想マシンのカスタマイズ仕様によるカスタマイズを有効にする設定となります。

$ sudo vi /etc/cloud/cloud.cfg
disable_vmware_customization: false

次のファイルを削除します。

$ cd  /etc/cloud/cloud.cfg.d/
$ sudo rm 99-installer.cfg
$ sudo rm subquity-disable-cloudinit-networking.cfg

cloud-initコマンドでクリーン操作を実施します。その後シャットダウンを行います。

$ sudo /usr/bin/cloud-init clean --logs
$ sudo shutdown -h now

テンプレートからVMのクローン

テンプレートからカスタマイズを行うVMをクローンにより作成します。

この時電源はオフのままとします。

cloud-initのメタデータの作成

cloud-initによるカスタマイズを行うために、metadata.yamlとuserdata.yamlを用意します。

ネットワークをstaticに設定を行いたい場合は以下のように設定を行います。

instance-idは設定を行わない場合は、 /sys/class/dmi/id/product_uuid から読み取られるようです。

$ vi metadata.yaml
instance-id: ubuntu22-1
local-hostname: ubuntu22-1
hostname: ubuntu22-1
network:
  version: 2
  ethernets:
    ens192:
      dhcp4: false
      addresses:
      - 192.168.1.2/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
        - 192.168.1.1

ネットワークをDHCPで設定を行いたい場合は以下のように設定を行います。

$ vi metadata.yaml
instance-id: ubuntu22-1
local-hostname: ubuntu22-1
hostname: ubuntu22-1
network:
  version: 2
  ethernets:
    ens192:
      dhcp4: true

公開鍵認証を行うユーザを新規に追加する場合は、以下のように設定します。また、必要なパッケージも追加することで自動インストールすることができます。

$ vi userdata.yaml
#cloud-config

users:
  - default
  - name: username
    ssh_authorized_keys:
      - 公開鍵をペースト
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo, wheel
    lock_passwd: true
    shell: /bin/bash
 
packages:
    - 必要なパッケージ名を追加

govcによるメタデータの追加

メタデータは、仮想マシンの以下のパラメータに追加することでゲストOS側に受け渡すことができます。

guestinfo.metadata
guestinfo.metadata.encoding
guestinfo.userdata
guestinfo.userdata.encoding

vSphere Clinetでメタデータを追加することも可能ですが、govcを使った方法が簡単なため、こちらで設定を行います。

以下の手順でgovcのインストールを行います。また、合わせて環境変数を設定しておきます。

$ curl -L -o - "https://github.com/vmware/govmomi/releases/latest/download/govc_$(uname -s)_$(uname -m).tar.gz" | sudo tar -C /usr/local/bin -xvzf - govc
$ export GOVC_URL=https://<vcenter fqdn>/sdk
$ export GOVC_USERNAME="username"
$ export GOVC_PASSWORD="password"
$ export GOVC_INSECURE="1"
$ export VM="/Datacenter/vm/path/to/vm name"
$ govc vm.info "${VM}"
Name:              vm name
  Path:            /Datacenter/vm/path/to/vm name
  Guest name:      Ubuntu Linux (64-bit)
  Memory:          2048MB
  CPU:             1 vCPU(s)
  Power state:     poweredOff
  Boot time:       <nil>
  IP address:   
  Host:            hostname

環境変数メタデータとユーザーデータの値を設定します。

export METADATA=$(gzip -c9 <metadata.yaml | { base64 -w0 2>/dev/null || base64; })      USERDATA=$(gzip -c9 <userdata.yaml | { base64 -w0 2>/dev/null || base64; })

VMメタデータとユーザデータを設定します。

govc vm.change -vm "${VM}" -e guestinfo.metadata="${METADATA}" -e guestinfo.metadata.encoding="gzip+base64" -e guestinfo.userdata="${USERDATA}" -e guestinfo.userdata.encoding="gzip+base64"

VMの電源を入れます。

govc vm.power -on "${VM}"

VMが起動後に、公開鍵認証を利用してsshでログインできることを確認します。

ssh username@192.168.1.2

vSphere環境でもcloud-initが利用できるようになり、より自動化がしやすくなっていくのでは思います。

参考