最近ProxmoxでVMをちょこちょこいじることが増えたので、Ubuntuのcloud imageを使ってテンプレートVMを作る手順をメモがてら残しておきます。「アレどうやるんだっけ…?」ってなった時用ですが、もしかしたら誰かの役に立つかもしれません。
今回は Ubuntu 24.04 LTS(cloud image) を使って、cloud-initで初期設定できるVMテンプレートを作ってみました。Proxmox上でGUIも使いつつ、最終的にはconfigファイルでちょっと細かめの設定もしています。
例によって「手順書」ってほどではなく、半分はログのような形になってます。
ちゃんと整えたくなったら、後で見やすくします。たぶん。きっと。おそらく…。
Contents
手順
参考: https://github.com/UntouchedWagons/Ubuntu-CloudInit-Docs
テンプレートに変換するVMを作成
proxmoxのホストで以下のコマンドを叩く。使用するイメージはUbuntu 24.04 LTSのcloud image(https://cloud-images.ubuntu.com/noble/current)です。
# cloud imageをダウンロード
wget -P /root https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
# imageのサイズがクローン時のディスクサイズになるため、大きくする
qemu-img resize /root/noble-server-cloudimg-amd64.img 32G
# VMのセットアップ
vmTemplateId=9000
qm create ${vmTemplateId} --name "ubuntu-2404-cloudinit-template" --ostype l26 \
--memory 7680 \
--agent 1 \
--bios ovmf --machine q35 -efidisk0 local-lvm:0 \
--cpu x86-64-v2-AES --socket 1 --cores 2 \
--vga serial0 --serial0 socket \
--net0 virtio,bridge=vmbr0,firewall=1
# imageのimport
qm importdisk ${vmTemplateId} /root/noble-server-cloudimg-amd64.img local-lvm
# importしたimageをVMにatatch
qm set ${vmTemplateId} --scsihw virtio-scsi-single --virtio0 local-lvm:vm-${vmTemplateId}-disk-1,discard=on
# boot順序の設定
qm set ${vmTemplateId} --boot order=virtio0
# cloudinit用のドライブを追加する
qm set ${vmTemplateId} --scsi1 local-lvm:cloudinit
# 不要になったイメージを破棄
# rm /root/noble-server-cloudimg-amd64.img
cloud-initの設定を行う
Proxmoxの場合GUIから行う方法とconfigで行う方法の2通りがありそうです。ただGUIの場合は単純な設定しかできないため、複雑な初期化を行うにはconfigを採用する必要があります。
※GUIだと以下の設定からいじれます。が、見ての通りユーザー情報とIPぐらいしかいじれる箇所がありません。

この項では実際にconfigでcloud-initの設定を行うところまでを説明します。
ファイルをアップロードするための設定
cloud-initのconfigをアップロードするために以下の設定をまず行います。「データセンター > ストレージ > local > 編集」とクリックしていき、内容にスニペットを追加します。
この設定を行うと/var/lib/vz配下にsnippetsディレクトリが作成され、中身がproxmoxから参照可能になります。

cloud-initファイルの作成
とりあえず実行結果が分かりやすいものを入れ込んでみます。
参考: https://cloudinit.readthedocs.io/en/latest/reference/examples.html
write_files:
- content: |
wow
path: /home/user/wow
cloud-initファイルのアップロードを行う
cat << EOF | sudo tee /var/lib/vz/snippets/test-cloudinit.yaml
#cloud-config
write_files:
- content: |
wow
path: /home/user/wow
EOF
Snippetの作成が正常に完了していると以下のページで確認できるはずです。ここのページでアップロード出来たらラクな気がするのですが、残念ながらアップロードボタンは見当たらず…

VMにcloud-initの設定を注入する
ここまで完了したら、cloud-initの設定をVMに入れていきます。
vmTemplateId=9000
# GUIでできる設定
sudo qm set ${vmTemplateId} --ciuser user
sudo qm set ${vmTemplateId} --cipassword pw
sudo qm set ${vmTemplateId} --ipconfig0 ip=dhcp,ip6=dhcp
# カスタム設定(ファイル名は作成したものに書き換えてください)
qm set ${vmTemplateId} --cicustom "vendor=local:snippets/test-cloudinit.yaml"
テンプレートに変換する
作成したVMをテンプレートに変換します。GUIで可能です。

テンプレートからVMを作成する
テンプレートからクローンを作成します。

終わり
というわけで、ひとまずUbuntu 24.04のcloud imageを使ってProxmoxでテンプレートVMを作るまでの流れをざっとまとめてみました。慣れればそこまで難しい作業でもないんですが、細かい手順って案外すぐ忘れるんですよね……。
今後はcloud-initの内容をもう少し作り込んで、Kubernetesノード作成をある程度自動化できるようにしていきたいところ。
そのあたりもまた気が向いたらメモに残すかもしれません。
それでは、未来の自分とどこかの誰かの参考になれば幸いです。ちゃんちゃん。
