どうも、Tです。
vSphere環境でUbuntu Desktop 22.04のテンプレート用仮想マシンを作っており、難儀したので忘れないように備忘録です。
これっ!という確実な設定はありませんので、本番環境作るときの参考情報程度にみてください。
カスタマイズスクリプトについては、記事にしていますのでご参考ください。
環境
今回検証した環境です。
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版使おう・・・・。