Proxmox VEのcloudinitはvendorオプションによる追加処理が書けるようになっていた

Posted on 2021/12/29(Wed) 21:29 in technical

Proxmox VEのcloudinitはvendorオプションによる追加処理が書けるようになっていた

Proxmox VEのcloudinitでuserdataを自由に調整する の末尾に以下のように書いたのですが、
どうやら書いた当時から少しだけアップデートがあって Add additional custom config field for cloud-init config tab が追加されました。
vendorオプションを指定することで、Proxmox VEが生成するcloudinit設定に加えて追加のcloudinit設定を付与することが出来るらしいので、動きを見ていきます。

Proxmox VEのGUIで提供されているcloudinit設定だけでは不足する場合、直接ファイルを送り込んで自由にカスタマイズできることが確認できました。
それにしても一番カスタマイズするであろうuser-dataだけでも、ユーザー設定を追加する機能が実装されると嬉しいのですけど、
Bugzillaを"cicustom"で検索 した結果が3件では中々...

前提知識

Proxmox VEのcloudinitでuserdataを自由に調整する の記載時点では、Proxmox VEで使用可能なcloud-initの設定ファイルは user / meta / network の3つでした。
しかし、最近の更新によって vendor が新しく追加されました。

公式ページの Cloud-Init Support にも記載が増えているので、確認してみてください。

Hint

比較的新しい 7.0-18 以上が必要です。手元の環境で試す場合は、バージョンを確認しておきましょう。

# pveversion 
pve-manager/7.1-6/4e61e21c (running kernel: 5.13.19-1-pve)

動作確認

前回同様、GNS3のppaを追加するだけのファイルを作ります。

Hint

以前は cipassword を設定すると ssh_pwauth: True も追加されていた気がするのですが、パスワードログインできなかったので追加しています。
(こういう細かい調整ができるのも、vendorオプションの良いところです)

今回はCephFSにsnippetsを置けるように設定した後、 /mnt/pve/cephfs/snippets/vendor_gns3.yaml に置きました。

#cloud-config
ssh_pwauth: True
apt:
  sources:
    gns3:
      source: "ppa:gns3/ppa"

Note

1行目の #cloud-config はvendorファイルでも必須です。

起動と確認

早速、サンプルとなるマシンに設定を追加して、起動します。(ベースになる vmid: 9003 はubuntu-20.04なイメージから適当に作ったテンプレート)

# qm clone 9003 8001 --name ci-vendor
create full clone of drive ide2 (local-lvm:vm-9003-cloudinit)
  Logical volume "vm-8001-cloudinit" created.
create linked clone of drive virtio0 (local-lvm:base-9003-disk-0)
  Logical volume "vm-8001-disk-0" created.
# qm set 8001 --ciuser dummy --cipassword dummy-pw9999 --ipconfig0 ip=192.168.122.221/24,gw=192.168.122.5
update VM 8001: -cipassword <hidden> -ciuser dummy -ipconfig0 ip=192.168.122.221/24,gw=192.168.122.5
# qm set 8001 --cicustom "vendor=cephfs:snippets/vendor_gns3.yaml"
update VM 8001: -cicustom vendor=cephfs:snippets/vendor_gns3.yaml
# qm config 8001
boot: order=virtio0
cicustom: vendor=cephfs:snippets/vendor_gns3.yaml
cipassword: **********
ciuser: dummy
cpu: Skylake-Client
ide2: local-lvm:vm-8001-cloudinit,media=cdrom,size=4M
ipconfig0: ip=192.168.122.221/24,gw=192.168.122.5
memory: 1024
name: ci-vendor
nameserver: 192.168.122.31
net0: virtio=A2:3B:1E:0A:EA:62,bridge=vmbr0
ostype: l26
scsihw: virtio-scsi-pci
searchdomain: ainoniwa.net
smbios1: uuid=e8b27429-893a-4fb3-a74b-582fac603845
virtio0: local-lvm:vm-8001-disk-0,size=2252M
vmgenid: 6adb041f-840e-4e55-9add-a8cfa3f1c193
# qm cloudinit dump 8001 user
#cloud-config
hostname: ci-vendor
manage_etc_hosts: true
fqdn: ci-vendor.ainoniwa.net
user: dummy
password: $5$GsGe/qMp$/Gzf.z0JEQtJ3HwQWFbDE2mwmCZkhBqenf0X.ykCmz2
chpasswd:
  expire: False
users:
  - default
package_upgrade: true

# qm start 8001
generating cloud-init ISO

Warning

通常、cloudinit設定は仮想マシンの初回起動時にのみ実行されるので、上記の仮想マシンはまだ一度も起動していないということに注意してください。
前回起動済みの

Hint

現時点では、vendorデータのdumpは出来ないので、内容については自分で準備・設定したものを信用する、ということになります。

# qm cloudinit dump 8001 vendor
400 Parameter verification failed.
type: value 'vendor' does not have a value in the enumeration 'user, network, meta'
qm cloudinit dump <vmid> <type>

起動と確認

設定したVMを起動して、目的のcloudinit設定が処理されているか確認してみます。
今回は先の例で書いたGNS3のppaが追加されているかどうかを確認します。

$ cat /etc/apt/sources.list.d/gns3-ubuntu-ppa-focal.list 
deb http://ppa.launchpad.net/gns3/ppa/ubuntu focal main
# deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu focal main
$ grep "gns3" /var/log/cloud-init.log 
2021-12-29 12:18:31,166 - cc_apt_configure.py[DEBUG]: handling apt config: {'sources': {'gns3': {'source': 'ppa:gns3/ppa'}}}
2021-12-29 12:18:31,218 - cc_apt_configure.py[DEBUG]: adding source/key '{'source': 'ppa:gns3/ppa'}'
2021-12-29 12:18:31,218 - util.py[DEBUG]: Running command ['add-apt-repository', 'ppa:gns3/ppa'] with allowed return codes [0] (shell=False, capture=True)

GNS3のppaがaptのsources.list.dに追加されていることが確認できました。

終わり

Proxmox VEのGUIで提供されているcloudinit設定だけでは不足する場合、直接ファイルを送り込んで自由にカスタマイズしたい...けど、ユーザー名とかホスト名とかはProxmox VEに付属の機能で処理したい。
というような場合に、vendorオプションが活用できそうなことがわかりました。

あとはこのsnippetをAPIでアップロード出来るようになれば良いんですが、まだ取り込まれてないんですよね。
それまでは自分でパッチを当てて、対応するということで。
ではでは。