概要
The Foreman はベアメタルサーバ、仮想サーバのプロビジョニングや構成を一括して管理できるオープンソースソフトウェアです。基本的にはベアメタルサーバを PXE ブートする際に必要となるコンポーネント(DHCP、TFTP、DNS など)を内包しつつ、ダッシュボードや API を備えているものと思っていただければよいと思います。
比較されるサービスとしては Canonical MaaS や OpenStack Ironic があると思いますが、RedHat Satellite の中身になっているソフトウェアでもあり、やや RedHat 系の OS とは親和性が高い作りになっていますが Ubuntu でも問題なく使用可能です。
それなりに歴史のあるソフトウェアだとは思うのですが、なぜかネット上に恐ろしいほど情報が無く、かつ MaaS などに比べると設定がなかなか複雑なので情報を残すことにしました。
Foreman の仕組み
基本的には以下の通りですが、特筆すべきは Smart Proxy(forman-proxy.service)と呼ばれるプロキシサービスです。

出典: https://theforeman.org/manuals/3.16/index.html
Foreman 自体はダッシュボード(UI)や各種機能、API を提供するもので、PXE ブートの中心となる DHCP や TFTP などは Foreman 自体が持っているというよりは外部の DHCP や TFTP を Smart Proxy が中継することで、包括的なサービスとして動かしているイメージです。
文字通り Foreman サーバとは全くのリモートに置いてもいいですし Foreman サーバと同居させることも可能ですが、今回は基本的に後者の同居パターンで構築していきます。
構成
今回は以下のような Foreman が動作するサーバ、PXE ブートによって自動構築するベアメタルサーバの 2 台、ネットワークも PXE 関連のパケットを流す NW のみと、最小構成の環境で試しました。
なお、検証には ESXi 上の VM を使用しています。
構築手順
1. Foreman のインストール
まずは以下の組み合わせで Foreman のインストーラーを VM 上にインストールしていきます。
なお v3.16 時点では Ubuntu 24.04 上へのインストールはパッケージ互換の問題で失敗します(公式にも非サポートです)。ご注意ください。
- Ubuntu 22.04.05 LTS
- Foreman 3.16
手順は公式に記載の通りです。
/* 要件である puppet の導入 */
root@foreman-test:~# apt-get -y install ca-certificates
root@foreman-test:/tmp# cd /tmp && wget https://apt.puppet.com/puppet8-release-jammy.deb
root@foreman-test:/tmp# apt-get install /tmp/puppet8-release-jammy.deb
/* foreman 導入 */
root@foreman-test:~# wget https://deb.theforeman.org/foreman.asc -O /etc/apt/trusted.gpg.d/foreman.asc
root@foreman-test:~# echo "deb http://deb.theforeman.org/ jammy 3.16" | sudo tee /etc/apt/sources.list.d/foreman.list
root@foreman-test:~# echo "deb http://deb.theforeman.org/ plugins 3.16" | sudo tee -a /etc/apt/sources.list.d/foreman.list
...
root@foreman-test:~# apt-get update && sudo apt-get -y install foreman-installer
...
続けてインストーラーを起動していきます。インストーラがホスト名を FQDN で解決できることを要求しますので、サンプルでも構わないので hostnamectl で設定しておきます。
root@foreman-test:~# hostnamectl set-hostname foreman-test.example.com
インストーラを起動します。前述のように今回の構成では Foreman 上で DHCP と TFTP を統合して動かしますので必要なオプションを指定します。
この時点で DHCP の IP レンジを指定する必要はありません。
root@foreman-test:~# foreman-installer \
--foreman-proxy-dns false \
--foreman-proxy-dhcp true \
--foreman-proxy-dhcp-provider isc \
--foreman-proxy-dhcp-managed true \
--foreman-proxy-dhcp-server=192.168.100.190 \
--foreman-proxy-dhcp-interface=ens160 \
--foreman-proxy-tftp true \
--foreman-proxy-tftp-managed true \
--foreman-proxy-tftp-servername=192.168.100.190
2025-10-07 11:03:12 [NOTICE] [root] Loading installer configuration. This will take some time.
2025-10-07 11:03:15 [NOTICE] [root] Running installer with log based terminal output at level NOTICE.
2025-10-07 11:03:15 [NOTICE] [root] Use -l to set the terminal output log level to ERROR, WARN, NOTICE, INFO, or DEBUG. See --full-help for definitions.
2025-10-07 11:03:16 [NOTICE] [checks] System checks passed
2025-10-07 11:03:17 [NOTICE] [configure] Starting system configuration.
2025-10-07 11:06:02 [NOTICE] [configure] 250 configuration steps out of 1344 steps complete.
2025-10-07 11:06:28 [NOTICE] [configure] 500 configuration steps out of 1346 steps complete.
2025-10-07 11:06:44 [NOTICE] [configure] 750 configuration steps out of 1478 steps complete.
2025-10-07 11:06:47 [NOTICE] [configure] 1000 configuration steps out of 1504 steps complete.
2025-10-07 11:06:49 [NOTICE] [configure] 1250 configuration steps out of 1504 steps complete.
2025-10-07 11:08:21 [NOTICE] [configure] 1500 configuration steps out of 1504 steps complete.
2025-10-07 11:08:27 [NOTICE] [configure] System configuration has finished.
Executing: foreman-rake upgrade:run
Success!
* Foreman is running at https://foreman-test.example.com
Initial credentials are admin / ***************
* Foreman Proxy is running at https://foreman-test.example.com:8443
The full log is at /var/log/foreman-installer/foreman.log
成功するとエンドポイント、admin のパスワードが表示されますので記載の通りアクセスしてください。

