概要
なんだかんだ続いている Foreman シリーズですが、既存のプロビジョニングテンプレート(Cloud-init)を作りこみなくなるシチュエーションがあったので備忘録を残します。
過去の Foreman 記事
Foremanを構築し、Ubuntu24.04をベアメタルプロビジョニングする
Foreman から BMC 操作をする
Foreman で UEFI ブートを可能にする
ユーザーデータ プロビジョニングテンプレート
基本的には過去記事に記載がありますが「オペレーティングシステム」に紐づいているテンプレート郡の中で、PXE ブートで OS が起動した後に初期構築をするための userdata を定義できるテンプレートです。
%#
kind: user_data
name: Preseed Autoinstall cloud-init user data
model: ProvisioningTemplate
oses:
- ubuntu
test_on:
- ubuntu_autoinst4dhcp
description: |
The provisioning template for Autoinstall based distributions. To customize the installation,
modify the host parameters
This template accepts the following parameters:
- lang: string (default="en_US.UTF-8")
- keyboard: string (default="us")
- package_upgrade: boolean (default=false)
- remote_execution_ssh_keys: string (default="")
- username_to_create: string (default="root")
- realname_to_create: string (default=username_to_create)
- password_to_create: string (default=@host.root_pass)
-%>
...
このテンプレートをもとにレンダリングされた userdata が実際に PXE ブート後読み込まれ、然るべき設定がなされます。基本的な部分はネット上にたくさん情報があると思います。
書式
基本的には普通の userdata と同じようにガリガリ書いていけばいいですが、一部マクロや変数が使用できます。
詳細は公式ドキュメントを参照しましょう。
例えば以下のように @host を使用することで紐づくホストに関する情報を参照できます。
#cloud-config
hostname: <%= @host.shortname %> /* ホスト名が入力される */
以下のようにするとホストパラメータから値を参照できます。ホストのパラメータ設定で remote_execution_ssh_keys として公開鍵を埋め込んでおけば authorized_keys にセットするような設定が可能になります。
<% if @host.params['remote_execution_ssh_keys'].present? -%>
Ruby 構文の利用
より詳細な設定には Ruby 構文を使用することもできます。
例えばホストに紐づくインタフェース(@host.interfaces)の中で local という名称のサブネットで定義されている IP アドレスを引っ張る ... といったこともできます。
<%= @host.interfaces .find { |i| i.subnet&.name&.include?("local") } &.ip %>
ただし、このような操作は利便性が高い一方、任意のプログラムを実行できてしまうなどの恐れからデフォルトでは以下のようなエラーとなります。
XXX Preseed Autoinstall cloud-init user data clone テンプレートのレンダリング中にエラーが発生しました: undefined method '#find' for ActiveRecord::Associations::CollectionProxy::Jail (ActiveRecord::Associations::CollectionProxy)
これらの操作を可能にするためには設定で制限を緩める必要があります。[管理]>[設定]>[プロビジョニング] から「Safemode レンダリング」を「いいえ」に変更してください。※リスクも伴うので、あくまで自己責任で

レンダリングによる確認
プレビュー機能を使用すると、実際に既存のホストに設定されている値を引用してどのような userdata になるかをレンダリングしてくれます。
もし対象ホストを変えたい場合は「プレビュー」横のプルダウンから変更しましょう。

なお、デフォルトのテンプレートをクローンする場合、Forman が自動で生成するためのスニペットが埋め込まれているので注意してください。例えば、以下のようなスニペットは netplan 設定を自動で生成し、ユーザが作成したテンプレートを上書きします。
<%= snippet 'preseed_netplan_setup' -%>
総論
以上のマクロや変数を使用することで、他の仕組みで動的に生成していた userdata も Foreman 単体で担えるようになります。特に、IP アドレスや MAC、ホスト名といったノード固有で変わる値も Foreman ホストの設定から取得できるのでかなり自由度は高いです。