どうも、Tです。
以前、「【vSphere】仮想マシンクローンのカスタマイズがうまく動かないときに確認した方がよいこと」という記事を書いていました。
今回、Ubuntu22.04でこのカスタマイズを実現する「仮想マシンのカスタマイズ仕様」の中にある「カスタマイズスクリプト」を使おうとして少しはまったので次は忘れぬように備忘録です。
目次
やりたいこと
カスタマイズスクリプトを使うために必要な設定やカスタマイズスクリプトの仕様について確認した部分をまとめます。VMware社の下記ドキュメントをベースにして適時補足していきます。本記事では、これから引用元を明記していない場合は、下記のドキュメントから引用しています。
vSphere Clientの画面だと下記のカスタマイズスクリプトの部分になります。
カスタマイズ仕様の細かい使い方や手順は割愛しています。
環境
下記の環境での確認を説明していきます。
vSphere環境
- VMware vCenter Server:8.0.1.00000(21560480)
- VMware vSphere ESXi:8.0.1, 21495797
RHEL環境(テンプレート仮想マシン)
- Ubuntu Desktop 22.04.2 LTS
- open-vm-tools:12.1.5.39265 (build-20735119)
Ubuntuはほぼデフォルトでインストールしており、SSH許可を行っています。
カスタマイズスクリプトを使うために必要なこと
VMware Toolsのバージョン
ドキュメントは「VMware Tools バージョン 10.1.0 以降がインストールされていること」と説明されています。
Linuxの場合は、open-vm-toolsがほとんどだと思うので調べたところKB74880がありました。ここから少し情報をたどりましたが、カスタマイズスクリプトに必要なopen-vm-toolsの明確なバージョンにはたどり着けませんでした・・・・。
Ensure that VMware Tools version 10.1.0 or later is installed.
Please note that the Linux version of VMware Tools is “open-vm-tools”, which is separate from the Windows version. Please see https://docs.vmware.com/en/VMware-Tools/12.2.0/com.vmware.vsphere.vmwaretools.doc/GUID-8B6EA5B7-453B-48AA-92E5-DB7F061341D1.html
ここからは検証していないため憶測になりますが、KB2075048がありopen-vm-tools version 9.10.0以降であれば動きそうにも読み取れます。また、open-vm-tools 9.4.x でも下記プラグインを追加することで動きそうに見受けられます。
ここまで古いバージョンも過去の遺産以外ではないでしょうかご参考までに。
perlのインストール
そもそもの「仮想マシンのカスタマイズ仕様」を使用したカスタマイズのためにperlが必要です。下記のコマンドなどでperlをインストールしておきましょう。
$sudo apt install perl
UbuntuではOSインストール時でperlがインストールされていました。
enable-custom-scriptsの有効化
カスタマイズスクリプトを使用するためのenable-custom-scriptsオプションが無効になっています。有効にしておきましょう。
有効にして設定値がtrueになっていることを確認します。
$ sudo vmware-toolbox-cmd config set deployPkg enable-custom-scripts true $ sudo vmware-toolbox-cmd config get deployPkg enable-custom-scripts [deployPkg] enable-custom-scripts = true
上記のコマンドを実行することにより、下記のディレクトリにtools.confファイルを作成して設定値を書き込んでくれています。
$ cd /etc/vmware-tools/ $ cat tools.conf [logging] # Turns on logging globally. It can still be disabled for each domain. # log = true # Disables core dumps on fatal errors; they're enabled by default. # enableCoreDump = false # Defines the "vmsvc" domain, logging to file # vmsvc.level = message vmsvc.handler=file # Setup file rotation - keep 3 files vmsvc.maxOldLogFiles=3 # Max log file size kept: 1 MB vmsvc.maxLogSize=1 # Defines the "vmtoolsd" domain, and disable logging for it. # vmtoolsd.level = none [deployPkg] enable-custom-scripts=true
カスタマイズスクリプトの作成
カスタマイズスクリプトを作成しカスタマイズ仕様の設定に貼り付けます。
#!/bin/bash if [ x$1 == x"precustomization" ]; then # ここからがカスタマイズ前に実行されるスクリプト echo Do Precustomization tasks touch /root/Pre-test.txt elif [ x$1 == x"postcustomization" ]; then # ここからがカスタマイズ後に実行されるスクリプト echo Do Postcustomization tasks touch /root/Post-test.txt fi
テストのために、プリスクリプトとポストスクリプトそれぞれに標準出力するechoコマンドとファイルを作成するtouchコマンドを記載しています。
echoコマンドは入れておいたほうがいいかと思います。後述する部分にも関与しますが、何も処理が入っていないとカスタマイズスクリプトがエラーになりますので、echoのように動作影響のないものは有用かと考えています。
VMware社のサンプルコードでは、シェルの指定が「#!/bin/sh」になっていますが、Ubuntuの場合は、「#!/bin/bash」を必ず指定してあげましょう。
Ubuntuの/bin/shはdashへのシンボリックリンクになっており、「#!/bin/sh」ではスクリプト実行時にエラーになり動作しません。
$ ls -lh /bin/sh lrwxrwxrwx 1 root root 4 7月 10 15:34 /bin/sh -> dash
実行したときの結果
先ほどのカスタマイズスクリプトの結果を見てみます。
echoコマンドは、/tmp/stdout.logに出力されていきます。スクリプトで書いておいたほうがいいといったのは、このechoによりプリスクリプト・ポストスクリプトどちらまで実行されているのか判別しやすいこともあります。
$ sudo cat /tmp/stdout.log Do Postcustomization tasks
touchコマンドも指定の場所にファイルが作成されていました。ファイルタイムスタンプからもPreが実行されたあとにPostが実行されたことがわかります。
$ sudo ls -lh /root/ [sudo] kadmin のパスワード: 合計 4.0K -rw-r--r-- 1 root root 0 7月 11 10:15 Post-test.txt -rw-r--r-- 1 root root 0 7月 11 10:14 Pre-test.txt drwx------ 5 root root 4.0K 7月 10 15:53 snap
覚えておくべき仕様
実行タイミング
プリスクリプトは、カスタマイズ仕様のカスタマイズが始まる前にに実行されます。プリスクリプト実行中はネットワークに繋がっていないことに注意が必要です。
“precustomization” コマンドライン パラメータを含むカスタマイズ スクリプトを追加すると、ゲストのカスタマイズが開始される前にスクリプトが呼び出されます。その結果、仮想 NIC が切断され、ネットワークにアクセスできなくなります。
ポストスクリプトはカスタマイズ仕様によるカスタマイズが終了した後に実行されます。そのため、ネットワークにもつながている状態です。
“postcustomization” コマンドライン パラメータを含むカスタマイズ スクリプトを追加すると、ゲストのカスタマイズが終了した後にスクリプトが呼び出されます。その結果、仮想マシンがパワーオンし、NIC が接続され、ネットワークにアクセスできるようになった後の初期化プロセス内でスクリプトがスケジューリングされます。スクリプトの実行時間はデフォルトのタイムアウト期間に含まれず、ゲストのカスタマイズに失敗することはありません。
タイムアウト値
カスタマイズのタイムアウト期間は100秒です。この期間は、プリスクリプト+カスタマイズ仕様のカスタマイズの合計であり、ポストスクリプトの時間は含まれていません。
デフォルトとあるので変更できるのかと探してみましたが、変更のパラメーターは見つかりませんでした。
ゲストのカスタマイズが完了するまでのデフォルトのタイムアウト期間は 100 秒に設定されています。このタイムアウト期間には、“precustomization” コマンドライン パラメータを使用するときのスクリプトの実行時間が含まれます。スクリプトの実行時間がタイムアウトを超える場合は、ゲストのカスタマイズが失敗します。
文字数制限
カスタマイズスクリプトは1500文字となっています。
カスタマイズ スクリプトは 1,500 文字以下にしてください。
しかし、KB74880では、下記のように記載されているためvSphere8.x以降であれば65536文字まで可能なようです。
1. The length of customization script cannot be greater than 1500 characters in vSphere 7.x, this length
limitation has been increased to 65536 characters in vSphere 8.x.
カスタマイズスクリプトが動かないときの確認点
カスタマイズスクリプトが動かないときに確認したほうが良いログなどです。
カスタマイズのログの確認
$ sudo ls -lh /var/log/vmware-imc/ 合計 44K -rw-r--r-- 1 root root 599 7月 11 10:15 customization.log -rw------- 1 root root 37K 7月 11 10:14 toolsDeployPkg.log
カスタマイズ仕様の処理のログは、「/var/log/vmware-imc/」に出力されます。
ドキュメントなどに明記はされていませんが、問題がある場合toolsDeployPkg.logにエラーログ記載されます。また正常時のログも出力されるので、大まかな流れを掴むのに役立ちます。
toolsDeployPkg.logの最後のほうに下記のログが出力されます。
[2023-07-11T01:14:50.136Z] [ info] Telinit command failed with exitcode: 1, stderr: 'Failed to connect to bus: 接続を拒否されました Failed to open initctl fifo: そのようなデバイスやアドレスはありません Failed to talk to init daemon.
古いVMwareToolsバージョンでは、Errorレベルで出力されていましたが、現在はinfoレベルの出力になっています。放置していても問題はなさそうですので無視することにしました。
類似したKB59754がありましたが、この内容を行ってもメッセージは出力され続けました。
カスタマイズスクリプトの確認
#!/bin/bash if [ x$1 == x"precustomization" ]; then # ここからがカスタマイズ前に実行されるスクリプト echo Do Precustomization tasks touch /root/Pre-test.txt elif [ x$1 == x"postcustomization" ]; then # ここからがカスタマイズ後に実行されるスクリプト echo Do Postcustomization tasks touch /root/Post-test.txt
実行に使われたカスタマイズスクリプトは、「/root/.customization/customize.sh」ファイルとなっています。
エラーが発生した場合は、ここを見たり部分的に実行したりで再現性を確認できます。
まとめ
自動化を考えたら、クローン後のAnsibleなどのほかツールから実行するのがいいのでしょうが、簡単な変更であればカスタマイズスクリプトも便利そうです。