Otama's Playground > サーバー > UbuntuのCloud ImageでテンプレートVMを作ってみた話【Proxmox + cloud-init】

UbuntuのCloud ImageでテンプレートVMを作ってみた話【Proxmox + cloud-init】

最近ProxmoxでVMをちょこちょこいじることが増えたので、Ubuntuのcloud imageを使ってテンプレートVMを作る手順をメモがてら残しておきます。「アレどうやるんだっけ…?」ってなった時用ですが、もしかしたら誰かの役に立つかもしれません。

今回は Ubuntu 24.04 LTS(cloud image) を使って、cloud-initで初期設定できるVMテンプレートを作ってみました。Proxmox上でGUIも使いつつ、最終的にはconfigファイルでちょっと細かめの設定もしています。

例によって「手順書」ってほどではなく、半分はログのような形になってます。
ちゃんと整えたくなったら、後で見やすくします。たぶん。きっと。おそらく…。

手順

参考: https://github.com/UntouchedWagons/Ubuntu-CloudInit-Docs

テンプレートに変換するVMを作成

proxmoxのホストで以下のコマンドを叩く。使用するイメージはUbuntu 24.04 LTSのcloud image(https://cloud-images.ubuntu.com/noble/current)です。

Bash
# 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

YAML
write_files:
- content: |
    wow
  path: /home/user/wow
cloud-initファイルのアップロードを行う
Bash
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に入れていきます。

Bash
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ノード作成をある程度自動化できるようにしていきたいところ。
そのあたりもまた気が向いたらメモに残すかもしれません。

それでは、未来の自分とどこかの誰かの参考になれば幸いです。ちゃんちゃん。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です