hidemium's blog

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

vSphere7.0U3でのcloudbase-initを利用したWindowsのカスタマイズ

前回は、cloud-initを使った仮想マシンのカスタマイズについて試してみました。今回は、vSphere環境でのWindowsのcloudbase-initの設定方法について書いてみようと思います。

hidemium.hatenablog.com

構成

  • vCenter 7.0 U3
  • ESXi 7.0 Update 3
  • Windows Server 2019 (テンプレートVM)

テンプレートVMの作成

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

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

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

次に、cloudbase-initのインストーラーを以下でダウンロードします。

https://cloudbase.it/cloudbase-init/#download

CloudbaseInitSetup_1_1_2_x64.msi を実行し、インストールを行っていきます。

  1. セットアップウィザードでNextをクリックします。
  2. I accept the terms in the License Agreementをチェックし、Nextをクリックします。
  3. 特に変更せずに、Nextをクリックします。
  4. Use metadata passwodのチェックはそのままにし、Run Cloudbase-init service as LocalSystemをチェックし、Nextをクリックします。
  5. Installをクリックします。
  6. インストーラーをそのままの状態にし、C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf をメモ帳で開き以下のように修正します。
[DEFAULT]
username=Admin
groups=Administrators
inject_user_password=true
config_drive_raw_hhd=true
config_drive_cdrom=true
config_drive_vfat=true
bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
verbose=true
debug=true
logdir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
logfile=cloudbase-init.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
logging_serial_port_settings=
mtu_use_dhcp_config=true
ntp_use_dhcp_config=true
local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
check_latest_version=true
metadata_services=cloudbaseinit.metadata.services.vmwareguestinfoservice.VMwareGuestInfoService
plugins=cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin,cloudbaseinit.plugins.windows.createuser.CreateUserPlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin
  1. C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init-unattend.conf をメモ帳で開き以下のように修正します。
[DEFAULT]
username=Admin
groups=Administrators
inject_user_password=true
config_drive_raw_hhd=true
config_drive_cdrom=true
config_drive_vfat=true
bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe
mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\
verbose=true
debug=true
logdir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
logfile=cloudbase-init-unattend.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN
logging_serial_port_settings=
mtu_use_dhcp_config=true
ntp_use_dhcp_config=true
local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\
check_latest_version=false
metadata_services=cloudbaseinit.metadata.services.vmwareguestinfoservice.VMwareGuestInfoService
plugins=cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.common.userdata.UserDataPlugin,cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin,cloudbaseinit.plugins.windows.createuser.CreateUserPlugin,cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin,cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin
allow_reboot=false
stop_service_on_exit=false
  1. 最後に、Run Sysprep to cretate a generalized imageとShutdown when Sysprep treminatesにチェックを入れFinishをクリックします。
  2. syspreが実行され、仮想マシンの電源が停止します。

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

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

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

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

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

$ vi metadata-windows.yaml
instance-id: windows2019-1
local-hostname: windows2019-1
admin-password: password

VMwareGuestInfoServiceのネットワークの設定は、まだ実装されていないようです。(PRのマージ待ち)

VMwareGuestInfoService is not implementing static network configuration · Issue #78 · cloudbase/cloudbase-init · GitHub

ファイルを作成したい場合は以下のように設定を行います。

$ vi userdata-windows.yaml
#cloud-config
write_files:
- encoding: gz+b64
  content: ファイルに記載したい内容をgzip+base64でエンコードした内容を貼り付け
  path: C:\\vmware-guestinfo-cloudinit-datasource.txt

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:      Microsoft Windows Server 2019 (64-bit)
  Memory:          4096MB
  CPU:             2 vCPU(s)
  Power state:     poweredOff
  Boot time:       <nil>
  IP address:   
  Host:            hostname

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

export METADATA=$(gzip -c9 <metadata-windows.yaml | { base64 -w0 2>/dev/null || base64; })      USERDATA=$(gzip -c9 <userdata-windows.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が起動後に、コンソールで接続すると、Administratorユーザのパスワードのリセットが求められるため、新しいパスワードを設定します。

ログインユーザの追加の動作について

Administratorsグループに所属する、Adminユーザが作成され、初回ログイン時にmetadataで指定したパスワードを入力すると、パスワードの更新が求められました。

metadataで追加ユーザのパスワード指定を行う場合は、 CreateUserPlugin だけではなく、 SetUserPasswordPlugin の指定も必要でした。

参考