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

どうも、Tです。

vSphere環境でUbuntu Server 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 Server 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 パッケージ自動アップグレード

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
fi

VMware社のサンプルコードでは、シェルの指定が「#!/bin/sh」になっていますが、Ubuntuの場合は、「#!/bin/bash」を必ず指定してあげましょう。

Ubuntuの/bin/shはdashへのシンボリックリンクになっており、「#!/bin/sh」ではスクリプト実行時にエラーになり動作しません。

$ ls -lh /bin/sh
lrwxrwxrwx 1 root root 4 Mar 23 2022 /bin/sh -> dash

マシンID削除

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

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

$ cat /etc/machine-id
79326a6aff064fdcbxxxxxxxxxxxxx

テンプレート仮想マシンでは以下のように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で使用する秘密鍵、公開鍵を再作成します。

クローン後の確認

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

カスタマイズした部分がかわっているか確認しておきましょう。

まとめ

Ubuntu Server版は、Desktopとは違いNetwork Managerがデフォルトでインストールされません。今回は、Network Managerがない状態からのシンプルな構成で試してみました。

お作法がどれになるかはさておき、NetworkManagerない状態で使っていってみようかな。