Proxmox VEでcloud-init対応のUbuntu 24.04テンプレートを作成する手順

概要

Proxmox VE で Ubuntu 24.04 の VM をすぐに作成し、検証を繰り返せる環境を用意したいと思い、cloud-init を使って VM の雛形を作成しました。

Proxmox VEではVMをテンプレート化しておくことができます。 しかし、色々な設定をしたVMをしばらく放置しておくと、何を設定したのか忘れてしまいます。

cloud-initは, Cloud環境でVMの初期化を自動化するためのデファクトスタンダードなツールです。 proxmoxVEはcloud-initに対応しているので、cloud-initを使ってVMの雛形を作成することにしました。

cloud-initとは

cloud-initは、初回起動時にユーザーデータを読み取ってVMを初期化する仕組みです。 Proxmox VEでは、cloud-init用のドライブ (ide2 など) にユーザーデータISOを自動生成して接続することで、 同様の挙動をローカル環境でも再現できます。

これにより、初期設定(ユーザー作成、SSH鍵登録、パッケージインストールなど)を自動化でき、どのVMも同じ状態から起動できるようになります。

cloud-initのsnippetを作成する

次のようにcloud-initのsnippetを作成しました。 ubuntuユーザーを作成し、sudo権限を付与し、SSH公開鍵認証を設定しています。 基本的なパッケージのインストールとタイムゾーンの設定、UFWの設定も行っています。

#cloud-config
timezone: Asia/Tokyo
locale: en_US.UTF-8

users:
  - name: ubuntu
    gecos: Ubuntu User
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh_authorized_keys:
      - ssh-ed25519 <YOUR_SSH_PUBLIC_KEY>

package_update: true
package_upgrade: true
packages:
  - vim
  - curl
  - git
  - htop
  - net-tools
  - ufw

runcmd:
  - timedatectl set-timezone Asia/Tokyo
  - ufw allow 22/tcp
  - ufw --force enable
  - echo "Provision complete at $(date)" > /etc/motd

proxmoxVE上にcloud-initのsnippetを登録する

/var/lib/vz/snippetsに上記のcloud-initのsnippetをubuntu-init.yamlとして保存します。 /var/lib/vzというディレクトリはproxmoxVEのデフォルトのストレージパスです。 /etc/pve/storage.cfgで確認できます。

sudo cat /etc/pve/storage.cfg

dir: local
        path /var/lib/vz
        content backup,iso,vztmpl,snippets

lvmthin: local-lvm
        thinpool data
        vgname pve
        content images,rootdir

proxmoxVE上でqmコマンドを使ってVMを作成する

まずは仮想マシンの基本構成を作成します。
ここではメモリ4GB・2コア・VirtIOネットワークを指定しています。

次のようにqmコマンドを使ってVMを作成します。 テンプレート化するために、DHCPでIPアドレスを取得するように設定しています。

元となるimageは、cloud-init対応のUbuntu24.04をqcow2形式でダウンロードして、/var/lib/vz/template/qcow2/に保存しておきます。

VMID=130
VMNAME=ubuntu-24-cloudinit
STORAGE=local-lvm

# VMの箱を作成
sudo qm create $VMID --name $VMNAME --memory 4096 --cores 2 --net0 virtio,bridge=vmbr0
sudo qm importdisk $VMID /var/lib/vz/template/qcow2/noble-server-cloudimg-amd64.img local-lvm

# ディスクをアタッチしてリサイズ
DISK_REF=$(sudo pvesh get /nodes/$(hostname -s)/storage/$STORAGE/content --output-format json | jq -r --arg id "$VMID" '.[] | select(.volid | test("vm-\($id)-disk-0$")) | .volid')
sudo qm set $VMID --scsihw  virtio-scsi-single --scsi0 "$DISK_REF"
sudo qm resize $VMID scsi0 40G

# cloud-initの設定
sudo qm set $VMID --ide2 local-lvm:cloudinit
sudo qm set $VMID --cicustom "user=local:snippets/ubuntu-init.yaml"
sudo qm set $VMID --ipconfig0 ip=dhcp
sudo qm set $VMID --boot order=scsi0
sudo qm set $VMID --serial0 socket --vga serial0 
sudo qm set $VMID --agent enabled=1

次のように起動します。 直前にcloudinit updateでcloud-initの設定を反映させます。

sudo qm cloudinit update $VMID
sudo qm start $VMID
sudo qm terminal $VMID

cloud-final.serviceが完了していることを確認します。

[   85.302809] cloud-init[1060]: Cloud-init v. 25.2-0ubuntu1~24.04.1 finished at Sat, 18 Oct 2025 05:14:00 +0000. Datasource DataSourceNoCloud [seed=/dev/sr0].  Up 85.29 seconds
[  OK  ] Finished cloud-final.service - Cloud-init: Final Stage.
[  OK  ] Reached target cloud-init.target - Cloud-init target.

VMをテンプレートとする

起動したVMを停止し、cloud-initの設定を更新してからテンプレート化します。

sudo qm stop $VMID
sudo qm cloudinit update $VMID
sudo qm template $VMID

テンプレートからVMを立ち上げる

次のようにテンプレートからVMを立ち上げます。 今回は立ち上げる際に固定IPアドレスを設定しています。 立ち上げたVMはsshで接続できます。

TEMPLATE_ID=130
VMID=131
sudo qm clone $TEMPLATE_ID $VMID --name test-vm --full
sudo qm set $VMID --ipconfig0 ip=192.168.0.165/24,gw=192.168.0.1 --nameserver 1.1.1.1
sudo qm cloudinit update $VMID
sudo qm start $VMID

まとめ

Proxmox VE で cloud-init を使うことで、SSH公開鍵認証の設定や初期パッケージの導入、UFWの有効化などを自動化できます。 これにより、毎回手動で設定する手間が省け、検証環境を短時間で再現できるようになります。 テンプレート化した VM をベースに、用途ごとにクローンを作る運用にも応用可能です。

comments powered by Disqus
Ko-fi tipsSupport Me on Ko-fi