Proxmox VEのcliudinitでuserdataを自由に調整する
以前 Proxmox VE 5.2でCloud-Initが使えるようになったので使う話 を書いたのですが、 関連して Proxmox VE 6.0 から “custom Cloudinit configurations” がサポートされるようになりました。 仮想マシンの初回起動時に、任意のaptリポジトリを追加したり、追加のパッケージをインストール出来ると便利なので、実際に使ってこの機能の挙動を確認してみようと思います。 公式ページの Cloud-Init Support は結構サラッと書かれているので、調査ついでにまとめておきます。
前提知識
Proxmox VEで使用可能なcloud-initの設定ファイルは以下の3つです。
- user-data
- meda-data
- network-data
Proxmox VEでcloud-initの設定ファイルを仮想マシン設定に追加するには、設定ファイルを “snippets” が保存可能なStorageのパスにあらかじめ保存しておく必要があります。
Storageに保存するcontentに “snippets” を追加
特に意識せずにStorageを使用している場合、おそらく “snippets” が保存可能な設定になっていると思われます。
今回はProxmox VEをインストール時に大抵追加されている local
ストレージに “snippets” を格納できるように設定します。
コマンドで実施する場合は、以下のようになります。
対象のストレージパスに snippets
ディレクトリが出来ていれば良いでしょう。
|
|
現状のcloud-init設定をdumpする
実際にcloud-initの設定を書き始める前に、Proxmox VEが自動生成しているcloud-init設定を取得します。
サンプルの仮想マシン設定
既に、以下のように仮想マシンが設定済みであるとします。
|
|
!!! warning 通常、cloudinit設定は仮想マシンの初回起動時にのみ実行されるので、上記の仮想マシンはまだ一度も起動していないということに注意してください。
サンプルの仮想マシン設定からdumpしたcloudinit設定(user)
このとき qm cloudinit dump 2239 user
を実行すると、以下のようにcloud-initの設定を抜き出すことができます。
|
|
生成部分のコードは cloudinit_userdata() に書かれていて、YAMLのインデントはハードコーディングな揃え方をしています。
searchdomain
が設定されている場合は fqdn
がちゃんと "$hostname.$search"
になっていることも、上記コードから追いかけられます。
サンプルの仮想マシン設定からdumpしたcloudinit設定(meta)
特に使用しませんが、metaの場合は以下のようになります。
|
|
サンプルの仮想マシン設定からdumpしたcloudinit設定(network)
特に使用しませんが、networkの場合は以下のようになります。
|
|
現状のcloud-init設定を元に追加の設定を書いて、仮想マシン設定を更新
それでは、現状の設定が分かったところで、設定ファイルを吐き出して編集後、そのファイルを cicustom
に設定します。
|
|
!!! note Proxmox VE 6.4時点ではGUIで設定できないので、CLIから設定します。
!!! warning
この設定をすると、Proxmox VEが自動生成しているcloudinitのuser-data設定は使用されなくなります。
(networkとmetaはProxmox VEが生成したものが使われますので、指定したタイプの設定だけが置き換えられるということです)
GUIでは cicustom
設定はサポートされていないので表示されません。
CLIでsnippetsのファイルを参照するように設定変更した後で、GUIでcloudinitのパスワード等を変更しても反映されませんので、混乱しないようにしましょう。
なお、設定を削除するときは以下のようになります。
|
|
(中略)
とした設定内容は cloudinit の Modules に沿って書かれていれば何でも良いです。
例えばaptのsourceをppaから追加する場合では、以下のような行を末尾に追記します。
|
|
起動と確認
設定したVMを起動して、目的のcloudinit設定が処理されているか確認してみます。 今回は先の例で書いたGNS3のppaが追加されているかどうかを確認します。
|
|
GNS3のppaがaptのsources.list.dに追加されていることが確認できました。
APIを使いたい人向けの情報
ここまでの作業をAPIで自動化できると嬉しいかなぁと思って調べていたのですが、今のところ以下の点に課題がありそうです。
- APIを使用して、Storageにsnippetsをアップロードすることは現在サポートされていません
- Bug 2208 - Snippet management using the API が取り込まれたら解決しそう
- register_method() パッチが対象にしているコード周辺を見ても、今のところ
iso
とvztmpl
だけをサポートしているのは変わらなさそう
無理矢理実装することを考えると、sshでログインまたは共有フォルダをマウントしてファイルを置く。ということになるかなと思います。 上記のパッチはサイズや影響範囲も小さく済みそうなので、パッチを当ててAPI経由でsnippetsの格納をサポートするのも悪くはなさそうです。 (今見ると、このパッチは処理部分の問題だけを解消しているので、APIのenumパラメータ周りも修正してあげた方が良いかな?)
参考
- Cloud-Init Support - Custom Cloud-Init Configuration
- [SOLVED] Proxmox VE and cloud-init snippets etc
終わり
Proxmox VEのGUIで提供されているcloudinit設定だけでは不足する場合、直接ファイルを送り込んで自由にカスタマイズできることが確認できました。
それにしても一番カスタマイズするであろうuser-dataだけでも、ユーザー設定を追加する機能が実装されると嬉しいのですけど、 Bugzillaを"cicustom"で検索 した結果が3件では中々…