【vSphere】Ubuntu Desktop 22.04のテンプレート仮想マシンを作成してみた(仮想マシンのカスタマイズ仕様使う前提)

どうも、Tです。

vSphere環境でUbuntu Desktop 22.04のテンプレート用仮想マシンを作っており、難儀したので忘れないように備忘録です。

これっ!という確実な設定はありませんので、本番環境作るときの参考情報程度にみてください。

本手順は、テンプレート仮想マシンからのクローン時にvSphereの仮想マシンのカスタマイズ仕様とカスタマイズスクリプトを使うことを前提にしています。
カスタマイズスクリプトについては、記事にしていますのでご参考ください。
【vSphere】仮想マシンのカスタマイズスクリプトをUbuntu22.04で使ってみた
どうも、Tです。 以前、「【vSphere】仮想マシンクローンのカスタマイズがうまく動かないときに確認した方がよいこと」という記事を書...

環境

今回検証した環境です。

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許可を行っています。

やりたいこと

概要

本手順では、テンプレートとして用したRHEL9の仮想マシンを仮想マシンのカスタマイズ仕様を使って簡単にクローンを作成しようという思いからはじまりました。

カスタマイズ仕様の設定は後ほど記載します。

内容

実施内容 実施タイミング 実施方法
自動アップデート無効化 テンプレート作成時 手動
無線接続無効化 テンプレート作成時 手動
hostsファイルの確認 テンプレート作成時 手動
マシンID削除 クローン時 カスタマイズ仕様で自動的に処理
SSHキー削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
netplan(yamlファイル)削除 クローン時(Pre処理) カスタマイズ仕様のスクリプト
SSHキー再作成 クローン時(Post処理) カスタマイズ仕様のスクリプト
netplan(yamlファイル)修正・適用 クローン時(Post処理) カスタマイズ仕様のスクリプト

テンプレート仮想マシンを作成する(およびクローンするとき)に必要な項目をまとめました。

テンプレート仮想マシンの手動設定

自動アップデート無効化

自動アップデートを無効化します。「20auto-upgrades」ファイルを開きます。

$ sudo vi /etc/apt/apt.conf.d/20auto-upgrades

それぞれの数字を1(有効)から0(無効)に変更します。

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
項目 意味
Update-Package-Lists パッケージ自動アップデート
Unattended-Upgrade パッケージ自動アップグレード

無線接続無効化

無線接続(wifi・ブロードバンド)を無効化します。

$ sudo nmcli radio all off

無効になったことを確認します。

$ sudo nmcli radio
WIFI-HW WIFI WWAN-HW WWAN
有効 無効 有効 無効

hostsファイルの確認

hostsファイルに不要な登録を削除しておきます。(下記参照)

$ cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

仮想マシンのカスタマイズ仕様

カスタマイズ仕様の内容

検証に使用したカスタマイズ仕様設定を記載しておきます。

以後は、主にカスタマイズスクリプトについての説明になります。

#!/bin/bash
if [ x$1 == x"precustomization" ]; then
echo Do Precustomization tasks
rm -rf /etc/ssh/ssh_host_*
rm -rf /etc/netplan/*
elif [ x$1 == x"postcustomization" ]; then
echo Do Postcustomization tasks
dpkg-reconfigure openssh-server
sed -i "s/networkd/NetworkManager/g" /etc/netplan/99-netcfg-vmware.yaml
netplan apply
fi

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

マシンID削除

いきなりカスタマイズスクリプトではない説明になります。

永続的に変更されてない、一意に識別するためのmachine-idが生成されています。※後半はxで置き換えています。

$ cat /etc/machine-id
ac06b8645f2242d7bbxxxxxxxxxxxxx

テンプレート仮想マシンでは以下のようにIDが状態にしておくのですが、machine-idはない場合に起動時に自動生成されます。

# echo "uninitialized" > /etc/machine-id

いれるとしたらカスタマイズスクリプトのpre処理のタイミングですが、vSphereのカスタマイズ仕様を使用する場合、machine-idを自動生成してくれているので明示的な処理は不要です。考慮点として覚えておく必要があるため備忘録として記載しました。

【pre処理】SSHキー削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/ssh/ssh_host_*

SSHで使用される秘密鍵と公開鍵をすべて削除しています。

Ubuntuの場合は、秘密鍵と公開鍵は存在しない場合も自動的に作成されてないため、ポストスクリプトで再生成を行います。

【pre処理】netplan(yamlファイル)削除

カスタムスクリプトの下記の部分になります。

rm -rf /etc/netplan/*

デフォルトで「01-network-manager-all.yaml」ファイルが存在しています。このままカスタマイズ仕様を使うと元ファイルとバックアップファイルを作成したうえで、カスタマイズ仕様でさらに別ファイルが作成されます。不要なファイルを残さないために削除しておきます。

【post処理】SSHキー再作成

カスタムスクリプトの下記の部分になります。

dpkg-reconfigure openssh-server

プレスクリプトで削除したSSHで使用する秘密鍵、公開鍵を再作成します。

【post処理】netplan(yamlファイル)修正・適用

カスタムスクリプトの下記の部分になります。

sed -i "s/networkd/NetworkManager/g" /etc/netplan/99-netcfg-vmware.yaml
netplan apply

カスタマイズ仕様では、「99-netcfg-vmware.yaml」が作成されますが、rendererが「networkd」になっています。nmcliなどで制御できるように「NetworkManager」に変更し「netplan apply」コマンドで確定しています。

これは、networkdかNetworkManagerか好みの部分もあるか思うので、必要に応じてかなと。

カスタマイズ仕様で作成される99-netcfg-vmware.yamlのデフォルトゲートウェイの書き方がUbuntu22.04では非推奨となっているため、「/var/log/vmware-imc/toolsDeployPkg.log」に下記が出力されます。

** (process:1067): WARNING **: 12:13:18.526: `gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

下記のように正しい書き方に変更すべきですが、スクリプトで置き換えるのが面倒だったので、そのままにしています。

     routes:
      - to: default
        via: <デフォルトゲートウェイのIPアドレス>

クローン後の確認

あとは、テンプレートからクローンする際に「ゲストOSのカスタマイズ」で作成した仕様を指定すればネットワーク回りを考慮したクローンが行えます。

クローン後は各所カスタマイズした部分などを確認すると思いますので割愛しますが、ネットワーク部分は「nmcli -f NAME,DEVICE,FILENAME connection show」の結果を確認しておきましょう。

出力結果を見ると各インターフェースがどの構成ファイルを使用しているのかわかります。

$ nmcli -f NAME,DEVICE,FILENAME connection show
NAME DEVICE FILENAME
netplan-ens33 ens33 /run/NetworkManager/system-connections/netplan-ens33.nmconnection

処理がうまくいっていない場合、同じ名前のインターフェースが異なる設定ファイルで読み込まれ不要なはずのごみインターフェースが表示されたりします。

まとめ

途中でDesktop版じゃなくて、Server版にしとけばよかったとは思ったのは秘密・・・やっぱりServer版使おう・・・・。