オプション説明
参考までに、指定しているオプションは以下のような内容となります。
| オプション | 値 | 内容 |
|---|---|---|
--foreman-proxy-dns |
false |
Foreman の DNS 機能を無効化する。設定が複雑でめんどくさく、今回は自前で DNS を用意するため無効。 |
--foreman-proxy-dhcp |
true |
Foreman の DHCP 機能を有効化する。今回は PXE ブート時の IP アドレスを配布する目的として使用する。 |
--foreman-proxy-dhcp-range |
"xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy" |
PXE ブート用の NW で DHCP として配布する IP アドレスのレンジ。ここで指定すると dhcpd.conf に反映されますが、のちのサブネット構成で個別にリースを払い出すのでここで設定は不要。 |
--foreman-proxy-dhcp-server |
192.168.100.190 |
DHCP サーバアドレス。Foreman サーバの IP と同じだが、PXE ネットワークからアクセスされることに注意。 |
--foreman-proxy-dhcp-interface |
ens160 |
PXE ネットワークの IF を指定。 |
--foreman-proxy-tftp |
true |
Foreman の TFTP 機能を有効にする。 |
--foreman-proxy-tftp-servername |
192.168.100.190 |
TFTP サーバアドレス。Foreman サーバの IP と同じだが、PXE ネットワークからアクセスされることに注意。 |
Smart Proxy 確認
[インフラストラクチャー] > [Smart Proxy] にて、Smart Proxy で有効になっている機能を確認しておきます。ここでは DHCP TFTP が有効になっていれば問題ありません。

