vSphere7.0U3からcloud-initを使った仮想マシンのカスタマイズがサポートされるようになりました。vSphere環境でのcloud-initの設定方法について書いてみようと思います。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Ubuntu 22.04 (テンプレートVM)
- open-vm-tools 11.3.5
- cloud-init 22.2
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_customization
が false
で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; })
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が利用できるようになり、より自動化がしやすくなっていくのでは思います。