前回は、cloud-initを使った仮想マシンのカスタマイズについて試してみました。今回は、vSphere環境でのWindowsのcloudbase-initの設定方法について書いてみようと思います。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Windows Server 2019 (テンプレートVM)
- open-vm-tools 11.3.5
- cloudbase-init 1.1.2
テンプレート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
を実行し、インストールを行っていきます。
- セットアップウィザードでNextをクリックします。
- I accept the terms in the License Agreementをチェックし、Nextをクリックします。
- 特に変更せずに、Nextをクリックします。
- Use metadata passwodのチェックはそのままにし、Run Cloudbase-init service as LocalSystemをチェックし、Nextをクリックします。
- Installをクリックします。
- インストーラーをそのままの状態にし、
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
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
- 最後に、Run Sysprep to cretate a generalized imageとShutdown when Sysprep treminatesにチェックを入れFinishをクリックします。
- 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のマージ待ち)
ファイルを作成したい場合は以下のように設定を行います。
$ 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; })
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
の指定も必要でした。