2. DNS 設定
前述の手順で Foreman 自身の DNS 機能を無効化しました。
PXE ブートのシーケンス中には Foreman サーバ自体の名前解決(FQDN)を(cloud-init によって構築されるクライアント側から)求められますので、簡易的な DNS を構築しておきます。ここでは dnsmasq を利用します。
root@foreman-test:~# apt install dnsmasq
...
root@foreman-test:~# vim /etc/dnsmasq.d/local.conf
listen-address=192.168.100.190
bind-interfaces
address=/foreman-test.example.com/192.168.100.190
root@foreman-test:~# systemctl restart dnsmasq
root@foreman-test:~# systemctl enable dnsmasq
以下のようなコマンドでテストして、正常に名前解決できていれば問題ありません。
root@foreman-test:~# dig @192.168.100.190 foreman-test.example.com
3. (Optional)既知問題への対処
Ubuntu22.04 に標準インストールされている ISC DHCP には既知問題があるようなので、のちのインタフェース設定の際にエラーになります。
root@foreman-test:~# apt list --installed | grep isc-dhcp-serve
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
isc-dhcp-server/jammy-updates,now 4.4.1-2.3ubuntu2.4 amd64 [installed]
この対処として 4.4.1 を Upstream の最新版に入れ替えます。
root@foreman-test:~# apt-get install libbind-dev
root@foreman-test:~# systemctl stop isc-dhcp-server
root@foreman-test:~# apt-mark hold isc-dhcp-server
root@foreman-test:~# git clone https://github.com/isc-projects/dhcp.git && cd dhcp
root@foreman-test:~/dhcp# ./configure --enable-paranoia
root@foreman-test:~/dhcp# make
root@foreman-test:~/dhcp# make install
root@foreman-test:~/dhcp# sed -i "s/ exec.*/ exec dhcpd -user dhcpd -group dhcpd -f -4 -pf \/run\/dhcp-server\/dhcpd.pid -lf \/var\/lib\/dhcp\/dhcpd.leases -cf \$CONFIG_FILE \$INTERFACESv4'/g" /usr/lib/systemd/system/isc-dhcp-server.service
root@foreman-test:~/dhcp# systemctl daemon-reload
root@foreman-test:~/dhcp# systemctl start isc-dhcp-serve
4. インストールメディアの作成
Foreman はインストールに使用する ISO をミラー参照することができますが、ローカルに置いておいた方が確実に利便性があるため、インストールメディアを作成していきます。
まずは Foreman サーバに SSH ログインし、公式から ISO をダウンロードします。今回は Ubuntu 24.04.03 LTS を使用します。
root@foreman-test:~# cd /tmp
root@foreman-test:/tmp# wget https://releases.ubuntu.com/24.04.3/ubuntu-24.04.3-live-server-amd64.iso
...
以下の通り、HTTP で公開できる場所に ISO をコピーしつつ、中身を配置します。Foreman には Apache2 が内包されているので、特にウェブサービス追加は不要です。
root@foreman-test:/tmp# mount ubuntu-24.04.3-live-server-amd64.iso /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
root@foreman-test:/tmp# mkdir -p /usr/share/foreman/public/pub/installation_media/ubuntu/24.04.3-x86_64/
root@foreman-test:/tmp# cp ubuntu-24.04.3-live-server-amd64.iso /usr/share/foreman/public/pub/installation_media/ubuntu/24.04.3-x86_64.iso
root@foreman-test:/tmp# cp -a /mnt/* /usr/share/foreman/public/pub/installation_media/ubuntu/24.04.3-x86_64/
/* amd64 向けのシンボリックリンク作成 */
root@foreman-test:~# cd /usr/share/foreman/public/pub/installation_media/ubuntu
root@foreman-test:/usr/share/foreman/public/pub/installation_media/ubuntu# ln -s 24.04.3-x86_64 24.04.3-amd64
root@foreman-test:/usr/share/foreman/public/pub/installation_media/ubuntu# ln -s 24.04.3-x86_64.iso 24.04.3-amd64.iso
/* 確認 */
root@foreman-test:~# ls -l /usr/share/foreman/public/pub/installation_media/ubuntu
total 3226036
drwxr-xr-x 3 root root 4096 Oct 9 03:52 ./
drwxr-xr-x 3 root root 4096 Oct 9 03:28 ../
lrwxrwxrwx 1 root root 14 Oct 9 03:48 24.04.3-amd64 -> 24.04.3-x86_64/
lrwxrwxrwx 1 root root 18 Oct 9 03:52 24.04.3-amd64.iso -> 24.04.3-x86_64.iso
drwxr-xr-x 8 root root 4096 Oct 9 03:48 24.04.3-x86_64/
-rw-r--r-- 1 root root 3303444480 Oct 9 03:28 24.04.3-x86_64.iso
/* 不要なので削除 */
root@foreman-test:~# cd /tmp
root@foreman-test:/tmp# umount /mnt
root@foreman-test:/tmp# rm -rf ubuntu-24.04.3-live-server-amd64.iso
ISO が展開出来たら、http://xxx.xxx.xxx.xxx/pub/installation_media/ubuntu/24.04.3-x86_64 をインストールメディアとして指定します。
[ホスト] > [プロビジョニング設定] > [インストールメディア] から新規メディアを作成し、以下のように指定します。
| 項目 | 値 | 備考 |
|---|---|---|
| 名前 | Ubuntu 24.04.03LTS |
- |
| パス | http://192.168.100.190/pub/installation_media/ubuntu/$major.$minor-$arch |
IP は PXE 用レンジのもの |
| オペレーティングシステムファミリー | Debian |
- |
試しに ISO がダウンロードできることを確認しておきましょう。
root@foreman-test:~# curl --output /dev/null http://192.168.100.190/pub/installation_media/ubuntu/24.04.3-x86_64.iso
5. オペレーティングシステムの作成
[ホスト] > [プロビジョニング設定] > [オペレーティングシステム] を選択し、オペレーティングシステムを新規に作成します。
オペレーティングシステム タブ
| 項目 | 値 |
|---|---|
| 名前 | Ubuntu |
| メジャーバージョン | 24.04 |
| マイナーバージョン | 3 |
| 説明 | Ubuntu 24.04.3 LTS |
| ファミリー | Debian |
| リリース名 | noble |
| root パスワードのハッシュ | SHA512 |
| アーキテクチャー |
x86_64 を選択 |
パーティションテーブル タブ
Preseed default autoinstall を選択。
インストールメディア タブ
先ほど作成した Ubuntu 24.04.03LTS を選択。
テンプレートタブ
後ほど設定するので無指定で構いません。
6. プロビジョニングテンプレートの紐づけ
[ホスト] > [テンプレート] > [プロビジョニングテンプレート] からプロビジョニングテンプレートを紐づけていきます。
それぞれ
Preseed Autoinstall cloud-init user dataPreseed default PXELinux AutoinstallPreseed default finish
を選択し、「関連付け」のタブで作成したオペレーティングシステムであるUbuntu 24.04.3 LTS を選択します。
プロビジョニングテンプレートをオペレーティングシステムに指定する
プロビジョニングテンプレートを設定したら再度 [ホスト] > [プロビジョニング設定] > [オペレーティングシステム] に戻り、「テンプレート」のタブで先ほど紐づけたプロビジョニングテンプレートを設定します。
※ プルダウンでそれぞれ選べるようになっているはずです。
7. ネットワークの設定
[インフラストラクチャ] > [サブネット] から新規にサブネットを作成していきます。
サブネット タブ
PXE 用の サブネット
| 項目 | 値 | 備考 |
|---|---|---|
| 名前 | Provisioning NW |
- |
| プロトコル | IPv4 |
- |
| ネットワークアドレス | 192.168.100.0 |
- |
| ネットワークプレフィックス | 24 |
- |
| ゲートウェイアドレス | 空欄 | - |
| IPAM | DHCP | - |
| 開始アドレス | 192.168.100.50 |
ホスト作成時にこのレンジから払い出される |
| 終了アドレス | 192.168.100.160 |
ホスト作成時にこのレンジから払い出される |
| ブートモード | DHCP | - |
ドメイン タブ
example.com を選択。
プロキシー タブ
| 項目 | 値 |
|---|---|
| DHCP プロキシー | foreman-test.example.com |
| TFTP プロキシー | foreman-test.example.com |
8. ホストグループ設定
[設定] > [ホストグループ] から新規にホストグループを作成していきます。
ホストグループ タブ
| 項目 | 値 |
|---|---|
| 名前 | Test Host Group |
| Environment | production |
ネットワーク タブ
| 項目 | 値 |
|---|---|
| ドメイン | example.com |
| IPv4 サブネット | Provisioning NW |
オペレーティングシステム タブ
| 項目 | 値 |
|---|---|
| アーキテクチャー | x86_64 |
| オペレーティングシステム | Ubuntu 24.04.3 LTS |
| メディア | Ubuntu 24.04.03LTS |
| パーティションテーブル | Preseed default autoinstall |
| PXE ローダー | PXELinux BIOS |
| Root パスワード | 任意の値 |
9. ホストの作成
それでは、[設定] > [ホスト] > [ホストの作成] から新規のホストを作成していきます。
ホスト タブ
| 項目 | 値 |
|---|---|
| 名前 | 任意のサーバ名 |
| ホストグループ | Test Host Group |
オペレーティングシステム タブ
| 項目 | 値 |
|---|---|
| アーキテクチャー | x86_64 |
| オペレーティングシステム | Ubuntu 24.04.3 LTS |
| ビルド | チェックを入れる |
| メディア | Ubuntu 24.04.03LTS |
| パーティションテーブル | Preseed default autoinstall |
| PXE ローダー | PXELinux BIOS |
インターフェイス タブ
デフォルトでは一つのインタフェースが存在しています。
PXE に使用するインタフェースのアクションの [編集] タブを押下します。

| 項目 | 値 | 備考 |
|---|---|---|
| Type | インタフェース | - |
| MACアドレス | 対象ホストの PXE インタフェースの MAC アドレス | - |
| ドメイン | example.com |
- |
| IPv4 サブネット | Provisioning NW |
- |
| IPv4 アドレス | xxx.xxx.xxx.xxx |
サブネットで指定したレンジから自動入力されるはずです |
| 管理 | チェックを入れる | - |
| プライマリー | チェックを入れる | - |
| プロビジョン | チェックを入れる | - |
なお、この時点で内部的には /var/lib/dhcp/dhcpd.leases に DHCP エントリが追加されています。
server-duid "\000\001\000\0010\214\305\270\000\014)M\366\216";
host xxxxx.example.com {
dynamic;
hardware ethernet 00:0c:29:fa:f3:6a;
fixed-address 192.168.100.xxx;
supersede server.filename = "pxelinux.0";
supersede server.next-server = c0:a8:64:be;
supersede host-name = "xxxx.example.com";
}
また、このタイミングで EFR12-6899 [ProxyAPI::ProxyException] エラーが出る場合、前述の ISC DHCP 不具合を踏んでいると思われますので、パッケージの更新を実施してください。

設定確認
以上を完了したらサブミットします。問題なければ「すべてのステータスが OK です」となるはずです。

なお、ここでは「ビルド」と称される処理が実施されており、Foreman 上で自動的に PXE ブートに必要なファイルが生成されています。
root@foreman-test:~# ls -l /srv/tftp/pxelinux.cfg/
total 8
-rw-r--r-- 1 foreman-proxy foreman-proxy 558 Oct 9 07:29 01-00-0c-29-7b-97-48
-rw-r--r-- 1 foreman-proxy foreman-proxy 83 Oct 9 07:29 01-00-0c-29-7b-97-48.ipxe
root@foreman-test:~# ls -l /srv/tftp/boot
total 87164
-rw-r--r-- 1 foreman-proxy foreman-proxy 74245462 Aug 5 17:19 ubuntu-24-04-03lts-iiPJpXbYazNa-initrd
-rw-r--r-- 1 foreman-proxy foreman-proxy 15006088 Aug 5 17:19 ubuntu-24-04-03lts-iiPJpXbYazNa-vmlinuz
また、cloud-init での構築に必要な userdata はサーバ上にファイルの実態としては作成されません。
クライアントから HTTP 要求があったときに Foreman 側がテンプレートからレンダリングして返却する仕組みになっています。
10. PXE ブートの実施
ここまで来たら、構築を行うサーバ側で PXE ブートを実施します。起動後、DHCP から IP アドレスの取得、OS の起動、cloud-init による userdata の構築までが自動で実施され、Ubuntu が起動してくれば成功です。

まとめ
Foreman を使用して Ubuntu の自動構築環境を試すことができました。
あまりにも情報が無かったため ... ここまででもだいぶ苦労しましたが、他にも Ansible との連携などいろいろな機能がありそうなので、今後もいろいろ試してみようと思います。

